RTOS基础知识
跟大家熟知的AI中的上下文不同,这里指一个任务执行时,会调用寄存器里面的相关资源,并和其他程序一样去访问ROM和RAM。这些所有的堆、栈等都构成了上下文。
一、多任务处理
引用官方的文档:
内核是操作系统的核心组件。Linux 等通用操作系统采用的内核 允许多个用户看似同时访问计算机的处理器。这些用户可以各自执行多个程序,看起来像是并发运行。
每个执行的程序由操作系统控制下的一个或多个线程实现。如果操作系统能够以这种方式执行多个线程,则称为多任务处理。 像 FreeRTOS 这样的小型 RTOS 通常将线程称为任务,因为它们不支持虚拟内存,因此进程和线程之间没有区别。
使用多任务操作系统可以简化原本复杂的软件应用程序的设计:
-
操作系统的多任务处理和任务间通信功能允许将复杂的应用程序 划分为一组更小且更易于管理的任务。
-
这种划分可以简化软件测试,确保团队分工明确,并促进代码复用。
-
复杂的时序和排序细节将由 RTOS 内核负责,从而减轻了应用程序代码的负担。
简单的总结一下就是通过使用操作系统的方法使得原本只能执行单一任务的芯片能够同时执行多个任务,并减轻了应用程序的代码负担。
二、多任务处理与并发

如图可见,freertos通过多个任务之间的快速转换来达到同时执行多个任务的效果。
三、任务调度
3.0不同优先级的任务
按照各自的优先级进行执行,但当高优先级的进入阻塞态时,低优先级的会线执行,如下图,为不同优先级任务的执行情况

3.1同一优先级的
按照时间片轮询(一种任务调度和资源分配机制,通常用于多任务处理系统、多线程编程以及某些特定的通信协议或资源管理场景中)进行相关的执行操作,即是按照任务创建的先后顺序进行执行。
ps:时间片长度为一次系统时间中断。
四、任务状态
freertos中跟其他操作系统的一致均为
运行态:当任务实际执行时,它被称为处于运行状态。如果运行 RTOS 的处理器只有一个内核,那么在任何给定时间内都只能 有一个任务处于运行状态。注意在 STM32 中,同一时间仅一个任务处于运行态。
就绪态:准备就绪任务指那些能够执行(它们不处于阻塞或挂起状态),但目前没有执行的任务,因为同等或更高优先级的不 同任务已经处于运行状态。
阻塞态:如果任务当前正在等待延时或外部事件,则该任务被认为处于阻塞状态。
挂起态:类似暂停,调用函数 vTaskSuspend() 进入挂起态,需要调用解挂函数 vTaskResume() 才可以进入就绪态。
如下图所示。

五、系统滴答
类似于定时器,但该变量作用以于整个系统的运行,对维护系统发运行十分关键。每次滴答数增加时,都会进行对正在运行中的任务进行检查,查看是否处于阻塞等状态。
六、上下文切换
6.0简介
跟大家熟知的AI中的上下文不同,这里指一个任务执行时,会调用寄存器里面的相关资源,并和其他程序一样去访问ROM和RAM。这些所有的堆、栈等都构成了上下文。
6.1作用
由于在不同的程序运行的时候,可能会对相同的寄存器里面的值进行修改,这会导致寄存器里面的值在不同的程序运行之处会有差异,而这些差异就有可能会让相关程序运行时出现异常的情况。为了防止这种类型的错误,任务在恢复时必须有一个与挂起之前相同的上下文。通过在任务挂起时保存任务的上下文,操作系统内核负责确保上下文保持不变。任务恢复时其保存的上下文在执行之前由操作系统内核恢复。该过程也被称为上下文切换
6.2切换的时机
在需要切换任务的时候进行上下文切换,真正执行上下文切换是在PendSV(即挂起系统调用为一种特殊的中断,用于处理系统级的任务切换等操作)的ISR中处理的。使用PendSV是因为其可以手动触发,并且可以在其他更高中断优先级的ISR中来进行设置,比较灵活。具体触发操作是将中断控制和状态寄存器ICSR的bit28,也就是PendSV的挂起位置1来触发PendSV中断。FreeRTOS会将PendSV设置为最低中断优先级,避免任务切换影响到其他正常的ISR。
会触发该中断的情况:
1.系统滴答中断。
2.任务执行完毕。
七、空闲任务
RTOS调度器启动时,自动创建空闲任务,以确保始终存在一个能够运行的任务。最低优先级创建、不使用任何CPU时间、负责释放被删除的任务的内存。
更多推荐


所有评论(0)