嵌入式FreeRTOS学习笔记(2026.10.07)
发布时间:2026/10/8 13:30:51 作者:尧图编辑部 阅读量:1,286
)
一、vTaskDelayUntil函数 vTaskDelayUntil(xtStart, 20)效果在xtStart时刻起延时任务20个tick并更新xtStart时间为 xtStart 20 。即t₁时刻延时20tick令t₂为新值。二、空闲任务与空闲钩子1. 任务自杀、他杀、被杀不会主动释放内存空间释放内存空间由空闲任务完成。2. 空闲任务的优先级为0。3. RTOS优先级越大优先级越高前提高优先级任务持续就绪永不阻塞当任务优先级大于空闲任务时空闲任务得不到CPU便不会释放空间造成内存泄漏。4. 当任务优先级大于空闲任务若想释放空间可通过延时函数 vTaskDelay() 阻塞任务让出CPU才能执行空闲任务和空闲钩子。5. 空闲钩子想要在空闲任务执行自己的代码才会使用。空闲钩子是空闲任务的回调函数。6. 前提开启抢占模式(configUSE_PREEMPTION1)且开启时间片轮转空闲任务和任务优先级相同通过时间片轮转执行任务、释放空间和空闲钩子。任务有延时时间片执行稳定任务没有延时时间片执行不稳定7. 空闲任务不需要自己创建在启动调度器便会自动创建使用空闲钩子需要将宏 configUSE_IDLE_HOOK 置1并自行实现 vApplicationIdleHook 回调函数。三、调度配置项① configUSE_PREEMPTION 是否允许抢占② configUSE_TIME_SLICING 是否允许时间片轮转③ configUSE_MUTEXES 配套 configUSE_SHOULD_YIELD 互斥锁相关不是控制空闲任务让步此处互斥锁还没有学习简单理解为空闲任务让步四、抢占/禁止抢占规则1. 前提禁止抢占模式configUSE_PREEMPTION0新版FreeRTOS禁止抢占时调度挑选任务优先选就绪队列里高优先级任务任务运行中途不会被任何就绪任务打断。若当前运行任务被延时进入阻塞状态让出CPU调度重新挑选就绪队列中优先级高同等优先级时按顺序的任务执行。新版FreeRTOS禁止抢占模式下时间片轮转功能失效同优先级任务不会依靠Tick自动切换。五、任务执行场景1. Task3(3)、Task1(1)、Task2(1)注中的数字代表优先级前提允许抢占禁止/允许时间片轮转的情况下只要高优先级任务不被阻塞结果高优先级一直执行。2. 前提允许抢占开启时间片轮转高优先级在执行过程中被阻塞在被阻塞期间Task1、Task2同低优先级按时间片轮流执行高优先级阻塞到期就绪后会立刻抢占当前正在运行的低优先级任务。3. 时间片轮转前提抢占模式打开只发生在同优先级就绪任务之间。4. 如果存在两个同优先级的低优先级任务和一个高优先级任务无阻塞、无延时无论时间片轮转是否开启结果都是一直执行高优先级任务。5. 空闲钩子可以调用 taskYIELD() 让步但工程一般不推荐严禁调用任何会造成阻塞的FreeRTOS API。总结时间片轮转是抢占模式下多个同优先级就绪任务平分CPU时间的调度机制。禁止抢占模式Tick不会自动触发同优先级任务切换时间片轮转失效。