资讯动态

尚硅谷freertos基础知识笔记

发布时间:2026/8/13 18:20:31 来源:尧图企业网站定制
实时操作系统freertos多任务处理、调度开源、免费、轻量适合受限的嵌入式系统不占用过多内存和处理器资源、应用广泛、可移植性强0.1实时任务或实现一个功能的线程必须在给定时间内完成。1.1单核处理器一次只能执行一项任务多任务如何并行执行多任务操作系统通过人物之间的快速切换制造并发执行的假象1.2快速切换过程中某一时刻执行哪个任务呢由操作系统中的任务调度器决定1.3调度器的调度策略freertos默认使用固定优先级的抢占式调度策略同等优先级的任务执行时间片轮询调度抢占式调度允许更高优先级的任务在任何时刻抢占正在执行的低优先级的任务高优先级不会一直执行当高优先级任务等待某个资源时延时或等待信号量等无法执行了调度器会选择执行其他就绪中的高优先级任务时间片轮询同优先级任务轮流执行一片时间tick时间节拍时间到了切换下一个任务公平分配CPU时间任务执行不足一个时间片就完成了或阻塞时会立即切换到其它任务和执行1.4.1freertos中任务的4种状态·运行态单核处理器同一时间仅一任务处于运行态·就绪态·阻塞态任务在等待延时或外部事件·挂起态相当于暂停调用vTaskSuspend()挂起调用vTaskResume()解挂进入就绪注只有就绪态能转变运行态想运行要先转换成就绪态1.4.2 多任务状态列表运行态之外的三种任务状态都有任务状态列表·就绪列表pxReadyTaskLists[x],x表示任务优先级·阻塞列表pxDelayedTaskList·挂起列表xSuspendedTaskList调度器就在就绪列表中找最高优先级的任务来执行1.5 freertos的时间参照Freertos实时内核通过滴答计数变量测量时间Systick允许实时内核以所选择的定时器中断频率的分辨率来测量时间在滴答ISR(中断服务例程)期间唤醒或解除阻塞的任务的优先级可能高于被中断任务的优先级注标准Freertos中Systick为最低优先级stm32HAL库中可能需要适当提高优先级避免HAL库在中断中“忙等”时因SysTick无法递增而导致死锁中断中调用了HAL_Delay而delay用到的Systick的优先级又低于该中断导致在中断中卡死死锁两个或多个任务互相等待对方释放资源导致大家都永久阻塞的现象1.6.1 上下文切换当一个任务执行时它会利用 处理器/微控制器寄存器并像其它程序一样访问RAM和ROM,这些资源一起组成了任务执行上下文。什么意思呢就是假设任务A在执行过程中到某一行代码了需要切换成另一个任务B进行执行之后再回到A执行,A被挂起了那过程中我们希望任务A恢复执行时的状态能和切换前最后一刻的保持不变对吧否则由于中间B任务的执行可能会造成A的数据或里面的状态被改变/丢失所以任务在恢复时必须有一个与挂起之前相同的上下文通过在任务挂起时保存任务的上下文操作系统内核负责确保上下文保持不变。任务恢复时保存的上下文在执行之前由操作系统内核恢复。保存被挂起的任务的上下文和恢复被恢复任务的上下文的过程就是上下文切换。保存上下文在相应的处理器寄存器中的上下文局部变量、函数调用信息、CPU寄存器的值保存到其任务堆栈中每个任务都有自己的任务堆栈1.6.2 上下文切换的时机很好理解要切换任务的时候就需要进行上下文切换谁来执行切换PendSV异常为什么用PendSV不直接写个函数切换PendSV为最低中断优先级可以手动触发且可以在其它更高中断优先级的ISR中进行设置。直接用函数切换会破坏Cortex-M内核异常处理机制PendSV的中断优先级是最低中的最低即同等最低优先级中它抢断不了其它任何中断但能被抢断达到一个延迟执行的效果freertos的实时性是通过频繁切换任务实现的pendsv不是最低中的最低的话容易影响其它ISR触发操作向中断控制和状态寄存器ICSR的悬起位bit28写1触发场景1Systick触发常见触发方式Systick的ISR如果发现要切换任务eg:时间片用完有更高优先级任务就绪就会调用宏宏会去设置PendSV的悬起位触发PendSV异常然后挂起PendSV等Systick退出后执行2任务主动触发任务主动调用任务切换函数进行强制切换eg任务执行结束1.7 空闲任务RTOS调度器启动时自动创建空闲任务确保始终存在一个能够运行的任务让CPU有事可干或让芯片进入低功耗状态。空闲任务以最低优先级创建确保如果有更高优先级应用程序任务处于准备就绪状态时空闲任务不适应任何CPU时间空闲任务负责释放被删除任务的内存

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价