概述
目录
- 为什么使用RTOS
- RTX 资源概览
为什么使用RTOS
(Real-Time Operating System,RTOS)即实时操作系统,通常应用于嵌入式等对实时性要求较高的产品中。由于嵌入式产品对资源,功耗很敏感,所以RTOS也具备可裁剪、低功耗、资源占用率低等特点。相对于通用的分时操作系统,如linux,Windows而言,RTOS更强调实时。
何谓分时?简单地说就是,多个任务,交替占用系统资源,而不关心每个任务具体占用了多少时间,一切由操作系统调度。
何谓实时?简单地说就是,一个任务必须在规定的时间内完成。
当然了,话是这么说,也还是允许RTOS偶尔犯错。根据犯错程度,实时通常又分为两种:硬实时,软实时。
- 硬实时:每个任务必须在规定时间内完成,绝对不能犯错(超时)。这通常应用于实时性极其重要的场合,如航空航天,核反应堆等。
- 软实时:偶尔允许超时。比如90%的任务都能够按时完成,那也是OK的。
市面上的RTOS很多,如freeRTOS
、LiteOS
,RTX
,μ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主要由三部分组成:Objects
、Scheduler
、Services
,其中Scheduler主要负责线程之间的调度。
Objects
: 即对象,是RTOS定义的抽象数据类型,主要包括:
Tasks
: 任务,也是 ThreadEvents
: 事件Semaphore
: 信号量Mutex
: 互斥量Message Passing
: 也称为Message Queue
,即消息队列
Services
: 即服务,操作系统提供的服务,主要包括:
Time Management
: 时间管理Memory Management
: 内存管理ISR Support
: 中断支持
CMSIS_RTOS的所有资源都定义在头文件<cmsis_os2.h>
中,大致了解这么多即可,接下来,笔者会继续更新RTX的内部资源使用,希望对大家有所帮助~
【下篇阅读】
RTX移植
最后
以上就是仁爱大侠为你收集整理的为什么使用RTOS?的全部内容,希望文章能够帮你解决为什么使用RTOS?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复