良许Linux教程网 干货合集 在RTOS实时操作系统中是怎样实现多任务的?

在RTOS实时操作系统中是怎样实现多任务的?

当许多朋友习惯于长时间使用裸机编程后,切换到学习RTOS时,往往会对其中一些概念产生误解。在学习RTOS实时操作系统时,许多人开始时都对其中一些概念感到陌生和不理解。概念如临界段、调度、信号量、互斥锁等,常常会让人感到困惑。然而,这样的感受是很正常的。毕竟,一下子要理解这些概念并不容易,相反,理解它们需要时间和耐心。

2什么是多任务

这里大部分人应该都是从裸机阶段过来的,裸机系统一般也称之为单任务系统、****轮询系统前后台系统

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

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

那么,什么是多任务呢?

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

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

—来自百度百科

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

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

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

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

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

3任务调度

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

我开始学RTOS时,觉得CPU这么短时间(1ms)在各个任务之间来回切换,而且切换还需要执行那么多代码,这样CPU还能执行多少代码啊?

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

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

沿着这个问题,大家深思,其实都能明白,区区那切换(任务调度)的代码对于CPU速度来说,可以忽略(当然,这个相对)。

任务调度

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

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

image-20231228180834089
image-20231228180834089

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

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

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

答案是:NO

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

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

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

image-20231228180846958
image-20231228180846958

调度过程

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

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

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

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部