μC/OS-Ⅱ在应用系统中任务划分方法的研究
μC/OS-Ⅱ是由Jean J.Labrosse于1992年开始提出的一个源码公开的嵌入式实时多任务操作系统,至今仍在继续发展,其已经在工业控制、仪器仪表、汽车电子、航空航天和消费电子等领域得到了广泛应用。它采用占先式实时调度方式,结构简洁精练、可读性强、性能稳定、便于移植,只需少量的工作就能将其移植到8位、16位和32位微处理器上。目前,μC/OS-Ⅱ已成为嵌入式开发人员入门嵌入式操作系统的合适选择。
开发基于μC/OS-Ⅱ的嵌入式应用系统,首先需针对目标硬件平台对μC/OS-Ⅱ进行移植。在详细分析总体需求的基础上,将系统功能合理地划分为多个不同任务实现。由此可见,在实现嵌入式应用系统的过程中,任务划分是十分重要的环节。划分任务是否合理有效不仅直接决定了μC/OS-Ⅱ的性能和执行效率,还间接影响着应用系统甚至整个项目的成败。
对于国内众多嵌入式方向的研究人员和爱好者,基于实时操作系统μC/OS-Ⅱ进行教学或者研发,大多侧重于μC/OS-Ⅱ在各种特定目标硬件平台上的移植和简单使用。而μC/OS-Ⅱ上的复杂系统开发特别是划分任务策略虽已引起诸多关注,但到目前为止却鲜有详细而系统的研究成果。本文在总结前人工作和实际开发经验的基础上,研究了μC/OS-Ⅱ任务划分的方法和原则,并结合实践给出基于MC9S12NE64硬件平台的应用实例。
1 μC/OS-Ⅱ的任务管理机制
在μC/OS-Ⅱ中,每个任务可以是一个典型的无限循环,都处在μC/OS-Ⅱ规定的一种任务状态。程序员把一个大地应用程序分成相对独立的多个任务来完成,大大提高了CPU的利用率,极大地方便了应用程序的设计和维护。而多任务系统则通过任务切换实现各个任务之间的调度运行。
从存储结构来看,任务由3个部分组成:任务的程序代码、任务堆栈和任务控制块(PCB)。其中,任务堆栈用来保存该任务运行时的工作环境;任务控制块用来保存该任务的一些属性;任务程序代码则描述了该任务的执行过程。μC/OS-Ⅱ可以管理多达64个任务,其中的空任务(IDLE)和统计任务(STATISTICS)为系统任务,其余都属于用户任务。μC/OS-Ⅱ规定其每个任务必须设置为不同且惟一的优先级(优先级的数值越小,则代表任务的优先级别越高),而μC/OS-Ⅱ内核会调度处于就绪状态优先级最高的任务进行处理,并分配CPU。就绪状态属于任务的5种状态之一,其余4种状态分别为:睡眠状态、运行状态、等待状态、中断服务状态。μC/OS-Ⅱ的任务总会处于这5种状态之一,并根据不同的条件在5种状态中进行切换,如图1所示。
2 任务划分的方法
2.1 以硬件模块为对象划分任务
在使用μC/OS-Ⅱ划分任务时,应将各硬件模块相关的驱动程序划分为不同的任务,根据硬件模块在系统功能中的关键性顺序设定相应的优先级。以MCU为中心,将各硬件驱动程序划分为独立的任务,不仅有效防止了争用硬件模块出现的问题,还能够提高整个μC/OS-Ⅱ的执行效率,满足应用系统的实时性要求,为系统维护和扩展功能打下良好的基础。
将不同硬件模块的操作划分为不同的任务,使得应用系统必须通过μC/OS-Ⅱ内核调度相应的任务,才能实现对于某个硬件模块的访问。这样,每个模块都有且只有惟一的任务与之对应,其他任务则无权时访问它。这种操作模式有效地避免了由于多个任务同时争用同一硬件模块造成的冲突甚至死锁现象。
按照硬件模块划分任务,可以有效提高μC/OS-Ⅱ的工作效率,增强应用系统对于实时要求的处理能力。例如:如果当前系统正在对并口设备进行处理,由于并口属于慢速设备,其执行速度远远落后于MCU总线频率,因此在其工作过程中MCU大部分时间处于空闲状态,即无事可做直到并口处理完毕为止。将并口驱动独立为单个任务之后,μC/OS-Ⅱ内核就可以通过任务调度使并口处理任务和其他任务并发执行,减少MCU处于空闲状态的时间,从而提高了整个应用系统运行效率。
硬件模块与硬件驱动任务一一对应,使整个软件系统框架清晰、结构合理,增强了系统的可维护性和可扩展性。以增加串行通信功能为例,开发人员只要编写相应串口驱动程序,在μC/OS-Ⅱ中增加串行通信任务即可,无需修改任何其他模块的任务代码。
2.2 划分强实时性任务
实时即立即、及时的意思,根据应用中的实时要求,可以将其分为强实时和弱实时2大类。强实时对于响应时间要求很高,如果实时性得不到满足,系统会出现错误甚至难以挽回的故障。弱实时虽然同样要求调度时间短,响应速度快,但其确定性较差,超过限定时间也能勉强工作。在基于μC/OS-Ⅱ的嵌入式应用系统中,强
- 基于FPGA的DSP设计方法(08-26)
- 专家指导:Linux操作系统密码恢复方法(05-16)
- 基于多核DSP Bootload代码加载方法研究(01-16)
- 基于DSP 的大容量无线传输技术中高性能的启动方法(03-16)
- 多核调试新方法探讨(10-22)
- 有备无患Linux操作系统备份方法介绍(06-06)