freertos-入门:整理笔记
任务创建
动态创建:vTaskCreate()。参数:任务函数、命名、堆大小、任务函数参数(没有的话为NULL)、优先级(越大优先级越高)。动态创建只需传入堆的大小,自动分配地址,内部自动生成TCB结构体,该结构体用来初始化任务的一些属性参数。
静态创建:vTaskCreateStatic()。参数:任务函数、命名、堆大小、任务函数参数(没有的话为NULL)、优先级(越大优先级越高)。静态创建需要传入堆的地址,需要自己先生成staticTCB结构体,且先启动开关(文件:FreeRTOSConfig.h---宏定义:configSUPPORT_STATIC_ALLOCATION == 1),且该函数调用到下面的函数,需要定义
任务状态理论
rtos本质就是多线程运行,配置的切换时间(文件:FreeRTOSConfig.h---宏定义:configTICK_RATE_HZ),当任务运行设置好的时间后,由中断进行决定切换;切换时要对任务的状态进行确认。任务的状态一共有四种:运行(run)、准备(ready)、阻塞(blocked)、暂停或休息(suspended)
命令函数:vTaskSuspend()、vTaskResume()
延时: vTaskDelay
从Delay开始计时,直到计时结束
vTaskDelayUntil
从任务开始计时,直到计时结束
简单来说就是Delay的计时是从调用vTaskDelay开始,不包括任务本身执行时长,所以从任务开始到计时结束的时长是不确定的,同时取决于任务处理时间和延时时间;而DelayUntil的计时从任务开始到计时结束,计时本身包含了任务执行时长,所以整个任务的总时长是确定的,只取决于延时时间的设置
任务删除:
vTaskDelete():传入参数为想要删除的任务句柄,或传入为NULL时为自杀,删除任务后,空闲任务会清理内存,假如有其他高优先级一直抢占使得空闲任务无法执行,则无法清理内存
钩子函数
有些功能或事情需要空闲任务进行执行,在不破坏官方核心代码的情况下,让空闲任务运行我们定义的一些事务,空闲任务中有一个钩子函数,我们可以将事务写在里面,空闲任务会自动调用钩子函数(打开的情况下)。在空闲任务函数tasks.c---portTASK_FUNCTION()下有vApplicationIdleHook()函数,这就是钩子函数。
配置:
首先打开钩子函数功能:文件:FreeRTOSConfig.h---宏定义:configUSE_IDLE_HOOK 定义为1时,打开
然后为了不破坏官方核心代码,重定义钩子函数vApplicationIdleHook()
任务调度策略:
1. 是否允许抢占
即任务的运行调度是否根据优先级来抢占,如果允许抢占,则当优先级高的任务就绪(ready)时,立马被优先级高的任务抢占运行(run);而不允许抢占时,即使优先级高的任务就绪时,当优先级低的任务还在运行着不会被抢占
配置:
文件:FreeRTOSConfig.h---宏定义:configUSE_PREEMPTION 当定义为1时,允许抢占,当定义为0时,不允许抢占
2. 允许抢占时,是否允许时间片轮转
即相同优先级的任务是否根据时间片进行轮流运行,如果允许轮流,则每个任务运行相同时间段后交替,如果不允许,则单个任务运行到被高优先级抢占为止,且当下一次高优先级让出回到低优先级时,优先让先前未运行的任务
配置:
文件:FreeRTOSConfig.h---宏定义:configUSE_TIME_SLICING 当定义为1时,允许轮转,当定义为0时,不允许轮转
3. 空闲任务是否让步
当存在任务的优先级和空闲任务一致(一般为0),此时可以决定空闲任务是否和普通任务一样进行交替调度,如果让步,则空闲任务为其他任务让步;如果不让步,则空闲任务和普通任务一起交替调度。其原理为空闲任务中有判断field定义的语句,如图
配置:
文件:FreeRTOSConfig.h---宏定义:configIDLE_SHOULD_YIELD 当定义为1时,空闲任务让步,当定义为0时,空闲任务不让步
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通