第1页共3页开源RTOS在STM32单片机中的应用许迅文佛山市顺德区长兴超声设备有限公司摘要:传统的嵌入式程序设计,主要采用前/后台系统或超级循环系统,应用程序是一个无限循环,循环中调用相应的函数完成操作,中断服务程序处理异步事件,这种系统处理信息的实时性较差,RTOS(实时操作系统)解决了这一问题。如果把RTOS应用在ARMCortex-M3架构的单片机上,配合其先进的硬件设计,将使嵌入式软件的实时性能产生质的飞跃。关键词:开源;嵌入式;RTOS;STM321.引言超级循环式的软件架构,最坏的情况下,任务响应时间将取决于整个循环的执行时间,以及中断程序处理时间。因为循环的执行时间不是常数,程序经过某一特定部分的准确时间也是不确定的,进而,如果程序修改了,循环的时序也会受影响。存在关键任务的程序里面,这种情况是不允许的。相应地,实时操作系统(RTOS)的主要功能就是,必须保证按照任务的优先级,在可预知的时间内作出响应,尤其是对于生命攸关的应用,例如航天、航空、医疗等场合。市场上有多种RTOS,例如μC/OS-II、CMX、embOS、MQX、freeRTOS、PowerPac、ThreadX、CoOS等等。其中多数是针对通用硬件架构设计的,例如ARM7、ARM9、Cortex-M等都适用,商业版本是收费的,开源版本应用在商业产品上也要通过授权许可,所以一般开源RTOS只作为学习用途。但也有例外,例如由国内高校团队开发的CooCoxCoOS(以下简称CoOS),就是免授权的开源RTOS,开发者可以用在商业产品上。而且它是专门为Cortex-M架构设计的,应用在该架构的单片机上,能发挥出它的最大优势。特别是它的零中断延时特性,对关键任务至关重要。STM32是ST公司基于ARMCortex-M3设计的单片机系列,采用ARMv7M架构,使用Thumb-2指令集,混合16及32位指令,具有非常高的代码密度,比ARM7平均高出30%,采用哈佛结构,集成NVIC实现快速中断,可完全使用C语言编程,集成总线矩阵,集成系统定时器(SysTick)用作RTOS时基。它的特点是具有非常低的中断响应时间,而且不同中断源可属于不同的优先级和抢占级,对任务配置非常灵活。STM32配备了强大的外设,其中DMA可以各种灵活方式跟外设接口,节省宝贵的CPU资源,以超级循环方式运行的STM32程序,在处理一般任务时会比传统单片机存在巨大优势。如果程序变得复杂,例如要同时处理USB协议、图形人机界面、后端多任务时,任务实时性问题就会突显,此时应用RTOS,任务的调度时间才会得到有效平衡。2.CoOS特点介绍1)高度可裁剪性,最小系统内核仅974Bytes。在资源紧张的嵌入式系统中,程序容量相当于成本,RTOS本身就是一种额外的空间开销,CoOS如此低的空间占用率,在众多开源RTOS中是相当优秀的。2)自适应调度算法。针对任务的就绪链表,选择使用二分调度算法。CoOS能第2页共3页根据用户任务数自适应的切换顺序查找法和二分法。3)支持优先级抢占和时间片轮转,兼顾了不同优先级和相同优先级任务的调度。4)零中断延时。单片机发生中断时,相当于没有运行操作系统一样地响应,彻底保证了实时性。5)具有信号量、邮箱、队列、事件标志、互斥等同步通信方式,协调各任务间的信息流动,媲美商业RTOS的功能。6)堆栈溢出检测,保证系统稳定性。7)很短的任务切换时间,在纯切换内容的情况下,切换时间只需要1.5us。8)支持多种编译器及不同品牌的Cortex-M芯片。3.CoOS在STM32上的实现首先在源码包及相关编译器的工程例子,此处以IAREWARM32KKickStart免费版本作为演示。工程例子CoOSDemo中包含了四个文件夹,分别是App(应用程序)、CooCoxRTOS(CoOS核心源代码)、Port(移植到STM32的机器代码)、System(STM32官方库文件)。程序首先初始化RCC寄存器组,包括各种系统总线和外设总线的时钟频率。接着初始化NVIC寄存器组,包括各种需要用到的外设中断。然后初始化CoOS的基本数据结构,此时调用CoInitOS()函数。接着就是创建任务,任务参数包括任务名称、任务变量、优先级、任务栈、栈的大小。最后一步就是启动OS。鉴于构建RTOS的主要目的是进行实时多任务调度,所以下面主要说明CoOS任务调度的相关内容,其它诸如时间管理、内存管理、任务同步与通信等内容本文从略。在基于OS的应用开发中,一个应用程序通常由若干个任务组成。在CoOS中,任务通常是一个内部无限循环的C函数,同样有返回值和参数,由于任务永远不会返回,所以任务的返回类型必须定义为void。与普通的C函数不同,任务退出是通过调用系统退出的API函数来实现的。若只是通过代码执行结束来表示任务退出,这样将会导致系统崩溃。在CoOS中,可以调用ExitTask()和DelTask(taskID)来删除一个任务。ExitTask()删除当前正在运行的任务;DelTask(taskID)可以删除其他任务,若参数为当前任务ID,则同ExitTask()一样删除当前任务。在CoOS中,一个任务可以存在于以下几种状态之一:就绪态(TASK_READY)、运行态(TASK_RUNNING)、等待态(TASK_WAITING)、休眠态(TASK_DORMANT)。休眠态不同于等待态:处于等待态中的任务当等待的事件满足时会被重新激活,参与任务调度;而处于休眠态的任务则永远不会被再次激活。CoOS每创建一个任务,就会分配一个任务控制块(TCB)来描述该任务,以确保该任务的CPU使用权被剥夺后又重新获得时能丝毫不差地继续执行。所有任务的调度是通过任务就绪链表实现的,CoOS将所有就绪态任务的TCB以优先级高低的顺序通过双向链表链接在一起,保证了链表的第一项总是优先级最高、最需要调度的就绪态任务。CoOS允许多个任务共享同一优先级,因此就绪链表中不可避免地会出现相同优先级的任务。对此CoOS遵循“先入先出(FIFO)”的原则,将迟来的任务排在同一优先级的最后,这样所有处于同一优先级的任务就都能获得相应时间片的CPU运行时间。CoOS用TCBRdy表示就绪链表的开始,即TCBRdy为就绪链表中优先级最高的任务TCB,故每一个任务调度只需第3页共3页要检查TCBRdy所指任务的优先级是否大于当前正在运行任务的优先级,这样可以最大限度地提升任务调度的效率。与其它内核不一样的是:CoOS并不是通过开关中断来处理临界代码段,而是通过锁定调度器来实现的。因此相对于其它内核,CoOS拥有较短的中断屏蔽时间。关中断的时间是实时内核开发商应提供的最重要的指标之一,因为这个指标关系到系统对实时事件的响应性。相比其它处理方式,通过锁定调度器能最大程度地提升系统的实时性。4.结论本文介绍了开源实时操作系统CooCoxCoOS和STM32单片机各自的特点,以及它们结合起来应用的优势,说明了当今流行的低成本、低功耗、高性能的通用单片机,应用实时操作系统的步骤,以及任务调度相关的关键内容。参考文献[1][美]JeanJ.Labrosse著,邵贝贝等译,MicroC/OS-IITheReal-TimeKernelSecondEdition,北京航空航天大学出版社,2003.5[2]王永虹、徐炜、郝立平著,STM32系列ARMCortex-M3微控制器原理与实践,北京航空航天大学出版社,2008.7[3]CooCoxCoOS用户手册,