有轨电车轨道模块中实时操作系统的应用

摘要:该文主要介绍将实时操作系统应用于有轨电车轨道模块控制系统,通过实时系统弥补离散控制系统实时性差的问题。采取基于LPC1700的实时多任务操作系统μC/OS-Ⅱ进行有轨电车轨道模块的通信控制,从而实现了各个模块通信的实时性。

关键词:实时操作系统;轨道模块;LPC1700;μC/OS-Ⅱ

中图分类号: TP31 文献标识码:A 文章编号:1009-3044(2014)18-4341-03

The Application of Real-time Operating System in the Track Module of the Tram

ZHAO Sheng-yan, LING Xiao-ming

(Lanzhou Jiaotong University, Lanzhou 730070, China)

Abstract: In this paper, a real-time control system was used to the orbital module control system of the tram"s main track,, through the real-time system we solved the problem of poor real-time in discrete control system.By using the real-time multitasking operating system named μC/OS-Ⅱwhich based on LPC1700,we control the communication of the tram"s track module and implement the real-time communication of the modules.

Key words: RTOS(real-time operating system); orbital module; LPC1700; μC/OS-Ⅱ

1 概述

在城市各种公共交通工具中,城市轨道交通具有运量大、速度快、安全可靠、污染底等特点[1]。而在轨道交通控制系统中,轨道模块控制系统是交通运营方面极为重要的一个环节。传统的轨道模块控制系统是离散模块,离散模块无法实现各个模块的通信的实时性。因此,为了更好地提高系统的实时性,研究将实时操作系统应用于轨道模块,已成为完善控制系统十分重要的一个方面。基于以上原因,该文研究了有轨电车轨道模块控制中实时多任务操作系统μC/OS-Ⅱ的应用,并通过实际应用验证了其可行性。

采用基于LPC1700的实时多任务操作系统μC/OS-Ⅱ进行有轨电车轨道模块控制时,首先要将μC/OS-Ⅱ移植到LPC1700微处理器上。μC/OS-Ⅱ是一个完整的,可移植、固化、裁剪的占先式实时多任务内核。μC/OS-Ⅱ是在PC机上开发和测试的,但μC/OS-Ⅱ的实际对象是嵌入式系统,并且很容易移植到不同架构的微处理器上[2]。该文将简单介绍如何将μC/OS-Ⅱ移植到LPC1700上并且实现有轨电车轨道模块控制系统中多任务的运行。

计算机在执行应用程序时,经常要用I/O设备进行数据的输入和输出,而I/O设备在工作时总是需要一段时间的。于是在I/O设备工作期间,如果CPU没有其他任务,那么就只能等待,因此就会使计算机运行一个应用程序所花的时间比较长,也就是说,这种系统的实时性较差。多任务运行的实现实际上是靠CPU在许多任务之间转换和调度。CPU只有一个,轮番服务于一系列任务中的某一个。多任务运行使CPU的利用率达到最高,并使应用程序模块化[3]。该文就是使用了多任务,将一个大的应用程序分成相对独立的多个任务来完成,从而给应用程序的设计和维护也提供了极大的方便。

2 基于LPC1700的μC/OS-Ⅱ的移植

1) 移植要求

在将实时操作系统应用在有轨电车轨道模块控制系统中时,我们采用了LPC1700微处理器,移植过程在Keil μVision4集成开发环境上完成。由于LPC1700微处理器支持并能产生中断、具有堆栈指针、具有CPU内部寄存器入栈和出栈指令,并且Keil μVision4的C编译器可直接在C语言中开关中断,并支持内嵌汇编指令[4]。所以,以Keil μVision4为开发平台,以LPC1700作为目标微处理器来移植μC/OS-Ⅱ是完全可行的。

2) 需要移植的主要内容

需移植的μC/OS-Ⅱ的软件体系结构如图1所示。

从图中我们可以明确知道对于μC/OS-Ⅱ的移植主要是编写OS_CPU.H、OS_CPU_C.C和OS_CPU_A.ASM三个文件中的代码[5]。

3) 移植后的测试

在验证移植的μC/OS-Ⅱ是否正常工作时,首先不加任何应用代码来测试移植好的μC/OS-Ⅱ,也就是说,应该先测试内核自身的运行状况。这样做的好处是:如果有些部分没有正常工作,我们可以明白是移植本身的问题,而不是应用代码产生的问题。在进行此次移植代码的测试时,采用了以下四个步骤[6]:

① 确保C编译器、汇编编译器及链接器正常工作;

② 验证OSTaskStkInit()和OSStartHighRdy()函数;

③ 验证OSCtxSw()函数;

④ 验证OSIntCtxSw()和OSTickISR()函数。

3 有轨电车正线联锁控制系统实时多任务的实现

μC/OS-Ⅱ的任务有两种:用户任务和系统任务。由应用程序设计者编写的任务,叫做用户任务;由系统提供的任务叫做系统任务。用户任务是为了解决应用问题而编写的;系统任务是为应用程序提供某种服务或为系统本身服务的[6]。下面的任务就是针对有轨电车轨道模块所设计的用户任务,轨道模块实现对轨道区段的状态采集,将状态信息传至联锁CPU模块进行联锁运算,确保行车安全,以下是轨道模块相关功能的实现方式。

1) 双ARM同步任务的实现

在建立此任务时,由于每次任务执行的时间必须相同,因此让双ARM同步任务的执行时间是0.5ms。具体实现方法是:首先为双ARM同步任务配置堆栈空间,其代码为static OS_STK stkARM_synTask[256],并在main()函数中创建此任务,代码为OSTaskCreate(CupledTask, (void *)0, &stkCupledTask[sizeof(stkCupledTask) / 4 - 1],12)。其次让定时器0每隔0.5ms中断一次,在每次中断时,用消息邮箱发送消息给所有的任务。发送消息邮箱的具体步骤是:定义消息邮箱指针:OS_EVENT *Mybox;在main()函数中创建消息邮箱:Mybox = OSMboxCreate((void *)0),最后发送消息:OSMboxPostOpt(Mybox,(void *)1,OS_POST_OPT_BROADCAST)。当处于挂起状态的双ARM同步任务接收到消息时,就会立刻进入就绪态,当其他更高优先级的任务运行结束后,此任务即刻进入运行态。进入主机调试窗口观察到的结果如图2所示。进入从机调试窗口观察到的结果如图3所示。

2) 采集外线状态任务的实现

由于信号采集任务的优先级高于数据处理任务的优先级,即信息传递的上游任务的优先级高于下游任务的优先级,所以让采集外线状态任务的优先级高于双ARM同步任务的优先级[3]。在函数main()中创建此任务,其代码为:OSTaskCreate(GatherTask, (void *)0, &stkGatherTask[sizeof(stkGatherTask) / 4 - 1], 8)。同样地,当任务接收到消息邮箱发送来的消息后,且任务处于就绪态任务的最高优先级时立刻进入运行态。其采集到的外线状态的结果如图4所示。

3) 解析联锁命令任务的实现

解析联锁命令任务是比较关键的任务,为避免由于联锁命令的漏解析,使得控制系统发出错误的控制指令,我们将此任务的优先级设得比较高,创建任务的代码为:OSTaskCreate(ParseTask, (void *)0, &stkParseTask[sizeof(stkParseTask) / 4 - 1], 6),当有新数据到达时,判断第一路、第二路有无命令,如果有命令,判断是否为请求命令,若是请求命令,且有请求数据时,读取请求数据的帧序号。

4) 驱动继电器动作任务的实现

将驱动继电器动作任务创建为主任务,且优先级为创建的任务中最高的优先级:OSTaskCreate(mainTask, (void *)0, &stkMainTask[sizeof(stkMainTask) / 4 - 1],4),我们在安排任务的优先级时,设计了一定的冗余,这样就为以后增加新任务提供方便,即当要创建新的任务而不知道优先级是多少时,就可以在不改变现有任务优先级的情况下,很容易根据需要找到一个合适的空闲优先级。驱动继电器动作的命令如图5所示。

5) CPU运行灯控制任务的实现

CPU运行灯控制任务的实现采用接收二值信号量的方法,二值信号量的使用范围是:被控制方总能够及时响应控制方发出的信号,完成相应处理器任务,并在下一次信号来到之前进入等待状态[6]。OSTaskCreate(CupledTask, (void *)0, &stkCupledTask[sizeof(stkCupledTask) / 4 - 1],12)是创建CPU运行灯控制任务的代码,中断处理函数每到100ms时给CPU运行控制任务发送二值信号量:OSSemPost(CpuSem),当任务接收到二值信号量时,即刻进入就绪态。

6) 串口2发送数据任务的实现

与CPU运行灯控制任务类似,串口2发送数据任务也通过接收二值信号量的方法,当定时器0每隔50ms时,发送信号量,任务先进行发送数据的配置,包括帧头、帧尾、第一路采集状态数据、第二路采集状态数据、数据校验和等,待接收到信号量时即刻向CPU发送数据[7]。如图6所示为执行CPU通过串口2向监测CPU发送的数据,其中FE是帧头,EF为帧尾,55和55分别是第一路和第二路轨道采集状态,33和44分别为第三路和第四路轨道采集状态,66为故障信息,78为校验和。从图中我们可以看出监测CPU能成功地接收到执行CPU发送的数据。

4 总结

针对有轨电车轨道模块控制系统中,实时性较差的问题,采用了基于LPC1700的μC/OS-Ⅱ实时操作系统,已实现各模块通信的实时性。从文中通信数据结果中可以看出,采用了实时操作系统μC/OS-Ⅱ的各模块能有效满足有轨电车轨道模块控制系统实时性的要求,可以对轨道区段的状态信息进行实时采集,并将状态信息传至联锁CPU模块进行联锁运算,确保了行车安全,具有一定的现实意义。

参考文献:

[1] 耿幸福,徐新玉,张国保.城市轨道交通行车组织[M].北京:人民交通出版社,2010:2-10.

[2] Jean J.Labrosse.嵌入式实时操作系统μC/OS-Ⅱ[M].邵贝贝,等,译.北京:北京航空航天大学出版社,2003:116-281.

[3] 任哲.嵌入式实时操作系统μC/OS-Ⅱ原理及应用[M].北京:北京航空航天大学出版社,2009:42-187.

[4] 周立功等.深入浅出Cortex-M3—LPC1700(上册)[M].广州:广州致远电子有限公司,2009:213-377.

[5] 顾凤玉,施国梁,杨涛.基于LPC2478的μC/OS-Ⅱ的移植及多任务的实现[J].电脑知识与技术,2009,5(7):1776-1779.

[6] 周航慈.基于嵌入式实时操作系统的程序设计技术[M].北京:北京航空航天大学出版社,2011:50-160.

[7] 周立功,等.深入浅出Cortex-M3—LPC1700(下册)[M].广州:广州致远电子有限公司,2009:142-200.

推荐访问:轨道 实时 模块 操作系统 有轨电车