日期:2023-01-24 阅读量:0次 所属栏目:软件技术
0 引言
实时操作系统μC/OS-Ⅱ具有任务、时间、内存管理等功能,它是基于优先级调度的抢占式嵌入式实时操作系统,其内核可以任意裁减,移植比较简单,并且能够提供各类功能函数如信号量、邮箱队列等,实现多个任务之间的通信,适用于实时性要求较高的场合。本文利用ARM嵌入式处理器,结合GPRS和GPS技术设计了一款嵌入式车载监控终端系统,系统采用 μC/OS-Ⅱ 嵌入式操作系统,能满足车辆监控终端的设计要求[1]。
1 软件总体设计
本终端系统硬件主要由中央处理器、GPS 接收机、GPRS 无线通信模块、电源模块等部分组成,实现导航定位、通话、报警和远程通信等功能。
系统软件采用μC/OS-Ⅱ嵌入式操作系统,软件采用分层设计,具体包括底层硬件驱动层、中间嵌入式操作系统层和应用程序接口层,以及顶层应用层,整个系统体系结构如图1所示。
软件设计步骤:①进行μC/OS-Ⅱ操作系统的移植;②在此基础上设计各个硬件电路所需要的驱动程序;③进行中断处理程序ISR和各项任务的设计;④利用嵌入式操作系统提供的功能函数创建信号量、消息、邮箱等,最终实现各个任务之间的通信,从而达到控制整个嵌入式系统终端运行的目的。
1.1 任务设计
依据嵌入式终端系统所要求的功能,划分如下几个任务:①系统监视任务;②GPS采集任务;③GPS数据处理任务;④键盘输入任务;⑤显示器显示输出任务;⑥串行口收发任务;⑦GPRS通信任务;⑧短信任务以及报警任务。
另有3个中断服务程序ISR:①定时中断服务程序;②串口接收中断服务程序;③外部中断服务程序。
图1 μC/OS-II软硬件体系结构
1.2 优先级设计
为了有效利用系统资源,共设计20个不同的优先级,最低优先级OS_ LOWEST_ PRIO 的值设为19,除去系统保留7个优先级外,本系统提供给用户可以使用的优先级个数为12 个[2-3]。
在系统所有任务设计中,由于涉及到车辆安全,实时性要求比较高,所以把报警任务、GPS任务都设计为与中断服务程序ISR相关联。GPS和GPRS通信任务是比较重要的任务,所以优先级别设计较高,而键盘输入任务和显示输出任务实现人机对话功能,实时性要求不高,优先级可以较低,所以各个任务从高到低的优先级设计如下:
监控任务⑥—报警任务⑦—串口收发任务⑧—GPS信号采集任务⑩—GPRS通信任务—短信任务—键盘任务—显示输出任务。
1.3 任务间的同步与通信
系统任务中,串口中断任务与 GPS任务间的通信是利用消息邮箱实现的,使用OSMboxCreat()函数创建一个邮箱,在串口中断任务程序中通过调用OSM boxPost()函数发送信息到邮箱, GPS任务通过调用函数OSMboxPend()接收邮箱中的消息,邮箱接收到OSMboxPend()函数的消息后,启动GPS任务,GPS任务对内存缓冲数据进行解析和处理,之后将解析处理的数据块放入一个共享缓冲区,然后调用事件标志组发送函数OSFlagPend发送置位信号。
GPS任务和定时器ISR决定GPRS任务能否进入就绪状态,本设计中利用OS_FLAG_GRP事件标志组启动GPRS任务 [4],具体步骤是:①利用OSFlagCrea函数创建一个事件标志组:Flag_Gprs=OSFlagCreat(0x00,&err);②在GPS任务中调用事件标志组发送函数,给Flag_Gprs第1标志位发置1信号:OSFlagPost(Flag_Gprs,0x01,OS_FLAG_SET,&err);③在定时中断中调用事件标志组发送函数,给2标志位发信号量1:OSFlagPost(Flag_Gprs,0x02,OS_FLAG_SET,&err);④在GPRS任务中调用事件标志组等待函数:OSFlagPend(Flag_GpS,0x03,OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,0,&ERR)。
当两个信号量都为1时,表示GPS 任务和定时中断都有信号到来,由于等待列表中任务的等待类型为OS_FLAG_ SET_AND,经过逻辑与运算后为1,启动GPRS任务,GPRS任务对共享缓冲区的数据块进行处理后打包,向上位监控中心发送定位信息数据;当两个信号量有一个为0时,GPRS 任务会一直等待事件的到来。等待时间可以设置,防止因为等待事件没有发生而无限期地等待。GPS任务、GPRS任务和ISR之间通信如图3所示。
GPS任务生成定位数据块在共享缓冲区,由显示输出任务和GPRS发送任务使用,由于是共享资源,设计了一个互斥信号量,当有任务需要访问共享缓冲区时,必须调用OSMutexPendJ( )获得互斥信号量才能访问共享数据块,访问结束后,通过调用OSMutexPost()释放该信号量,便于其它任务访问。
2 应用程序设计
2.1 主程序设计
系统启动后,首先执行主函数,初始化ARM硬件,然后启动μC/OS-II操作系统,通过OSTask Create()调用函数创建启动任务,最后调用函数OSStart(),执行启动任务。
2.2 启动任务设计
启动任务时首先创建各分任务, 然后建立通信工具完成任务间通信,调用OSSemCreate()、OSM-boxCreate()、OSMutexCreate()等相关函数,创建信号量邮箱等通信工具,代码如下:
void TaskStart(void*pdata)
{ OS_ENTER_CRITICAL( ); /*关闭中断*/
//设置uC/OS-II时钟中断向量
OS_EXIT_CRITICAl。( ); /*开中断*/
OSStatlnit(); /*初始化统计任务*/
//系统硬件初始化
Timerlnit(); /*初始化定时器*/
LCDlnit(); /*初始化LCD*/
GPSlnit(); /*初始化GPS*/
GPRSlnit(); /* 初始化GPRS*/
//创建其他任务
Sem=OSSemCreate(0);
SemX=OSMutexCreate(2,&err);/*创建信号量*/
Mbox=OSMboxCreate((void*)0);/*创建邮箱*/
Flag_Gprs = OSFlagCreate(0,&error);
OSTaskDel(OS _PROI_SELF); /*删除自己*/
}
2.3 其它任务
本系统任务较多,这里主要介绍GPS采集任务TaskGPS()和GPRS通信任务TaskGPRS()。
GPS任务采用串口中断方式,首先OSSemCreate函数创建信号量Gpssem= OSSemCreate(0),
串口中断服务子程序向GPS任务发送同步信号量OSSemPost(Gpssem);
GPS任务通过调用函数 OSSemPend(Gpssem,0,&error)获取串口中断服务子程序发出的信号量,在获得[专业提供教育论文写作的服务,欢迎光临]该信号量之后,对串口数据进行分析处理,将处理后的数据放入一个共享缓冲区。显示任务和GPRS任务通过调用OSMutexPendJ()函数获得互斥型信号量来对共享数据区进行访问,读取数据后,调用函数OSMutexPost()释放该信号量。
GPRS任务等待读取GPS任务,定时器ISR给事件标志组对应标志位发置1信号,GPRS任务就绪,在收到置位信号后得到CPU控制权,调用相应的函数对共享缓冲区的定位数据进行处理打包,之后向监控中心发送数据信息,任务流程如图2、图3所示[5]。
3 结语
本文设计的GPR/GPRS 车载终端系统,利用嵌入式操作系统μC/OS-II提供的信号量、邮箱和事件标志组实现任务间通信和同步。实验表明该系统具有性能稳定、可靠性高、成本低、易于扩展等特点,实现了对车辆的实时监控。
图2 TaskGPS程序流程 图3 TaskGPRS程序流程
参考文献:
\[1\] 李仁波,朱伟兴.基于ARM7的温室灌溉智能测控仪的设计[J].仪表技术与传感器,2009,6(4):18-20.
本文链接:http://www.qk112.com/lwfw/jsjlw/ruanjianjishu/230009.html