|
摘要 在嵌入式系统中使用RTOS是大势所趋。这种多任务实时操作系统一方面可以提高系统的实时处理能力,另一方面可以提高开发效率,也能提高软件的可维护性。本文以RTOS的简化版本Small RTOS51为开发平台,以电子短跑仪为实例,提出面向对象的编程方法。 关键词 嵌入式系统 RTOS 面向对象 任务分配 任务通信 电子短跑测试仪 引言 实时操作系统(RTOS)是一段在嵌入式系统启动后首先执行的背景程序。用户的应用程序是运行于RTOS之上的各个任务,RTOS根据各个任务要求,进行资源管理、消息管理、任务调度和异常处理等工作。在RTOS支持的系统中,每个任务均有一个优先级。RTOS根据各个任务的优先级,动态地切换各个任务,保证对实时性的要求。 对于前后台系统,任务是顺序运行的,是一种过程性编程,比较容易实现;但对于RTOS,任务是以分时方式运行的,看上去好像是多个任务“同时”运行。基于RTOS编程,需要掌握任务的分配方法以及如何在任务间进行通信与同步。本文提出的面向对象的编程方法就是一种行之有效的方法。 1Small RTOS51简介 Small RTOS51是在周立功网站上发布的一款源代码公开的,针对51单片机小RAM系统设计的占先式实时操作系统,可以说是μC/OSII的简化版。基于Small RTOS51的任务之间的通信与同步可用图1、图2来描述。 其中: (a) 信号量——(1)作为任务之间的互斥方法,(2)同步方法,(3)作为计数器。 图1信号量管理示意(b) 消息队列——用于任务之间传递多个数据。 2电子短跑测试仪简介 电子短跑测试仪是电子体能测试仪的一部分,它的功能描述如下: ① 基于IC卡进行身份识别和数据采集的测试仪,起点与终点间采用无线电进行数据传输。 ② 人机接口部分有8个数码管(主画面显示),2个发光二极管(电池欠压指示与测试状态指示),4个按键(自检、查询、测试),1个蜂鸣器(信号提示),1个IC卡插槽(识别SLE4442测试卡和Atmel 24C64数据汇总卡)。 ③ 完整的测试步骤——将测试卡插入IC卡插槽内,数码管显示学号,按测试键启动测试,蜂鸣器模拟起跑信号,同时开始计时,直到收到终点线传感器发来的无线电信号后结束测试。之后,分别在测试卡与机内E2PROM中保存测试成绩。 ④ E2PROM内存储的数据可以用数据汇总卡取出,在上位机管理软件中作进一步处理。 3面向对象的编程 步骤一: 发现对象 根据上述对电子短跑仪的描述和需求文档,写出所有 图2消息队列管理示意可作为候选类的名词如下: 【IC卡】、【测试仪】、【数码管】、【发光二极管】、【电源】、【按键】、【蜂鸣器】和【E2PROM】。 【IC卡】有两种,虽然占用相同的I2C总线,但驱动程序不一样,需要作为两个对象。 【测试仪】可以把测试仪作为一个虚拟主控对象,用来管理所有的对象。这样做的好处是具有很高的可复用性和很低的耦合度,但增加了管理的复杂性,不建议这样做。 【按键】虽然有4个,但它们都是触发不同功能的按钮,并没有什么内在的不同,可以合并为一个对象。 其他的都可以分别作为一个对象。 步骤二: 识别责任 举个例子,【蜂鸣器】的责任是打开蜂鸣器,设定鸣叫的频率、鸣叫的时间,关闭蜂鸣器。其他的对象限于篇幅,不再详述。 步骤三: 描述行为 实际上,现在要寻找系统提供的服务,并通过为在系统中的对象分配工作来决定怎样提供这些服务。在决定如何分配工作时,建议使用UML顺序图。 图3测试程序UML顺序图图4任务间通信示意图举个例子,当按下【测试键】启动测试后,过程如下:① 测试状态灯亮; ② 延时3 s,若收到抢跑信号退出测试;表1 驱动方式〖〗对象〖〗备注使用任务〖〗8个数码管,4个按键电源蜂鸣器2个发光二极管〖〗数码管刷新,按键扫描, 需周期服务电池欠压,充电管理,自动关机,需周期服务因调用频率高,可作为一个任务来处理因调用频率高,可作为一个任务来处理使用消息 队列〖〗无线接收〖〗将接收到的数据送到消息队列中使用 信号量〖〗E2PROM 24C256IC卡 24C64,4442〖〗共享资源,需要互斥; 为写操作和读操作分配不同的消息队列 ③ 蜂鸣器模拟枪声鸣叫;④ 启动计时器,数码管显示测试时间;⑤ 收到结束信号后退出测试;⑥ 保存测试成绩。顺序图如图3所示。 步骤四: 为对象编写驱动程序 ① 使用任务编写驱动程序。有一些设备需要CPU周期为其服务,典型的就是扫描显示和扫描键盘。可以给它们分配相应的任务,与用户任务一起调度。 ② 使用消息队列编写驱动程序。有一些设备具有自己的中断,典型的是串口输出。可以利用消息队列将用户任务需要的服务通过消息队列排队、缓冲起来,利用中断功能依次服务。 ③ 使用信号量编写驱动程序。有一些设备既不需要CPU的周期服务,又不具有自己的中断,典型的是全局变量、模拟I2C总线等。可以利用信号量的互斥功能实现对共享资源的保护。 步骤五: 任务分配及任务间通信 ① 任务的初次分配。把所有对象按驱动方式列成表格,初次分配得到4个基本任务,如表1所列。 ② 任务的再次分配。如果系统比较复杂,需要在基本的任务上再扩展出一些任务。在本方案中,扩展了按键预处理任务、串口接收任务、显示管理任务。在按键预处理任务中,增加了对按键去抖,组合键,连击键的支持,键命令解释等;在串口接收任务中,增加了对通信协议的处理;在显示管理任务中,实现了对主画面显示,错误提示,查询界面等管理。 ③ 任务间的通信。经过以上的多步分析,得到任务分配及通信示意图,如图4所示。 在图4的基础上,就可以根据具体的RTOS比较方便地进行软件的开发了。 结语 基于RTOS编程虽然增加了系统硬件开销,但随着现代半导体工艺的迅速发展,使得硬件的性能在不断地提升而成本在不断地下降。这就意味着作为一个嵌入式系统工程师,需要关注更多的是软件开发。面向对象开发具有减少费用、开发产品所需时间短的优势,并在开发过程中具有灵活性。 参考文献 1陈明计,周立功. 嵌入式实时操作系统Small RTOS51原理及应用. 北京:北京航空航天大学出版社,2004 2Labrosse Jean J. 嵌入式实时操作系统μC/OSII. 北京:北京航空航天大学出版社,2003 3Richard C. Lee William M. Tepfenhart C++面向对象开发. 北京:机械工业出版社,2002
|