站在裸机角度看RTOS多任务调度

strongerHuang 2025-07-14 17:20

关注+星标公众,不错过精彩内容

作者 | strongerHuang

微信公众号 | 嵌入式专栏


从裸机过度到RTOS这个阶段,其实是比较“痛苦”的阶段,很多读者就是从这个阶段放弃的嵌入式。

很多朋友长时间使用裸机编程,切换过来学习RTOS,一上来就是一堆的概念,比如:临界段、调度、信号量、互斥锁等这些概念,相信大部分初学者看到这些概念都是懵的。

今天就站在裸机的角度,给大家科普一下RTOS的多任务调度。

什么是多任务?

很多读者应该都是从裸机阶段过来的,裸机系统一般也称之为单任务系统、轮询系统前后台系统


这个概念相信大家都能明白,轮询就是在一个大while循环里执行。前后台系统就是在执行while时,有中断(前台)响应的系统。

int main(void){  /* 初始化 */  while(1)  {    /* 循环处理多项事情 */  }}


那么,什么是多任务呢?


当多任务操作系统使用某种任务调度策略允许两个或更多进程并发共享一个处理器时,事实上处理器在某一时刻只会给一件任务提供服务


因为任务调度机制保证不同任务之间的切换速度十分迅速,因此给人多个任务同时运行的错觉。

---来自百度百科


初学者可以理解为:有类似上面的多个轮询系统


如下代码,将大while中的多项事情,分为几个事情,分别处理

void Task1(void){  /* 初始化 */  while(1)  {    /* 处理事情1 */  }}
void Task2(void){  /* 初始化 */  while(1)  {    /* 处理事情2 */  }}


这里就要牵涉到各个任务之间的切换:任务调度


任务调度

说任务调度之前,先说一插曲:

我开始学RTOS的时候,滴答设置1000(1ms时间),觉得CPU在各个任务之间来回切换,执行那么多代码,会占用CPU很多时间,这样CPU就执行不了多少代码......

其实,我当时太低估了处理器的能力。


拿STM32F103跑72M来说,1ms时间可以执行的代码有多少,你们心里有概念吗?


沿着这个问题,大家进一步思考其实都能明白,区区(任务调度)切换的几行代码对于CPU速度来说,这个处理时间可以忽略不计(当然,这是相对高速处理而言。如果低频的处理器,这个时间可能相对较长)


任务调度

任务调度可以分抢占调度和轮询调度


在RTOS中,为了使任务得到实时响应,一般使用抢占调度方式,我们拿UCOS为例:


你会发现只程序执行过程中,如果有高优先级任务带来,高优先级任务就会打断低优先级任务。


直到高优先级任务执行完,低优先级任务才得到相应。


这里有人可能会问:如果高优先级一直或长时间执行可以吗?


答案是:NO


这里就关系到任务优先级分配,以及任务设计问题。


一般来说,高优先级任务是在等待一个事件的触发,执行一件紧急,而不会太耗时的事情


太耗时任务一般留给低优先级任务,在系统不忙时慢慢处理。



调度过程

我们设置系统滴答为1ms时间,那么系统就会间隔1ms检查一次就绪任务中优先级更高的任务。


这个1ms滴答是由定时器中断产生,一般像在STM32由内核滴答定时器产生。


如上图,他在(2)的位置就检测到有更高优先级任务(7)就绪,此时就会跳转到任务(7)去执行。


------------ END ------------

图片
●专栏《嵌入式工具
●专栏《嵌入式开发》
●专栏《Keil教程》
●嵌入式专栏精选教程

关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

点击“阅读原文”查看更多分享。

声明:内容取材于网络,仅代表作者观点,如有内容违规问题,请联系处理。 
Copyright © 2025 成都科技区角科技有限公司
蜀ICP备2025143415号-1
  
川公网安备51015602001305号