RTOS是如何实现多任务的?

很多朋友长时间使用裸机编程,切换过来学习RTOS,就对其中很多概念产生了误解。

大部分人开始学习RTOS实时操作系统时,对RTOS中的一些概念都不太理解。

一上来就是临界段、调度、信号量、互斥锁等这些概念,相信大部分都是是懵的。

不太懂这些概念很正常,一下子懂了,我倒反而觉得不正常。

1什么是多任务

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

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

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

那么,什么是多任务呢?

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

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

---来自百度百科

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

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

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




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

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

2任务调度

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

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

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

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

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

任务调度

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

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

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

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

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

答案是:NO

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

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

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

调度过程

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

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

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

1.2020年第8期《单片机与嵌入式系统应用》电子刊新鲜出炉!

2.除了考虑技术,还要重点考虑物联网的社会属性!

3.传感器+MCU成大趋势!30家国产MCU厂商综合实力对比

4.Arm前总裁:Arm卖给任何半导体公司都是坏消息!

5.新唐科技与达成RT-Thread战略合作!

6.国务院抛出集成电路政策大礼包,最高免税十年

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RTOS(Real-Time Operating System)任务调度是实时操作系统中非常重要的一部分,它负责协调多个任务的执行,使得它们能够按照一定的优先级、时间片或其他算法在 CPU 上运行。RTOS 任务调度的实现方式可以分为两种:抢占式和非抢占式。 1. 抢占式任务调度 抢占式任务调度是指当一个优先级更高的任务就绪时,它可以抢占当前正在运行的任务并立即执行。在抢占式任务调度中,每个任务都有一个优先级,调度器会根据任务的优先级来决定其执行顺序。当一个高优先级任务就绪时,调度器会立即抢占当前正在执行的任务并执行高优先级任务。抢占式任务调度实现的关键在于中断处理,当一个中断发生时,调度器会暂停当前正在执行的任务并执行中断服务程序,然后在中断服务程序执行完毕后恢复原来的任务继续执行。 2. 非抢占式任务调度 非抢占式任务调度是指任务只有在自己执行完毕或主动放弃 CPU 时才会被其他任务抢占。在非抢占式任务调度中,每个任务也有一个优先级,但是任务的执行顺序只能由任务本身控制。当一个任务执行完毕或主动放弃 CPU 时,调度器会根据任务的优先级来选择下一个任务执行。非抢占式任务调度实现的关键在于任务的协作,每个任务需要在执行过程中主动让出 CPU,以便其他任务得到执行的机会。 无论是抢占式还是非抢占式任务调度,都涉及到任务的上下文切换,即保存当前任务的上下文,以便在任务再次执行时恢复其状态。上下文切换需要保存任务的 CPU 寄存器、堆栈指针等信息,并修改当前任务的状态(如就绪、阻塞等),然后切换到下一个任务的上下文。任务的上下文切换是一个比较耗时的操作,因此在任务调度的实现中需要尽量减少上下文切换的次数,提高任务的执行效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值