2.3 RTOS下的任务管理(***)
RTOS的任务管理主要是进行哪些功能?
RTOS的任务管理的多任务管理是怎样进行与实现的?
任务管理中FreeRTOS如何给每个任务分配CPU时间?
文章目录
2.3.0 任务概述
任务管理算是FreeRTOS中核心以及重点内容。简而言之,后续代码移植嫁接便是在任务管理的基础上进行的。对于任务管理的重中之重则是在于多任务管理。任务具有一系列状态以及优先级(Priority)等相关属性。任务的一系列相关数据是在栈中保存的,多个任务之间的协作处理[^231]称之为任务调度(即CPU按照某种算法策略进行不同任务间的切换)。
任务即需要完成的一件件功能,也称之为“线程(thread)”,需要注意的RTOS中一个完整的任务由任务栈(Stack)+任务控制块(TCB)组成。
任务的几大相关状态:
- 运行态
- 非运行态:
- 就绪态(ready)
- 阻塞(blocked)
- 挂起(suspended)
2.3.1任务的创建与删除
RTOS任务相关的函数有哪些?怎样创建任务
在RTOS中任务的本质即一个函数,其这个函数不能有返回,一个任务式的函数通常如下:
- 其传递的形参通常为指针类型
- 各自任务存在各自栈的备份(副本)
void ATaskFunction( void *pvParameters )
{
/* 对于不同的任务,局部变量放在任务的栈里,有各自的副本 */
int32_t lVariableExample = 0;
/* 任务函数通常实现为一个无限循环 */
for( ;; )
{
/* 任务的代码 */
}
/* 如果程序从循环中退出,一定要使用vTaskDelete删除自己
* NULL表示删除的是自己
*/
vTaskDelete( NULL );
/* 程序不会执行到这里, 如果执行到这里就出错了 */
}
RTOS进行任务创建时主要有两种函数:
-
动态分配内存创建相关结构体
/** *@return:成功则返回相关pass */ BaseType_t xTaskCreate( /*函数指针,也就是任务体*/ TaskFunction_t pxTaskCode, /*任务名*/ const char * const pcName, /*设置任务栈大小,单位为word(字),一个字占4个字节,大多时候估计方法,精确值的话看反汇编*/ const configSTACK_DEPTH_TYPE usStackDepth, /*调用pvTaskCode(任务函数)是用到的参数 ,并将相关参数传送到对应的任务函数指针中*/ void * const pvParameters,