FreeRTOS任务特性:
- 简单;
- 没有使用限制;
- 支持抢占;
- 支持优先级;
- 每个任务都有堆栈,但也导致了RAM使用量增大;
-
如果使用强化在哪的话必须仔细考虑重入的问题;
协程
-
FreeRTOS的协程已经不再更新维护,不用考虑了;
FreeRTOS任务状态
- 运行态
- 就绪态
- 阻塞态
- 挂起态 任务优先级
- 任务优先级决定了任务的执行优先级别,在FreeRTOS中任务优先级可选范围为:
- 0~configMAX_PRIORITIES-1 //这是个宏定义,这个宏表示最大优先级
- 数字越大,优先级越高
- 在“FreeRTOSConfig.h”文件中,有这个宏,但是这个宏不是说最大优先级的数量有32,而是说最大优先级共有32级,真正的级数是0-31。
- 同一优先级下可以有多个任务
- 在创建任务时,需要指定这个任务的任务优先级。
任务实现
任务实现如图所示,用户自己的代码就写在死循环中即可。
-
需要注意的是,每个任务的死循环中需要一个可以引起任务调度的函数,就是那个第四步的函数:“vTaskDelay();”。
一般任务创建后我们是不会退出的,但如果要退出,需要执行第5步中的函数:“vTaskDelete(NULL);”
任务控制块
- 每个任务都会有一些属性,我们需要对其进行一些描述,好让系统知道关于这个任务的一些属性,比如这个任务的任务名字、任务堆栈、优先级等等,所以就需要任务控制块这个数据结构了。
-
任务控制详情在“tasks.c”里面。
任务堆栈
- 注意,任务堆栈大小共占多少字节是:“128*4=512”字节,不是128字节,如上图所示。
- 任务堆栈的大小根据任务实际情况来调整。
- 如果在调试国策怀念高中出现程序卡死,基本就是任务堆栈大小没有设定好,比如你如果在一个任务中申请了一个数组,这就比较大了,此时就要根据实际情况把任务堆栈设定的大点。