基于CygnalF040的RTOS51的研究與開發(fā)
0.引 言
目前,我國(guó)對(duì)于大部分供電電力設(shè)備的監(jiān)控和管理上基本還停留在人工巡查這種比較原始的管理方式下(例如鐵路道口的信號(hào)電源),不但管理效率低下,而且供電質(zhì)量和水平都得不到有效的保證。本文以實(shí)時(shí)操作系統(tǒng)small RTOS51為基礎(chǔ),主要探討了一個(gè)用于電力系統(tǒng)現(xiàn)場(chǎng)監(jiān)控終端單元的設(shè)計(jì)過程,希望能夠?yàn)樘岣吲潆娮詣?dòng)化水平提供一些思路,盡一點(diǎn)微薄之力。
1.Small RTOS51多任務(wù)實(shí)時(shí)操作系統(tǒng)
Small RTOS51是一個(gè)源代碼公開的多任務(wù)實(shí)時(shí)操作系統(tǒng),它可以簡(jiǎn)化那些復(fù)雜而且對(duì)時(shí)間要求嚴(yán)格的工程軟件設(shè)計(jì)工作。它具有公開源代碼、可移植、可固化、占先式、中斷管理及RAM 需求小等特點(diǎn)。
2.系統(tǒng)功能描述
本故障診斷終端主要應(yīng)用在鐵路道口信號(hào)燈電源的監(jiān)控與管理,針對(duì)該故障診斷終端應(yīng)用的具體場(chǎng)合,在設(shè)計(jì)時(shí)主要考慮以下幾個(gè)方面:實(shí)用性,由于本故障診斷終端主要用于監(jiān)控鐵路道口信號(hào)電源的工作情況,所以以實(shí)用性為原則,一般情況下只要具有以下功能即可滿足需要:遠(yuǎn)程檢測(cè)、分合控制、遠(yuǎn)程開合控制、越限報(bào)警及故障錄波;實(shí)時(shí)性,本故障診斷終端要求在信號(hào)電源的每個(gè)工頻周期內(nèi)(20毫秒)不間斷的、均勻采集20個(gè)點(diǎn)離散數(shù)據(jù),及時(shí)運(yùn)算,發(fā)生故障時(shí)能夠及時(shí)報(bào)警,以便及時(shí)進(jìn)行處理,故對(duì)實(shí)時(shí)性有一定要求;可靠性,本故障診斷終端主要應(yīng)用于各鐵路道口,工作地點(diǎn)多為野外,工作環(huán)境十分惡劣,必須有足夠的可靠性才能保證系統(tǒng)穩(wěn)定運(yùn)行。
3.系統(tǒng)硬件模塊
系統(tǒng)從總體上分成主控模塊,交流電信號(hào)輸入及調(diào)理模塊,人機(jī)接口模塊,CAN總線通信模塊以及開關(guān)量輸入輸出通道5大模塊。系統(tǒng)的主控CPU選用Cygnal公司的C8051F040 SoC型單片機(jī)(以下簡(jiǎn)稱040單片機(jī))。系統(tǒng)液晶顯示LCD采用長(zhǎng)沙太陽(yáng)人公司生產(chǎn)2004字符型液晶顯示模塊。實(shí)時(shí)時(shí)鐘模塊經(jīng)過綜合比較,考慮到在設(shè)計(jì)中同時(shí)需要采用NVRAM和實(shí)時(shí)時(shí)鐘,我們?cè)O(shè)計(jì)中選用了非易失性的時(shí)間管理RAM-DS1743,以提高系統(tǒng)的集成度,增加系統(tǒng)的可靠性。系統(tǒng)CAN總線驅(qū)動(dòng)器在本設(shè)計(jì)中選用PHILIP公司生產(chǎn)的TJA1050T總線驅(qū)動(dòng)器。
4. 實(shí)時(shí)操作系統(tǒng)的軟件設(shè)計(jì)
根據(jù)系統(tǒng)實(shí)現(xiàn)的功能以及CygnalF040微處理器的特性,對(duì)系統(tǒng)進(jìn)行任務(wù)分割,確定每個(gè)任務(wù)的優(yōu)先級(jí),并修改SmallRTOS51與硬件相關(guān)的部分內(nèi)核代碼。
4.1任務(wù)的劃分
根據(jù)上述故障診斷終端所需實(shí)現(xiàn)的功能,劃分系統(tǒng)為故障檢測(cè)、采樣計(jì)算、CAN總線通信、人機(jī)交互界面、容錯(cuò)設(shè)計(jì)等六個(gè)任務(wù)。實(shí)時(shí)內(nèi)核SmallRTOS51提供任務(wù)調(diào)度、任務(wù)管理、任務(wù)間的通信、中斷管理和內(nèi)存管理等功能。
4.2任務(wù)的創(chuàng)建及調(diào)度
SmallRTOS51使用靜態(tài)方法建立任務(wù),節(jié)省RAM的開銷,使得SmallRTOS51可以在小RAM的CPU中運(yùn)行,而每一個(gè)任務(wù)必須是一個(gè)無限的循環(huán)。當(dāng)系統(tǒng)啟動(dòng)多任務(wù)環(huán)境時(shí),通過調(diào)用OSStart()以初始化所有任務(wù)的堆棧,并將堆棧指針指向ID為0的任務(wù)堆??臻g;每個(gè)任務(wù)的堆棧結(jié)構(gòu)如圖1所示。在任務(wù)調(diào)度方面,SmallRTOS51采用固定優(yōu)先級(jí)(亦稱靜態(tài)優(yōu)先級(jí))的分配策略,任何兩個(gè)任務(wù)的優(yōu)先級(jí)不能相同,允許用戶改變?nèi)蝿?wù)的優(yōu)先級(jí)。
4.3 系統(tǒng)軟件需求
根據(jù)系統(tǒng)功能要求,在SmallRTOS51平臺(tái)下需要實(shí)現(xiàn)下列API函數(shù),并且需要使用SmallRTOS51提供的系統(tǒng)服務(wù),例如時(shí)間延時(shí)功能、信號(hào)量等。
4.3.1 人機(jī)界面
(1)鍵盤驅(qū)動(dòng)。
本系統(tǒng)采用獨(dú)立式鍵盤設(shè)計(jì),菜單驅(qū)動(dòng)程序設(shè)計(jì)的實(shí)質(zhì)就是對(duì)鍵盤進(jìn)行周期性處理,使用消息隊(duì)列傳遞鍵盤消息來處理按鍵問題;解析鍵值,執(zhí)行功能模塊同時(shí)刷新畫面。在中斷發(fā)生后,首先獲取鍵值void getkey (void);應(yīng)用系統(tǒng)函數(shù)完成去抖延時(shí);當(dāng)確認(rèn)有鍵按下時(shí),發(fā)送DOWNKEY消息;松開時(shí)發(fā)送UPKEY消息,并依據(jù)鍵值的不同來進(jìn)行解析:未按鍵:在沒有按鍵的情況下,直接跳過鍵盤解析模塊,其鍵值為0x79;方向鍵:依照當(dāng)前系統(tǒng)所處的工作狀態(tài)分成兩種情況,如果當(dāng)前顯示畫面為菜單選擇狀態(tài),則上下方向鍵用來移動(dòng)游標(biāo),達(dá)到改變選項(xiàng)的目的。如果是設(shè)定畫面,則左右方向鍵用來移動(dòng)游標(biāo),改變?cè)O(shè)定選項(xiàng),而上下鍵用來改變對(duì)應(yīng)選項(xiàng)設(shè)定值,其鍵值為0xe9、0xd9,0xb9、0xf1;確認(rèn)鍵:這里也分成兩種情況,如果當(dāng)前顯示畫面為菜單選擇狀態(tài),則確認(rèn)鍵用來進(jìn)入下一級(jí)子菜單或者功能模塊。而當(dāng)前畫面為設(shè)定畫面時(shí),確認(rèn)鍵用來確認(rèn)存儲(chǔ)所更改的設(shè)定值,其鍵值為0xf1;返回鍵:返回鍵用來返回上一級(jí)菜單,返回鍵值為0xf8。鍵盤流程圖如圖2所示,人機(jī)界面軟件框圖如圖3所示。
(2)LCD液晶顯示部分。LCD的API函數(shù)實(shí)現(xiàn)如下功能:LCD的初始化配置;顯示ASCII字符串。圖6為L(zhǎng)CD模塊的接口框圖。應(yīng)用程序通過下面8個(gè)函數(shù)完成對(duì)LCD接口的操作LcdPos()、LcdRead()、LcdWDat()、LcdInit()、DisANum()、LcdWrite()、DisAStr()、LCDWFont()、BcdToDec()、DecToBcd()。LcdInit()是模塊的初始化代碼。由于使用SmallRTOS51提供的服務(wù),LcdInit()必須在使用其它函數(shù)之前激活,并且在多任務(wù)啟動(dòng)之后調(diào)用,LcdInit()初始化硬件端口配置、創(chuàng)建信號(hào)量、設(shè)置LCD的工作模式。另外,通過LCDWFont函數(shù)可以自定義8個(gè)58像素的字符或符號(hào)。例如定義一個(gè)下向箭頭“↓”,程序清單為:
void XLCDWFont(void)
{ uint8 i;
uint8 font[ ]= {0x04,0x04,0x04,0x04,0x15,0x0e,0x04,0x00};
for ( i=0;i8;i++ )
{
LcdWCmd ( 0x40+I ) ;
LcdWDat ( font[i] ) ;
}
}
圖2 鍵盤流程圖
圖3 人機(jī)界面軟件框圖
4.3.2 實(shí)時(shí)時(shí)鐘
DS1743內(nèi)部集成的實(shí)時(shí)時(shí)鐘相關(guān)寄存器位于RAM中的最高八個(gè)地址,即控制寄存器位于地址1FF8,年,月,日,星期,時(shí),分,秒寄存器位于地址1FF9-1FFF??刂萍拇嫫饔袃蓚€(gè)位,讀取位和寫入位,通過對(duì)這兩個(gè)位寫入1中止外部時(shí)鐘寄存器的更新動(dòng)作,以預(yù)防在更新過渡期間讀到錯(cuò)誤的時(shí)鐘數(shù)據(jù)。主函數(shù)體共有兩個(gè):Ds1743GetTime()、Ds1743SetTime(),其中uint8 DecToBcd (uint8 number) 與uint8 BcdTDeco (uint8 number)為十進(jìn)制與BCD碼相互轉(zhuǎn)換函數(shù)。
4.3.3 CAN總線驅(qū)動(dòng)程序
一般情況下最基本的CAN總線節(jié)點(diǎn)的通信軟件包括三個(gè)部分:CAN節(jié)點(diǎn)的初始化,消息的傳送,消息的接收。首先建立緩沖區(qū),對(duì)CAN節(jié)點(diǎn)進(jìn)行初始化,主要包括以下幾個(gè)部分:CAN引腳輸出方式的設(shè)置,波特率參數(shù)的設(shè)置,消息對(duì)象的初始化,以及當(dāng)允許接收或發(fā)送中斷時(shí)對(duì)相應(yīng)中斷允許位的設(shè)置。要進(jìn)入初始化狀態(tài),必須設(shè)定CAN控制寄存器中的Init位為1。設(shè)定完成后再?gòu)?fù)位Init位退出初始化狀態(tài)。初始化程序主要完成對(duì)所有的報(bào)文對(duì)象進(jìn)行初始化(一般將所有值置零),對(duì)CAN 控制寄存器(CAN0CN)、位定時(shí)寄存器(BITREG)進(jìn)行設(shè)置,還要對(duì)發(fā)送報(bào)文對(duì)象和接收?qǐng)?bào)文對(duì)象分別進(jìn)行初始化。主程序中規(guī)定對(duì)象初始化、發(fā)送和接收初始化,啟動(dòng)CAN 處理機(jī)制(對(duì)BITREG 和CAN0CN 初始化),下面為CAN 啟動(dòng)程序:
void StartCAN (uint8 count)
{
WORD bps;
Switch (count) // 波特率參數(shù)設(shè)置
{……………………………………...}
EIE2 | = 0x20; // 開中斷
}
CAN 報(bào)文發(fā)送是由CAN 控制器自動(dòng)完成的,用戶只需根據(jù)接收到的遠(yuǎn)程幀的識(shí)別符,將對(duì)應(yīng)的數(shù)據(jù)轉(zhuǎn)移到發(fā)送緩沖寄存器,然后將此報(bào)文對(duì)象的編碼寫入命令請(qǐng)求寄存器啟動(dòng)發(fā)送即可,而發(fā)送由硬件來完成。這里,我們使用定時(shí)更新發(fā)送報(bào)文對(duì)象中的數(shù)據(jù),數(shù)據(jù)的發(fā)送有控制器自動(dòng)完成,當(dāng)其收到一個(gè)遠(yuǎn)程幀時(shí),就將具有相同識(shí)別符的數(shù)據(jù)幀發(fā)送出去。
CAN 報(bào)文的接收與發(fā)送一樣,是由CAN 控制器自動(dòng)完成的,接收程序只需從接收緩存器中讀取接收的數(shù)據(jù),再進(jìn)行相應(yīng)的處理即可。其基本方法與發(fā)送程序一致,只是接收程序采用中斷方式。在此應(yīng)用中,接收程序主要接收上位機(jī)對(duì)下位機(jī)的參數(shù)設(shè)置數(shù)據(jù),只有當(dāng)修改時(shí)才需要接收數(shù)據(jù),所以采用中斷方式處理比較合適。在對(duì)緩沖區(qū)進(jìn)行讀寫過程中,引入讀、寫兩個(gè)信號(hào)量分別對(duì)緩沖區(qū)兩端的操作進(jìn)行同步。這樣設(shè)計(jì)的優(yōu)點(diǎn)在于:當(dāng)用戶任務(wù)想寫但緩沖區(qū)滿時(shí),在信號(hào)量上睡眠,讓CPU運(yùn)行別的任務(wù),待ISR從緩沖區(qū)讀走數(shù)據(jù)后喚醒此睡眠的任務(wù);類似地,當(dāng)用戶任務(wù)想讀但緩沖區(qū)空時(shí),也可以在信號(hào)量上睡眠,待外部設(shè)備有數(shù)據(jù)來了再喚醒。由于SmallRTOS51的信號(hào)量提供了超時(shí)等待機(jī)制,CAN口當(dāng)然也具有超時(shí)讀寫能力。
4.3.4開關(guān)量輸入輸出模塊
開關(guān)量輸入部分模塊的作用是為故障診斷終端正確監(jiān)測(cè)開關(guān)量的狀態(tài)提供輸入通道。開關(guān)量輸入輸出部分模塊的底層驅(qū)動(dòng)函數(shù)主要包括兩個(gè)函數(shù),分別是:
uchar SwitchStausGet(void) //獲取開關(guān)量的狀態(tài)
void SwitchStausSet(uchar dat) //設(shè)定開關(guān)量的狀態(tài)
5.結(jié)語(yǔ)
本設(shè)計(jì)中采用Small RTOS實(shí)時(shí)操作系統(tǒng),對(duì)于實(shí)時(shí)操作系統(tǒng),要求調(diào)度的實(shí)時(shí)性、時(shí)間響應(yīng)的可確定性和系統(tǒng)的高度可靠性,最重要的指標(biāo)就是內(nèi)存的開銷。本設(shè)計(jì)中單片機(jī)采用Cygnal F040,內(nèi)部RAM為4352字節(jié)(4K+256),程序經(jīng)過優(yōu)化調(diào)試后,RAM總共占用402字節(jié),符合系統(tǒng)內(nèi)存要求,無須外擴(kuò)RAM已能很好的實(shí)現(xiàn)系統(tǒng)功能。以Small RTOS51嵌入式操作系統(tǒng)為基礎(chǔ)開發(fā)的電力系統(tǒng)故障診斷終端系統(tǒng)具有性能穩(wěn)定、實(shí)時(shí)性能良好、擴(kuò)展性強(qiáng)等特點(diǎn)。通過系統(tǒng)運(yùn)行測(cè)試表明系統(tǒng)工作穩(wěn)定可靠,可以滿足各種實(shí)時(shí)性能要求,在故障診斷終端技術(shù)中有很好的應(yīng)用前景。
參考文獻(xiàn)
[1] 張春雷,王東興 uC/OS- II 在C8051F020 單片機(jī)上的移植[J], 微計(jì)算機(jī)信息,2006.5:95-97
[2] Jean J.Labrosse. 嵌入式實(shí)時(shí)操作系統(tǒng)uC/OS-II . 第2版. 邵貝貝, 等譯. 北京:北京航空航天大學(xué)出版社, 2003.5
[3] 陳明計(jì), 周立功. 嵌入式實(shí)時(shí)操作系統(tǒng)Small RTOS51原理及應(yīng)用. 北京:北京航空航天大學(xué)出版社,2004.3
[4] 金永生, 范明鳳. 基于Small RTOS51 的數(shù)據(jù)采集器設(shè)計(jì),單片機(jī)與嵌入式系統(tǒng)應(yīng)用
2004.5
評(píng)論