为什么使用RTOS?

Posted Albert Nie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么使用RTOS?相关的知识,希望对你有一定的参考价值。

为什么使用RTOS

(Real-Time Operating System,RTOS)即实时操作系统,通常应用于嵌入式等对实时性要求较高的产品中。由于嵌入式产品对资源,功耗很敏感,所以RTOS也具备可裁剪、低功耗、资源占用率低等特点。相对于通用的分时操作系统,如linux,Windows而言,RTOS更强调实时

何谓分时?简单地说就是,多个任务,交替占用系统资源,而不关心每个任务具体占用了多少时间,一切由操作系统调度。

何谓实时?简单地说就是,一个任务必须在规定的时间内完成。

当然了,话是这么说,也还是允许RTOS偶尔犯错。根据犯错程度,实时通常又分为两种:硬实时,软实时

  • 硬实时:每个任务必须在规定时间内完成,绝对不能犯错(超时)。这通常应用于实时性极其重要的场合,如航空航天,核反应堆等。
  • 软实时:偶尔允许超时。比如90%的任务都能够按时完成,那也是OK的。

市面上的RTOS很多,如freeRTOSLiteOSRTX,μClinux、μC/OS-II、eCos等等。这里以RTX为例,进行介绍。

Keil-RTX是keil研发的一款实时操作系统,由于keil被ARM收购,现在改名为CMSIS-RTOS

为什么需要实时系统?毫无疑问,当然是为了提高产品的实时性啊!

传统的无操作系统嵌入式编程称为裸机编程,即我们的程序直接与硬件打交道,在main程序中通过while大循环来实现任务的循环执行。喏,看下面这段代码,相信大家都不陌生。但这种编程方式有个缺点,那就是实时性不高。task2想执行,那可不行,得等task1执行完毕才行,这就是导致系统实时性不高的原因所在。

int main(){
    init();   
    while(1){
       // task1
       ...
       // task2
       ...
    }
  return 0;
}

RTOS很好地解决了这个问题,咱不采用while大循环,我换种方法,直接使用OS调度算法来调度好吧,比如这样~

int main(){
  init();
  RTOSInit();
  osThreadNew(task1, NULL, NULL);  // 线程1
  osThreadNew(task2, NULL, NULL);  // 线程2
  ...
}

创建两个线程,某一时刻具体执行哪个线程,也就是哪个任务,是由操作系统的调度算法决定的,只要我们配置了合适的调度算法,那么系统的实时性就可以得到提升。常见的调度算法有时间片轮调度算法优先级调度算法,感兴趣可参见《现代操作系统》。

CMSIS-RTOS是基于Cortex-M内核而研发的。在微处理器中使用RTOS,比如Cortex-M3内核微处理器有以下优点:

  • The RTOS structure allows you to take a more object-orientated design approach, while still programming in ‘C’.
  • The RTOS also provides you with multithreaded support on a small microcontroller.

使用RTOS,可以让我们用C语言来实现基于对象的编程思想,再者也为在微处理器上实现多线程提供了支持。

The tradeoff for this is that an RTOS has additional memory requirements and increased interrupt latency. Typically, the Keil RTX5 RTOS will require 500 bytes of RAM and 5k bytes of code.

当然,凡事都是有代价的,RTOS为我们带来实时性和多线程的同时,也会占用微处理器更多的内存和增加中断延迟。不过貌似,CMSIS-RTOS几乎没有中断延迟,且任务调度时间开销也较其他RTOS小,正确与否,有待考究。

RTX 资源概览

The RTOS itself consists of a scheduler which supports round-robin(时间片轮), pre-emptive(抢占式) and co-operative(协同) multitasking of program threads, as well as time and memory management services.

Inter-thread communication is supported by additional RTOS objects, including signal thread and event flags, semaphores, mutex, message passing and a memory pool system.

As we will see, interrupt handling can also be accomplished by prioritized threads which are scheduled by the RTOS kernel.

RTX主要由三部分组成:ObjectsSchedulerServices,其中Scheduler主要负责线程之间的调度。
在这里插入图片描述

Objects : 即对象,是RTOS定义的抽象数据类型,主要包括:

  • Tasks: 任务,也是 Thread
  • Events: 事件
  • Semaphore: 信号量
  • Mutex: 互斥量
  • Message Passing : 也称为 Message Queue,即消息队列

Services: 即服务,操作系统提供的服务,主要包括:

  • Time Management: 时间管理
  • Memory Management: 内存管理
  • ISR Support: 中断支持

CMSIS_RTOS的所有资源都定义在头文件<cmsis_os2.h>中,大致了解这么多即可,接下来,笔者会继续更新RTX的内部资源使用,希望对大家有所帮助~

【下篇阅读】

RTX移植

以上是关于为什么使用RTOS?的主要内容,如果未能解决你的问题,请参考以下文章

Rtos 的 Stm32 硬故障异常

Robomaster电控入门RTOS

为什么RTOS系统要使用MPU?

为什么RTOS系统要使用MPU?

认识RTOS

认识RTOS