一、 统概述
目前市场上的商用嵌入式系统产品,如Vxwork、PSOS和Windows CE等已经十分成熟,提供有力的开发和调试工具,但开发成本昂贵,而uCOS-II是一种多任务实时操作系统,内核源代码公开,短小精干,移植性较强,非常适用于一些小型系统开发。本系统描述了如何将uCOS-II移植应用到MCS51系列单片机上,并论述了如何把它实际应用到“嵌入式设备—车载GPS”系统中。
1、 uCOS-II简介
实时嵌入式操作系统uCOS-II是基于优先级的抢占式实时多任务操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步(信号量,邮箱,消息队列)和内存管理等功能。绝大部分代码用C语言写成,与硬件相关部分用汇编语言编写,而且它的源代码是公开免费的。
uCOS-II是面向中小型嵌入式系统的,包含全部功能模块的内核大约为10K,如果经过裁减只保留核心代码,则可压缩到3K左右。RAM的占用量与系统中的任务数有关,任务的堆栈要占用大量的RAM空间,堆栈的大小取决于任务的局部变量、缓冲区大小及可能的中断嵌套层数。应用程序的时间精度由系统时钟节拍决定,uCOS-II需要用户提供周期性的时钟信号源,用于实现时间延时和确认超时,一般时钟节拍应在10到100HZ之间(最大精度为10ms),因为uCOS-II在每一个节拍都要检查有没有更高优先级的任务在等待执行,若有,就要进行任务切换,所以时钟节拍率越高,系统的额外负荷就越重。
2、系统的设计目标
本车载移动终端主要完成以下这些控制功能:
(1)位置及相关信息传送,包括实时请求发送、等时间间隔发送、等距离发送,传送方式包括GPRS方式和短信方式,由于用GPRS方式进行数据通讯按流量记费,每1K字节2-3分钱,费用相对短信低很多,因此本系统采用GPRS为主,短信为辅的通讯方式。
(2)报警功能,分以下几部分:
A、特定区域报警功能:设定报警特定区域后(如控制中心规定的行驶任务区域),当车辆驶出设定区域时,监控中心向车载单元报警,并及时记录车辆的实时位置信息。
B、紧急报警功能:当车辆遇到抢劫、交通事故等紧急情况时,司机可以通过紧急求救按钮向控制中心发出求救信号,并上传车辆定位数据。
C、防盗报警功能:当车辆设为防盗状态时,任何对车辆的非法移动,车载单元会自动报警并上传车辆定位数据。
D、掉电报警功能:当车载单元主电源掉电(或被人为切断)时,车载单元会自动报警并上传车辆定位数据。
E、能自动报警与手动报警相结合:系统支持手动的单键报警和智能设备产生的自动报警功能。单键人工报警需要司机进行快速隐蔽的单键操作快速报警。自动报警如智能非法移动报警,系统自动产生报警信息并发送到监控中心,并保存报警数据,监控中心的人员可以根据需要采取措施。
(3)电源监控功能,实时监控备用电源,如果发现电量不够,将自动切换到充电模式,直到电量充足后自动切断充电模式。
3、 系统的功能块
系统结构图如图1所示,有外向内可分三层:硬件电路层、任务层、操作系统层。
图1 系统结构图
二、硬件电路层设计
本系统的移动终端主要包括以下四个部分组成:GPS模块、GPRS模块、手柄、单片机控制模块,其大致功能分述如下:
(1) GPS模块——用于卫星定位数据的采集,采集时间间隔可设定,最小间隔为1秒采集一次。
(2) GPRS通信模块——用于实现GPRS数据的收发、短信息收发和语音通话功能。
(3) 手柄——用于语音通话。
(4) 单片机控制模块——用于控制GPS、GPRS模块的数据接收、发送、语音通话控制、短信息收发、电源监测管理和对汽车进行控油控电等功能。
三、任务层的设计
1、系统任务层组成及其优先权设置
系统任务层并行存在以下六个任务:监视任务、按键处理任务、摘挂机任务、GPRS任务、短消息任务、串口接收任务。每个任务均有以下三部分组成:应用程序、任务堆栈以及任务控制块。其中只有应用程序被烧入ROM,而任务本身则被置于RAM,待系统运行时再建立。任务堆栈用以存储CPU寄存器内容。当某任务由运行态变为其它状态时,CPU寄存器内容压入相应任务堆栈,反之则将相应任务堆栈内容置入CPU寄存器。作为系统中定义的一个数据结构,任务控制块的内容包括任务堆栈的地址、任务当前状态、任务优先权等。操作系统通过查询任务控制块内容实现对任务的管理。
优先权的设置由各任务的执行顺序以及对系统安全性影响的大小决定,其优先权从高到低依次为:监视任务、按键处理任务、摘挂机任务、GPRS任务、短消息任务、串口接收任务。本系统采用静态优先权设置,即运行过程中任务优先权不变。
2、 任务的状态
本系统中各任务的状态有4种:等待态、就绪态、运行态以及中断态。状态的转换关系如图2所示。当一个任务占用CPU时该任务处于运行态,其优先权必较所有就绪态任务优先权高。若系统运行导致就绪态某一任务的优先权高于运行态任务优先权,则调用调度函数,运行态任务将丧失对CPU的占用权而转为就绪态,优先权最高的就绪态任务转为运行态。某一时刻只能有一个任务处于运行态。任务在就绪态和运行态间的转化被称为任务切换。当运行态的任务期待某一消息时(即任务和任务之间的数据传递),该任务将丧失对CPU的占用权而转为等待态,等待时间可由系统设定。若等待时间内该任务收到消息,任务将转为就绪态,否则将被时间管理函数强行转为就绪态。中断发生时运行态的任务将转入中断态,丧失对CPU的占用权。因中断中可能有消息发送使等待态的任务转入就绪态,故中断返回后将首先运行任务调度函数,决定任务状态。
四、软件层设计
本系统选用μC/OS-II操作系统,将其移植到MCS51系列单片机上。系统采用的时钟节拍为Tick=50次/秒(即0.02秒/次),在main中创建所有任务和信号量、消息油箱、消息队列等。
void main (void)
{
OSInit();
//创建信号量、消息队列;
HookSem = OSSemCreate(0); //唤醒摘挂机任务
GprsQ = OSQCreate(&GprsMsg[0],10);
SMsgQ = OSQCreate(&SMsg[0],5);
//创建内存区域;
Mem20 = OSMemCreate(Part1,20,50,&err);
Mem50 = OSMemCreate(Part2,100,10,&err);
//任务创建;
OSTaskCreate(WatchDogTask,(void*)0,&WatchDogStk[0],2); //监视任务
OSTaskCreate((void*) KeyTask,(void*)0,&KeyTaskStk[0],3); //按键处理任务
OSTaskCreate((void*)WriteTask,(void*)0,&WriteStk[0],4); //摘挂机任务
OSTaskCreate((void*)GPRSTask,(void*)0,&GPRSStk[0],5); //GPRS任务
OSTaskCreate((void*)SMsgTask,(void*)0,&SMsgStk[0],6); //短信息任务
OSTaskCreate(ReadTask, (void *)0, &ReadStk[0],7); //读串口任务
OSStart();
}
1、监视任务
因本系统工作于干扰强烈的汽车环境中,虽已采取多种硬件抗干扰措施如加屏蔽罩、可靠接地、设置软件陷阱等,仍有可能因瞬间扰动使系统陷入混乱,导致系统跑飞而只能依靠看门狗复位重新运行,以致无法实现设计目标。为此,本系统采用监视任务监督其它任务是否正常运行,若某一任务未能正常运行则采取相应措施以尽量减少看门狗复位次数。
监视任务设计思路为:被监视任务正常运行时其执行时间是可预估的,被监视任务在其即将运行完毕时向监视任务发送消息说明自身运行正常。被监视任务运行时,监视任务处于等待态,等待被监视任务给它发送消息,等待时间被设定为预计的任务正常运行所需的最大时间。若等待时间内监视任务收到消息,则认为发送消息的任务运行正常,依照各任务执行顺序的先后下一任务开始运行,监视任务等待下一任务发送的消息。若等待时间已过,监视任务仍未收到消息,则系统的时间管理函数将强行把监视任务视为就绪态。因监视任务的优先权是最高的,它将抢占对CPU的控制权并采取相应的纠错方案。
2、 按键处理任务
按键处理任务主要对防盗报警、抢车报警、打接电话按钮进行处理,当任务循环检测到按键按下时,按键处理任务发送相应的信号量到处理相应按键的程序中。
3、 摘挂机任务
当拿起听筒或放下听筒时,就产生中断。在中断中,调用OSSemPost(HookSem)来唤醒摘/挂机任务,同时清除中断标志。摘挂机任务调用OSSemPend(HookSem,0,&err)来获得信号量。获得信号量后,根椐摘挂机状态标志来判断是摘机还是挂机。在挂机的时候,如果先前是在响铃的时候摘机的,那么摘挂机任务把它当做已接来电处理;如果不是在响铃的时候摘机的,那么在挂机的时候摘挂机任务就把它当做已拨电话处理。
4、 GPRS任务
当读串口任务接收到GPRS数据时,调用OSQPost(GprsQ,(void *)&Gprs_Buf[0])函数向来唤醒GPRS任务,GPRS任务不断调用gprs_msg =OSQPend(GprsQ,50,&err)来获得从读串口任务中发来的GPRS数据,根据当前的状态决定是否向控制中心发送定位数据及相关信息。
5、 短消息处理任务
在GPRS网络不可用的情况下,系统启动短消息任务进行数据的通信,当读串口任务接收到短消息时,调用OSQPost(SMsgQ,(void *)&SMsg_Buf[0])向短信息任务发送消息,短信息任务不断调用sm_msg =OSQPend(SMsgQ,100,&err)来获得短消息,然后进行相应的短信收发处理。
6、 读串口任务
在读串口任务中,从接收缓冲区中读取来自GPRS通讯模块和GPS模块发送的字符串,同时分析接收的字符串坐相应的处理以及向GPRS任务和短消息任务发送消息。
结语
本文描述了在MCS51的硬件平台上实现uC/OS-II,并针对传统的单片机程序设计方法设计的稳定性不佳的问题,提出了基于uC/OS-II的嵌入式系统设计的方案。但是,使用实时内核来管理这些任务,会增加系统的内存容量和CPU时间的消耗,而且任务调度的优势不能很好地显示出来,因此,该设计有一定局限性。但是,在系统的内存足够大、CPU运行速度足够快的情况下,使用实时内核uC/OS-II设计,可以提高了系统的可靠性和稳定性,有利于系统的后继开发,本系统选用CPU为W78E516,外扩32K RAM,晶振频率为22.1184M,能很好的满足系统的要求。