目录
一、任务创建与删除
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 |

最低0.47元/天 解锁文章
3656





