最近开始学习实时操作系统提升知识面,刚好STM32的开发板附赠了FREE RTOS的学习手册,就据此来学习吧,
所谓RTOS,即Real-Time Opreating System,实时操作系统,这个系统最大的好处就是通过一系列的算法,实现了多任务的灵活切换。单片机本身是单核的,只能单条代码依序执行,所以这个实时也只是伪实时,只是通过灵活切换任务,降低各个任务之间的延时,以达到实时的目的。
那么RTOS是怎么实现多任务切换和管理的呢?系统中有一个模块被称为“任务调度器”,其实就是通过产生中断,在中断中实现任务切换,STM32就是在PendSV中切换任务,每次需要切换任务的时候,就产生一个PendSV中断。
任务调度有两种方式,一种是被动切换,一种是主动切换。被动切换,就是任务完整的跑完一个系统时钟(也可以称为时间片),这个系统时钟是RTOS的系统时钟,由硬件定时器实现,一次定时器溢出为一个时间片,所以RTOS内的延时计时都是以这个为单位的,而不是以硬件的时钟源为单位,比如定时器溢出时间是1S,那么RTOS的时间片就是1S。当时间片用完时,硬件定时器就会产生中断,在中断函数里面又会产生一个PendSV中断。
另外一种是主动切换,主动切换任务就是将当前任务由运行状态进入阻塞状态。任务的状态分为就绪态,运行态,阻塞态,和挂起态。系统中同一时间只能有一个任务处于运行态,任务只能从就绪态进入运行态。
既然是多任务系统,那么各个任务之间就有个先后顺序,即任务优先级。系统只会运行最高优先级的任务,所以要想执行低优先级的任务,就有两个方法,一个是修改任务优先级,另一个就是阻塞高优先级的任务。
一般情况下,各个任务之间互不干涉,因此每个任务都需要申请一块内存空间存放该任务的变量,保存切换任务时该任务的各个变量值已经代码执行到的地址。比如A任务执行了半个时间片,此时需要切换到B任务,切换任务之前就需要保存A任务的状态,比如代码执行到了哪一行,此时各个变量的值是多少,这样在之后才能恢复此任务的运行状态。
有时候各个任务之间需要传递信息,就需要创建一个队列,队列就是FIFO(先进先出),所有任务都可以访问队列,队列不属于某个任务。各个任务可以通过队列同步数据。
标签:定时器,优先级,队列,RTOS,FREE,任务,切换,随记 From: https://www.cnblogs.com/style--moon/p/18066210