FreeRTOS 快速入门(三)之任务管理


一、任务创建与删除

1、什么是任务

在 FreeRTOS 中,任务就是一个函数,原型如下:

void ATaskFunction(void *pvParameters);

要注意的是,函数内部,尽量使用局部变量。因为每个任务都有自己的栈,每个任务运行这个函数时,任务 A 的局部变量放在任务 A 的栈里、任务 B 的局部变量放在任务 B 的栈里。不同任务的局部变量,有自己的副本。函数使用全局变量、静态变量的话,只有一个副本:多个任务使用的是同一个副本。

如下例:

void ATaskFunction(void *pvParameters)
{
   
   
	/* 对于不同的任务,局部变量放在任务的栈里,有各自的副本 */
	int32_t lVariableExample = 0;

	/* 任务函数通常实现为一个无限循环 */
	for( ;; )
	{
   
   
		/* 任务的代码 */
	}

	/* 如果程序从循环中退出,一定要使用 vTaskDelete 删除自己
	 * NULL 表示删除的是自己
	 */
	vTaskDelete( NULL );

	/* 程序不会执行到这里, 如果执行到这里就出错了 */
}

2、创建任务

创建任务时使用的函数如下:

/**
  * @brief  动态分配内存创建任务函数
  * @param  pvTaskCode:任务函数
  * @param  pcName:任务名称,单纯用于辅助调试
  * @param  usStackDepth:任务栈深度,单位为字(word)
  * @param  pvParameters:任务参数
  * @param  uxPriority:任务优先级
  * @param  pxCreatedTask:任务句柄,可通过该句柄进行删除/挂起任务等操作
  * @retval pdTRUE:创建成功,errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY:内存不足创建失败
  */
BaseType_t xTaskCreate(TaskFunction_t pvTaskCode,
					   const char * const pcName,
					   unsigned short usStackDepth,
					   void *pvParameters,
					   UBaseType_t uxPriority,
					   TaskHandle_t *pxCreatedTask);
 
/**
  * @brief  静态分配内存创建任务函数
  * @param  pvTaskCode:任务函数
  * @param  pcName:任务名称
  * @param  usStackDepth:任务栈深度,单位为字(word)
  * @param  pvParameters:任务参数
  * @param  uxPriority:任务优先级
  * @param  puxStackBuffer:任务栈空间数组
  * @param  pxTaskBuffer:任务控制块存储空间
  * @retval 创建成功的任务句柄
  */
TaskHandle_t xTaskCreateStatic(TaskFunction_t pvTaskCode,
							   const char * const pcName,
							   uint32_t ulStackDepth,
							   void *pvParameters,
							   UBaseType_t uxPriority,
							   StackType_t * const puxStackBuffer,
							   StaticTask_t * const pxTaskBuffer);

上述两个任务创建函数有如下几点不同,之后如无特殊需要将一律使用动态分配内存的方式创建任务或其他实例

  • xTaskCreateStatic 创建任务时需要用户指定任务栈空间数组和任务控制块的存储空间,而 xTaskCreate 创建任务其存储空间被动态分配,无需用户指定
  • xTaskCreateStatic 创建任务函数的返回值为成功创建的任务句柄,而 xTaskCreate 成功创建任务的句柄需要以参数形式提前定义并指定,同时其函数返回值仅表示任务创建成功/失败

参数说明:

参数 描述
pvTaskCode 函数指针,可以简单地认为任务就是一个 C 函数。
它稍微特殊一点:永远不退出,或者退出时要调用"vTaskDelete(NULL)"
pcName 任务的名字,FreeRTOS 内部不使用它,仅仅起调试作用。
长度为:configMAX_TASK_NAME_LEN
usStackDepth 每个任务都有自己的栈,这里指定栈大小。
单位是 word,比如传入 100,表示栈大小为 100 word,也就是 400 字节。
最大值为 uint16_t 的最大值。
怎么确定栈的大小,并不容易,很多时候是估计。
精确的办法是看反汇编码。
pvParameters 调用 pvTaskCode 函数指针时用到:pvTaskCode(pvParameters)
uxPriority 优先级范围:0~(configMAX_PRIORITIES – 1)
数值越小优先级越低,
如果传入过大的值,xTaskCreate 会把它调整为(configMAX_PRIORITIES – 1)
pxCreatedTask 用来保存 xTaskCreate 的输出结果:task handle。
以后如果想操作这个任务,比如修改它的优先级,就需要这个 handle。
如果不想使用该 handle,可以传入 NULL。
返回值 成功:pdPASS;
失败:errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY(失败原因只有内存不足)
注意:文档里都说失败时返回值是 pdFAIL,这不对。
pdFAIL 是 0,errCOULD_NOT_ALLOCATE_REQUIR
评论 25
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值