FreeRTOS任务基础知识
- 1.FreeRTOS任务特性
- 2.FreeRTOS的任务状态
- 3.任务优先级
- 4.任务调度方式
- 5.任务控制块
- 6.任务堆栈
1.FreeRTOS任务特性
特性1:任务数量没有限制,想要创建多少个任务都可以
特性2:高优先级可以抢占低优先级任务
特性3:每个任务都有一个堆栈,堆栈导致了RAM使用增大
特性4:由于抢占,则必须考虑重新进入原任务的问题
2.FreeRTOS的任务状态
FreeRTOS的任务有四种状态,分别为:运行态、就绪态、阻塞态、挂起态。
运行态:即任务正在运行
就绪态:任务处于就绪状态,可以运行
阻塞态:一个任务因延时一段时间或等待外部事件发生,那么这个任务就处于阻塞态(如果一个任务没有阻塞态,那么这个任务可能会一直执行。)
挂起态:任务处于挂起状态,暂停运行,一般通过vTaskSuspend()函数进入挂起态,通过vTaskResums()函数解除挂起态。
3.任务优先级
每一个任务都被分配一个0~(configMAX_PRIORITIES-1)的任务优先级
configMAX_PRIORITIES为FreeRTOSConfig.h中定义的宏。
FreeRTOS任务的优先级与数字是成正比的,数字越大,优先级越高,同一优先级下可以有多个任务。
0是最低的优先级,而configMAX_PRIORITIES-1是最高优先级
4.任务调度方式
FreeRTOS 一共支持三种任务调度方式,分别为抢占式调度、时间片调度和协程式调度。
其中协程式调度,FreeRTOS官方已经不再开发。
抢占式调度
抢占式调度主要时针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务,只有当优先级高的任务发生阻塞或者被挂起,低优先级的任务才可以运行。(正点原子FreeRTOS开发手册内容)
时间片调度
时间片调度主要针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会在每一次系统时钟节拍到的时候切换任务,也就是说 CPU 轮流运行优先级相同的任务,每个任务运行的时间就是一个系统时钟节拍。(正点原子FreeRTOS开发手册内容)
5.任务控制块
FreeRTOS 中的每一个已创建任务都包含一个任务控制块,任务控制块是一个结构体变量,FreeRTOS 用任务控制块结构体存储任务的属性。
其具体位置位于tasks.c的255行到332行
FreeRTOS 的任务控制块结构体中包含了很多成员变量,但是,大部分的成员变量都是可以通过 FreeRTOSConfig.h 配置文件中的配置项宏定义进行裁剪的。(条件编译下的成员变量)
6.任务堆栈
任务堆栈有一个重要作用就是使被打断的任务正常恢复
在任务调度器进行任务切换时,会把当前任务CPU寄存器的值保存下来,保证等到再次运行此任务时从上次中断的地方继续运行。
创建任务的时候需要给任务指定堆栈,如果使用动态方法创建任务(xTaskCreate()函数)则堆栈会由函数自动创建。如果使用函数xTaskCreateStatic()(静态方法)的话就需要自行定义任务堆栈。
任务堆栈的数据类型为StackType_t在portmacro.h中有定义
由上可以看出,StackType_t本质上是uint_32,则StackType_t类型的变量为4字节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)