国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

有軌電車軌道模塊中實(shí)時(shí)操作系統(tǒng)的應(yīng)用

2014-07-28 11:29:07趙升艷令曉明
電腦知識(shí)與技術(shù) 2014年18期

趙升艷++令曉明

摘要:該文主要介紹將實(shí)時(shí)操作系統(tǒng)應(yīng)用于有軌電車軌道模塊控制系統(tǒng),通過(guò)實(shí)時(shí)系統(tǒng)彌補(bǔ)離散控制系統(tǒng)實(shí)時(shí)性差的問(wèn)題。采取基于LPC1700的實(shí)時(shí)多任務(wù)操作系統(tǒng)μC/OS-Ⅱ進(jìn)行有軌電車軌道模塊的通信控制,從而實(shí)現(xiàn)了各個(gè)模塊通信的實(shí)時(shí)性。

關(guān)鍵詞:實(shí)時(shí)操作系統(tǒng);軌道模塊;LPC1700;μC/OS-Ⅱ

中圖分類號(hào): TP31 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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 概述

在城市各種公共交通工具中,城市軌道交通具有運(yùn)量大、速度快、安全可靠、污染底等特點(diǎn)[1]。而在軌道交通控制系統(tǒng)中,軌道模塊控制系統(tǒng)是交通運(yùn)營(yíng)方面極為重要的一個(gè)環(huán)節(jié)。傳統(tǒng)的軌道模塊控制系統(tǒng)是離散模塊,離散模塊無(wú)法實(shí)現(xiàn)各個(gè)模塊的通信的實(shí)時(shí)性。因此,為了更好地提高系統(tǒng)的實(shí)時(shí)性,研究將實(shí)時(shí)操作系統(tǒng)應(yīng)用于軌道模塊,已成為完善控制系統(tǒng)十分重要的一個(gè)方面?;谝陨显?,該文研究了有軌電車軌道模塊控制中實(shí)時(shí)多任務(wù)操作系統(tǒng)μC/OS-Ⅱ的應(yīng)用,并通過(guò)實(shí)際應(yīng)用驗(yàn)證了其可行性。

采用基于LPC1700的實(shí)時(shí)多任務(wù)操作系統(tǒng)μC/OS-Ⅱ進(jìn)行有軌電車軌道模塊控制時(shí),首先要將μC/OS-Ⅱ移植到LPC1700微處理器上。μC/OS-Ⅱ是一個(gè)完整的,可移植、固化、裁剪的占先式實(shí)時(shí)多任務(wù)內(nèi)核。μC/OS-Ⅱ是在PC機(jī)上開(kāi)發(fā)和測(cè)試的,但μC/OS-Ⅱ的實(shí)際對(duì)象是嵌入式系統(tǒng),并且很容易移植到不同架構(gòu)的微處理器上[2]。該文將簡(jiǎn)單介紹如何將μC/OS-Ⅱ移植到LPC1700上并且實(shí)現(xiàn)有軌電車軌道模塊控制系統(tǒng)中多任務(wù)的運(yùn)行。

計(jì)算機(jī)在執(zhí)行應(yīng)用程序時(shí),經(jīng)常要用I/O設(shè)備進(jìn)行數(shù)據(jù)的輸入和輸出,而I/O設(shè)備在工作時(shí)總是需要一段時(shí)間的。于是在I/O設(shè)備工作期間,如果CPU沒(méi)有其他任務(wù),那么就只能等待,因此就會(huì)使計(jì)算機(jī)運(yùn)行一個(gè)應(yīng)用程序所花的時(shí)間比較長(zhǎng),也就是說(shuō),這種系統(tǒng)的實(shí)時(shí)性較差。多任務(wù)運(yùn)行的實(shí)現(xiàn)實(shí)際上是靠CPU在許多任務(wù)之間轉(zhuǎn)換和調(diào)度。CPU只有一個(gè),輪番服務(wù)于一系列任務(wù)中的某一個(gè)。多任務(wù)運(yùn)行使CPU的利用率達(dá)到最高,并使應(yīng)用程序模塊化[3]。該文就是使用了多任務(wù),將一個(gè)大的應(yīng)用程序分成相對(duì)獨(dú)立的多個(gè)任務(wù)來(lái)完成,從而給應(yīng)用程序的設(shè)計(jì)和維護(hù)也提供了極大的方便。

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

1) 移植要求

在將實(shí)時(shí)操作系統(tǒng)應(yīng)用在有軌電車軌道模塊控制系統(tǒng)中時(shí),我們采用了LPC1700微處理器,移植過(guò)程在Keil μVision4集成開(kāi)發(fā)環(huán)境上完成。由于LPC1700微處理器支持并能產(chǎn)生中斷、具有堆棧指針、具有CPU內(nèi)部寄存器入棧和出棧指令,并且Keil μVision4的C編譯器可直接在C語(yǔ)言中開(kāi)關(guān)中斷,并支持內(nèi)嵌匯編指令[4]。所以,以Keil μVision4為開(kāi)發(fā)平臺(tái),以LPC1700作為目標(biāo)微處理器來(lái)移植μC/OS-Ⅱ是完全可行的。

2) 需要移植的主要內(nèi)容

需移植的μC/OS-Ⅱ的軟件體系結(jié)構(gòu)如圖1所示。

從圖中我們可以明確知道對(duì)于μC/OS-Ⅱ的移植主要是編寫OS_CPU.H、OS_CPU_C.C和OS_CPU_A.ASM三個(gè)文件中的代碼[5]。

3) 移植后的測(cè)試

在驗(yàn)證移植的μC/OS-Ⅱ是否正常工作時(shí),首先不加任何應(yīng)用代碼來(lái)測(cè)試移植好的μC/OS-Ⅱ,也就是說(shuō),應(yīng)該先測(cè)試內(nèi)核自身的運(yùn)行狀況。這樣做的好處是:如果有些部分沒(méi)有正常工作,我們可以明白是移植本身的問(wèn)題,而不是應(yīng)用代碼產(chǎn)生的問(wèn)題。在進(jìn)行此次移植代碼的測(cè)試時(shí),采用了以下四個(gè)步驟[6]:

① 確保C編譯器、匯編編譯器及鏈接器正常工作;

② 驗(yàn)證OSTaskStkInit()和OSStartHighRdy()函數(shù);

③ 驗(yàn)證OSCtxSw()函數(shù);

④ 驗(yàn)證OSIntCtxSw()和OSTickISR()函數(shù)。

3 有軌電車正線聯(lián)鎖控制系統(tǒng)實(shí)時(shí)多任務(wù)的實(shí)現(xiàn)

μC/OS-Ⅱ的任務(wù)有兩種:用戶任務(wù)和系統(tǒng)任務(wù)。由應(yīng)用程序設(shè)計(jì)者編寫的任務(wù),叫做用戶任務(wù);由系統(tǒng)提供的任務(wù)叫做系統(tǒng)任務(wù)。用戶任務(wù)是為了解決應(yīng)用問(wèn)題而編寫的;系統(tǒng)任務(wù)是為應(yīng)用程序提供某種服務(wù)或?yàn)橄到y(tǒng)本身服務(wù)的[6]。下面的任務(wù)就是針對(duì)有軌電車軌道模塊所設(shè)計(jì)的用戶任務(wù),軌道模塊實(shí)現(xiàn)對(duì)軌道區(qū)段的狀態(tài)采集,將狀態(tài)信息傳至聯(lián)鎖CPU模塊進(jìn)行聯(lián)鎖運(yùn)算,確保行車安全,以下是軌道模塊相關(guān)功能的實(shí)現(xiàn)方式。endprint

1) 雙ARM同步任務(wù)的實(shí)現(xiàn)

在建立此任務(wù)時(shí),由于每次任務(wù)執(zhí)行的時(shí)間必須相同,因此讓雙ARM同步任務(wù)的執(zhí)行時(shí)間是0.5ms。具體實(shí)現(xiàn)方法是:首先為雙ARM同步任務(wù)配置堆??臻g,其代碼為static OS_STK stkARM_synTask[256],并在main()函數(shù)中創(chuàng)建此任務(wù),代碼為OSTaskCreate(CupledTask, (void *)0, &stkCupledTask[sizeof(stkCupledTask) / 4 - 1],12)。其次讓定時(shí)器0每隔0.5ms中斷一次,在每次中斷時(shí),用消息郵箱發(fā)送消息給所有的任務(wù)。發(fā)送消息郵箱的具體步驟是:定義消息郵箱指針:OS_EVENT *Mybox;在main()函數(shù)中創(chuàng)建消息郵箱:Mybox = OSMboxCreate((void *)0),最后發(fā)送消息:OSMboxPostOpt(Mybox,(void *)1,OS_POST_OPT_BROADCAST)。當(dāng)處于掛起狀態(tài)的雙ARM同步任務(wù)接收到消息時(shí),就會(huì)立刻進(jìn)入就緒態(tài),當(dāng)其他更高優(yōu)先級(jí)的任務(wù)運(yùn)行結(jié)束后,此任務(wù)即刻進(jìn)入運(yùn)行態(tài)。進(jìn)入主機(jī)調(diào)試窗口觀察到的結(jié)果如圖2所示。進(jìn)入從機(jī)調(diào)試窗口觀察到的結(jié)果如圖3所示。

2) 采集外線狀態(tài)任務(wù)的實(shí)現(xiàn)

由于信號(hào)采集任務(wù)的優(yōu)先級(jí)高于數(shù)據(jù)處理任務(wù)的優(yōu)先級(jí),即信息傳遞的上游任務(wù)的優(yōu)先級(jí)高于下游任務(wù)的優(yōu)先級(jí),所以讓采集外線狀態(tài)任務(wù)的優(yōu)先級(jí)高于雙ARM同步任務(wù)的優(yōu)先級(jí)[3]。在函數(shù)main()中創(chuàng)建此任務(wù),其代碼為:OSTaskCreate(GatherTask, (void *)0, &stkGatherTask[sizeof(stkGatherTask) / 4 - 1], 8)。同樣地,當(dāng)任務(wù)接收到消息郵箱發(fā)送來(lái)的消息后,且任務(wù)處于就緒態(tài)任務(wù)的最高優(yōu)先級(jí)時(shí)立刻進(jìn)入運(yùn)行態(tài)。其采集到的外線狀態(tài)的結(jié)果如圖4所示。

3) 解析聯(lián)鎖命令任務(wù)的實(shí)現(xiàn)

解析聯(lián)鎖命令任務(wù)是比較關(guān)鍵的任務(wù),為避免由于聯(lián)鎖命令的漏解析,使得控制系統(tǒng)發(fā)出錯(cuò)誤的控制指令,我們將此任務(wù)的優(yōu)先級(jí)設(shè)得比較高,創(chuàng)建任務(wù)的代碼為:OSTaskCreate(ParseTask, (void *)0, &stkParseTask[sizeof(stkParseTask) / 4 - 1], 6),當(dāng)有新數(shù)據(jù)到達(dá)時(shí),判斷第一路、第二路有無(wú)命令,如果有命令,判斷是否為請(qǐng)求命令,若是請(qǐng)求命令,且有請(qǐng)求數(shù)據(jù)時(shí),讀取請(qǐng)求數(shù)據(jù)的幀序號(hào)。

4) 驅(qū)動(dòng)繼電器動(dòng)作任務(wù)的實(shí)現(xiàn)

將驅(qū)動(dòng)繼電器動(dòng)作任務(wù)創(chuàng)建為主任務(wù),且優(yōu)先級(jí)為創(chuàng)建的任務(wù)中最高的優(yōu)先級(jí):OSTaskCreate(mainTask, (void *)0, &stkMainTask[sizeof(stkMainTask) / 4 - 1],4),我們?cè)诎才湃蝿?wù)的優(yōu)先級(jí)時(shí),設(shè)計(jì)了一定的冗余,這樣就為以后增加新任務(wù)提供方便,即當(dāng)要?jiǎng)?chuàng)建新的任務(wù)而不知道優(yōu)先級(jí)是多少時(shí),就可以在不改變現(xiàn)有任務(wù)優(yōu)先級(jí)的情況下,很容易根據(jù)需要找到一個(gè)合適的空閑優(yōu)先級(jí)。驅(qū)動(dòng)繼電器動(dòng)作的命令如圖5所示。

5) CPU運(yùn)行燈控制任務(wù)的實(shí)現(xiàn)

CPU運(yùn)行燈控制任務(wù)的實(shí)現(xiàn)采用接收二值信號(hào)量的方法,二值信號(hào)量的使用范圍是:被控制方總能夠及時(shí)響應(yīng)控制方發(fā)出的信號(hào),完成相應(yīng)處理器任務(wù),并在下一次信號(hào)來(lái)到之前進(jìn)入等待狀態(tài)[6]。OSTaskCreate(CupledTask, (void *)0, &stkCupledTask[sizeof(stkCupledTask) / 4 - 1],12)是創(chuàng)建CPU運(yùn)行燈控制任務(wù)的代碼,中斷處理函數(shù)每到100ms時(shí)給CPU運(yùn)行控制任務(wù)發(fā)送二值信號(hào)量:OSSemPost(CpuSem),當(dāng)任務(wù)接收到二值信號(hào)量時(shí),即刻進(jìn)入就緒態(tài)。

6) 串口2發(fā)送數(shù)據(jù)任務(wù)的實(shí)現(xiàn)

與CPU運(yùn)行燈控制任務(wù)類似,串口2發(fā)送數(shù)據(jù)任務(wù)也通過(guò)接收二值信號(hào)量的方法,當(dāng)定時(shí)器0每隔50ms時(shí),發(fā)送信號(hào)量,任務(wù)先進(jìn)行發(fā)送數(shù)據(jù)的配置,包括幀頭、幀尾、第一路采集狀態(tài)數(shù)據(jù)、第二路采集狀態(tài)數(shù)據(jù)、數(shù)據(jù)校驗(yàn)和等,待接收到信號(hào)量時(shí)即刻向CPU發(fā)送數(shù)據(jù)[7]。如圖6所示為執(zhí)行CPU通過(guò)串口2向監(jiān)測(cè)CPU發(fā)送的數(shù)據(jù),其中FE是幀頭,EF為幀尾,55和55分別是第一路和第二路軌道采集狀態(tài),33和44分別為第三路和第四路軌道采集狀態(tài),66為故障信息,78為校驗(yàn)和。從圖中我們可以看出監(jiān)測(cè)CPU能成功地接收到執(zhí)行CPU發(fā)送的數(shù)據(jù)。

4 總結(jié)

針對(duì)有軌電車軌道模塊控制系統(tǒng)中,實(shí)時(shí)性較差的問(wèn)題,采用了基于LPC1700的μC/OS-Ⅱ?qū)崟r(shí)操作系統(tǒng),已實(shí)現(xiàn)各模塊通信的實(shí)時(shí)性。從文中通信數(shù)據(jù)結(jié)果中可以看出,采用了實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ的各模塊能有效滿足有軌電車軌道模塊控制系統(tǒng)實(shí)時(shí)性的要求,可以對(duì)軌道區(qū)段的狀態(tài)信息進(jìn)行實(shí)時(shí)采集,并將狀態(tài)信息傳至聯(lián)鎖CPU模塊進(jìn)行聯(lián)鎖運(yùn)算,確保了行車安全,具有一定的現(xiàn)實(shí)意義。

參考文獻(xiàn):

[1] 耿幸福,徐新玉,張國(guó)保.城市軌道交通行車組織[M].北京:人民交通出版社,2010:2-10.

[2] Jean J.Labrosse.嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ[M].邵貝貝,等,譯.北京:北京航空航天大學(xué)出版社,2003:116-281.

[3] 任哲.嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ原理及應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2009:42-187.

[4] 周立功等.深入淺出Cortex-M3—LPC1700(上冊(cè))[M].廣州:廣州致遠(yuǎn)電子有限公司,2009:213-377.

[5] 顧鳳玉,施國(guó)梁,楊濤.基于LPC2478的μC/OS-Ⅱ的移植及多任務(wù)的實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2009,5(7):1776-1779.

[6] 周航慈.基于嵌入式實(shí)時(shí)操作系統(tǒng)的程序設(shè)計(jì)技術(shù)[M].北京:北京航空航天大學(xué)出版社,2011:50-160.

[7] 周立功,等.深入淺出Cortex-M3—LPC1700(下冊(cè))[M].廣州:廣州致遠(yuǎn)電子有限公司,2009:142-200.endprint

1) 雙ARM同步任務(wù)的實(shí)現(xiàn)

在建立此任務(wù)時(shí),由于每次任務(wù)執(zhí)行的時(shí)間必須相同,因此讓雙ARM同步任務(wù)的執(zhí)行時(shí)間是0.5ms。具體實(shí)現(xiàn)方法是:首先為雙ARM同步任務(wù)配置堆棧空間,其代碼為static OS_STK stkARM_synTask[256],并在main()函數(shù)中創(chuàng)建此任務(wù),代碼為OSTaskCreate(CupledTask, (void *)0, &stkCupledTask[sizeof(stkCupledTask) / 4 - 1],12)。其次讓定時(shí)器0每隔0.5ms中斷一次,在每次中斷時(shí),用消息郵箱發(fā)送消息給所有的任務(wù)。發(fā)送消息郵箱的具體步驟是:定義消息郵箱指針:OS_EVENT *Mybox;在main()函數(shù)中創(chuàng)建消息郵箱:Mybox = OSMboxCreate((void *)0),最后發(fā)送消息:OSMboxPostOpt(Mybox,(void *)1,OS_POST_OPT_BROADCAST)。當(dāng)處于掛起狀態(tài)的雙ARM同步任務(wù)接收到消息時(shí),就會(huì)立刻進(jìn)入就緒態(tài),當(dāng)其他更高優(yōu)先級(jí)的任務(wù)運(yùn)行結(jié)束后,此任務(wù)即刻進(jìn)入運(yùn)行態(tài)。進(jìn)入主機(jī)調(diào)試窗口觀察到的結(jié)果如圖2所示。進(jìn)入從機(jī)調(diào)試窗口觀察到的結(jié)果如圖3所示。

2) 采集外線狀態(tài)任務(wù)的實(shí)現(xiàn)

由于信號(hào)采集任務(wù)的優(yōu)先級(jí)高于數(shù)據(jù)處理任務(wù)的優(yōu)先級(jí),即信息傳遞的上游任務(wù)的優(yōu)先級(jí)高于下游任務(wù)的優(yōu)先級(jí),所以讓采集外線狀態(tài)任務(wù)的優(yōu)先級(jí)高于雙ARM同步任務(wù)的優(yōu)先級(jí)[3]。在函數(shù)main()中創(chuàng)建此任務(wù),其代碼為:OSTaskCreate(GatherTask, (void *)0, &stkGatherTask[sizeof(stkGatherTask) / 4 - 1], 8)。同樣地,當(dāng)任務(wù)接收到消息郵箱發(fā)送來(lái)的消息后,且任務(wù)處于就緒態(tài)任務(wù)的最高優(yōu)先級(jí)時(shí)立刻進(jìn)入運(yùn)行態(tài)。其采集到的外線狀態(tài)的結(jié)果如圖4所示。

3) 解析聯(lián)鎖命令任務(wù)的實(shí)現(xiàn)

解析聯(lián)鎖命令任務(wù)是比較關(guān)鍵的任務(wù),為避免由于聯(lián)鎖命令的漏解析,使得控制系統(tǒng)發(fā)出錯(cuò)誤的控制指令,我們將此任務(wù)的優(yōu)先級(jí)設(shè)得比較高,創(chuàng)建任務(wù)的代碼為:OSTaskCreate(ParseTask, (void *)0, &stkParseTask[sizeof(stkParseTask) / 4 - 1], 6),當(dāng)有新數(shù)據(jù)到達(dá)時(shí),判斷第一路、第二路有無(wú)命令,如果有命令,判斷是否為請(qǐng)求命令,若是請(qǐng)求命令,且有請(qǐng)求數(shù)據(jù)時(shí),讀取請(qǐng)求數(shù)據(jù)的幀序號(hào)。

4) 驅(qū)動(dòng)繼電器動(dòng)作任務(wù)的實(shí)現(xiàn)

將驅(qū)動(dòng)繼電器動(dòng)作任務(wù)創(chuàng)建為主任務(wù),且優(yōu)先級(jí)為創(chuàng)建的任務(wù)中最高的優(yōu)先級(jí):OSTaskCreate(mainTask, (void *)0, &stkMainTask[sizeof(stkMainTask) / 4 - 1],4),我們?cè)诎才湃蝿?wù)的優(yōu)先級(jí)時(shí),設(shè)計(jì)了一定的冗余,這樣就為以后增加新任務(wù)提供方便,即當(dāng)要?jiǎng)?chuàng)建新的任務(wù)而不知道優(yōu)先級(jí)是多少時(shí),就可以在不改變現(xiàn)有任務(wù)優(yōu)先級(jí)的情況下,很容易根據(jù)需要找到一個(gè)合適的空閑優(yōu)先級(jí)。驅(qū)動(dòng)繼電器動(dòng)作的命令如圖5所示。

5) CPU運(yùn)行燈控制任務(wù)的實(shí)現(xiàn)

CPU運(yùn)行燈控制任務(wù)的實(shí)現(xiàn)采用接收二值信號(hào)量的方法,二值信號(hào)量的使用范圍是:被控制方總能夠及時(shí)響應(yīng)控制方發(fā)出的信號(hào),完成相應(yīng)處理器任務(wù),并在下一次信號(hào)來(lái)到之前進(jìn)入等待狀態(tài)[6]。OSTaskCreate(CupledTask, (void *)0, &stkCupledTask[sizeof(stkCupledTask) / 4 - 1],12)是創(chuàng)建CPU運(yùn)行燈控制任務(wù)的代碼,中斷處理函數(shù)每到100ms時(shí)給CPU運(yùn)行控制任務(wù)發(fā)送二值信號(hào)量:OSSemPost(CpuSem),當(dāng)任務(wù)接收到二值信號(hào)量時(shí),即刻進(jìn)入就緒態(tài)。

6) 串口2發(fā)送數(shù)據(jù)任務(wù)的實(shí)現(xiàn)

與CPU運(yùn)行燈控制任務(wù)類似,串口2發(fā)送數(shù)據(jù)任務(wù)也通過(guò)接收二值信號(hào)量的方法,當(dāng)定時(shí)器0每隔50ms時(shí),發(fā)送信號(hào)量,任務(wù)先進(jìn)行發(fā)送數(shù)據(jù)的配置,包括幀頭、幀尾、第一路采集狀態(tài)數(shù)據(jù)、第二路采集狀態(tài)數(shù)據(jù)、數(shù)據(jù)校驗(yàn)和等,待接收到信號(hào)量時(shí)即刻向CPU發(fā)送數(shù)據(jù)[7]。如圖6所示為執(zhí)行CPU通過(guò)串口2向監(jiān)測(cè)CPU發(fā)送的數(shù)據(jù),其中FE是幀頭,EF為幀尾,55和55分別是第一路和第二路軌道采集狀態(tài),33和44分別為第三路和第四路軌道采集狀態(tài),66為故障信息,78為校驗(yàn)和。從圖中我們可以看出監(jiān)測(cè)CPU能成功地接收到執(zhí)行CPU發(fā)送的數(shù)據(jù)。

4 總結(jié)

針對(duì)有軌電車軌道模塊控制系統(tǒng)中,實(shí)時(shí)性較差的問(wèn)題,采用了基于LPC1700的μC/OS-Ⅱ?qū)崟r(shí)操作系統(tǒng),已實(shí)現(xiàn)各模塊通信的實(shí)時(shí)性。從文中通信數(shù)據(jù)結(jié)果中可以看出,采用了實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ的各模塊能有效滿足有軌電車軌道模塊控制系統(tǒng)實(shí)時(shí)性的要求,可以對(duì)軌道區(qū)段的狀態(tài)信息進(jìn)行實(shí)時(shí)采集,并將狀態(tài)信息傳至聯(lián)鎖CPU模塊進(jìn)行聯(lián)鎖運(yùn)算,確保了行車安全,具有一定的現(xiàn)實(shí)意義。

參考文獻(xiàn):

[1] 耿幸福,徐新玉,張國(guó)保.城市軌道交通行車組織[M].北京:人民交通出版社,2010:2-10.

[2] Jean J.Labrosse.嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ[M].邵貝貝,等,譯.北京:北京航空航天大學(xué)出版社,2003:116-281.

[3] 任哲.嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ原理及應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2009:42-187.

[4] 周立功等.深入淺出Cortex-M3—LPC1700(上冊(cè))[M].廣州:廣州致遠(yuǎn)電子有限公司,2009:213-377.

[5] 顧鳳玉,施國(guó)梁,楊濤.基于LPC2478的μC/OS-Ⅱ的移植及多任務(wù)的實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2009,5(7):1776-1779.

[6] 周航慈.基于嵌入式實(shí)時(shí)操作系統(tǒng)的程序設(shè)計(jì)技術(shù)[M].北京:北京航空航天大學(xué)出版社,2011:50-160.

[7] 周立功,等.深入淺出Cortex-M3—LPC1700(下冊(cè))[M].廣州:廣州致遠(yuǎn)電子有限公司,2009:142-200.endprint

1) 雙ARM同步任務(wù)的實(shí)現(xiàn)

在建立此任務(wù)時(shí),由于每次任務(wù)執(zhí)行的時(shí)間必須相同,因此讓雙ARM同步任務(wù)的執(zhí)行時(shí)間是0.5ms。具體實(shí)現(xiàn)方法是:首先為雙ARM同步任務(wù)配置堆??臻g,其代碼為static OS_STK stkARM_synTask[256],并在main()函數(shù)中創(chuàng)建此任務(wù),代碼為OSTaskCreate(CupledTask, (void *)0, &stkCupledTask[sizeof(stkCupledTask) / 4 - 1],12)。其次讓定時(shí)器0每隔0.5ms中斷一次,在每次中斷時(shí),用消息郵箱發(fā)送消息給所有的任務(wù)。發(fā)送消息郵箱的具體步驟是:定義消息郵箱指針:OS_EVENT *Mybox;在main()函數(shù)中創(chuàng)建消息郵箱:Mybox = OSMboxCreate((void *)0),最后發(fā)送消息:OSMboxPostOpt(Mybox,(void *)1,OS_POST_OPT_BROADCAST)。當(dāng)處于掛起狀態(tài)的雙ARM同步任務(wù)接收到消息時(shí),就會(huì)立刻進(jìn)入就緒態(tài),當(dāng)其他更高優(yōu)先級(jí)的任務(wù)運(yùn)行結(jié)束后,此任務(wù)即刻進(jìn)入運(yùn)行態(tài)。進(jìn)入主機(jī)調(diào)試窗口觀察到的結(jié)果如圖2所示。進(jìn)入從機(jī)調(diào)試窗口觀察到的結(jié)果如圖3所示。

2) 采集外線狀態(tài)任務(wù)的實(shí)現(xiàn)

由于信號(hào)采集任務(wù)的優(yōu)先級(jí)高于數(shù)據(jù)處理任務(wù)的優(yōu)先級(jí),即信息傳遞的上游任務(wù)的優(yōu)先級(jí)高于下游任務(wù)的優(yōu)先級(jí),所以讓采集外線狀態(tài)任務(wù)的優(yōu)先級(jí)高于雙ARM同步任務(wù)的優(yōu)先級(jí)[3]。在函數(shù)main()中創(chuàng)建此任務(wù),其代碼為:OSTaskCreate(GatherTask, (void *)0, &stkGatherTask[sizeof(stkGatherTask) / 4 - 1], 8)。同樣地,當(dāng)任務(wù)接收到消息郵箱發(fā)送來(lái)的消息后,且任務(wù)處于就緒態(tài)任務(wù)的最高優(yōu)先級(jí)時(shí)立刻進(jìn)入運(yùn)行態(tài)。其采集到的外線狀態(tài)的結(jié)果如圖4所示。

3) 解析聯(lián)鎖命令任務(wù)的實(shí)現(xiàn)

解析聯(lián)鎖命令任務(wù)是比較關(guān)鍵的任務(wù),為避免由于聯(lián)鎖命令的漏解析,使得控制系統(tǒng)發(fā)出錯(cuò)誤的控制指令,我們將此任務(wù)的優(yōu)先級(jí)設(shè)得比較高,創(chuàng)建任務(wù)的代碼為:OSTaskCreate(ParseTask, (void *)0, &stkParseTask[sizeof(stkParseTask) / 4 - 1], 6),當(dāng)有新數(shù)據(jù)到達(dá)時(shí),判斷第一路、第二路有無(wú)命令,如果有命令,判斷是否為請(qǐng)求命令,若是請(qǐng)求命令,且有請(qǐng)求數(shù)據(jù)時(shí),讀取請(qǐng)求數(shù)據(jù)的幀序號(hào)。

4) 驅(qū)動(dòng)繼電器動(dòng)作任務(wù)的實(shí)現(xiàn)

將驅(qū)動(dòng)繼電器動(dòng)作任務(wù)創(chuàng)建為主任務(wù),且優(yōu)先級(jí)為創(chuàng)建的任務(wù)中最高的優(yōu)先級(jí):OSTaskCreate(mainTask, (void *)0, &stkMainTask[sizeof(stkMainTask) / 4 - 1],4),我們?cè)诎才湃蝿?wù)的優(yōu)先級(jí)時(shí),設(shè)計(jì)了一定的冗余,這樣就為以后增加新任務(wù)提供方便,即當(dāng)要?jiǎng)?chuàng)建新的任務(wù)而不知道優(yōu)先級(jí)是多少時(shí),就可以在不改變現(xiàn)有任務(wù)優(yōu)先級(jí)的情況下,很容易根據(jù)需要找到一個(gè)合適的空閑優(yōu)先級(jí)。驅(qū)動(dòng)繼電器動(dòng)作的命令如圖5所示。

5) CPU運(yùn)行燈控制任務(wù)的實(shí)現(xiàn)

CPU運(yùn)行燈控制任務(wù)的實(shí)現(xiàn)采用接收二值信號(hào)量的方法,二值信號(hào)量的使用范圍是:被控制方總能夠及時(shí)響應(yīng)控制方發(fā)出的信號(hào),完成相應(yīng)處理器任務(wù),并在下一次信號(hào)來(lái)到之前進(jìn)入等待狀態(tài)[6]。OSTaskCreate(CupledTask, (void *)0, &stkCupledTask[sizeof(stkCupledTask) / 4 - 1],12)是創(chuàng)建CPU運(yùn)行燈控制任務(wù)的代碼,中斷處理函數(shù)每到100ms時(shí)給CPU運(yùn)行控制任務(wù)發(fā)送二值信號(hào)量:OSSemPost(CpuSem),當(dāng)任務(wù)接收到二值信號(hào)量時(shí),即刻進(jìn)入就緒態(tài)。

6) 串口2發(fā)送數(shù)據(jù)任務(wù)的實(shí)現(xiàn)

與CPU運(yùn)行燈控制任務(wù)類似,串口2發(fā)送數(shù)據(jù)任務(wù)也通過(guò)接收二值信號(hào)量的方法,當(dāng)定時(shí)器0每隔50ms時(shí),發(fā)送信號(hào)量,任務(wù)先進(jìn)行發(fā)送數(shù)據(jù)的配置,包括幀頭、幀尾、第一路采集狀態(tài)數(shù)據(jù)、第二路采集狀態(tài)數(shù)據(jù)、數(shù)據(jù)校驗(yàn)和等,待接收到信號(hào)量時(shí)即刻向CPU發(fā)送數(shù)據(jù)[7]。如圖6所示為執(zhí)行CPU通過(guò)串口2向監(jiān)測(cè)CPU發(fā)送的數(shù)據(jù),其中FE是幀頭,EF為幀尾,55和55分別是第一路和第二路軌道采集狀態(tài),33和44分別為第三路和第四路軌道采集狀態(tài),66為故障信息,78為校驗(yàn)和。從圖中我們可以看出監(jiān)測(cè)CPU能成功地接收到執(zhí)行CPU發(fā)送的數(shù)據(jù)。

4 總結(jié)

針對(duì)有軌電車軌道模塊控制系統(tǒng)中,實(shí)時(shí)性較差的問(wèn)題,采用了基于LPC1700的μC/OS-Ⅱ?qū)崟r(shí)操作系統(tǒng),已實(shí)現(xiàn)各模塊通信的實(shí)時(shí)性。從文中通信數(shù)據(jù)結(jié)果中可以看出,采用了實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ的各模塊能有效滿足有軌電車軌道模塊控制系統(tǒng)實(shí)時(shí)性的要求,可以對(duì)軌道區(qū)段的狀態(tài)信息進(jìn)行實(shí)時(shí)采集,并將狀態(tài)信息傳至聯(lián)鎖CPU模塊進(jìn)行聯(lián)鎖運(yùn)算,確保了行車安全,具有一定的現(xiàn)實(shí)意義。

參考文獻(xiàn):

[1] 耿幸福,徐新玉,張國(guó)保.城市軌道交通行車組織[M].北京:人民交通出版社,2010:2-10.

[2] Jean J.Labrosse.嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ[M].邵貝貝,等,譯.北京:北京航空航天大學(xué)出版社,2003:116-281.

[3] 任哲.嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ原理及應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2009:42-187.

[4] 周立功等.深入淺出Cortex-M3—LPC1700(上冊(cè))[M].廣州:廣州致遠(yuǎn)電子有限公司,2009:213-377.

[5] 顧鳳玉,施國(guó)梁,楊濤.基于LPC2478的μC/OS-Ⅱ的移植及多任務(wù)的實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2009,5(7):1776-1779.

[6] 周航慈.基于嵌入式實(shí)時(shí)操作系統(tǒng)的程序設(shè)計(jì)技術(shù)[M].北京:北京航空航天大學(xué)出版社,2011:50-160.

[7] 周立功,等.深入淺出Cortex-M3—LPC1700(下冊(cè))[M].廣州:廣州致遠(yuǎn)電子有限公司,2009:142-200.endprint

宝清县| 岳池县| 沂源县| 龙胜| 博兴县| 揭阳市| 怀集县| 宜阳县| 十堰市| 静安区| 松桃| 连山| 盐边县| 桦甸市| 临汾市| 湟中县| 普安县| 镇江市| 崇阳县| 长寿区| 香格里拉县| 舞阳县| 八宿县| 甘孜县| 黄龙县| 九寨沟县| 平罗县| 汉寿县| 襄垣县| 乌拉特中旗| 林口县| 济宁市| 古交市| 新余市| 交口县| 仁怀市| 石家庄市| 济宁市| 织金县| 宣武区| 抚松县|