<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于CygnalF040的RTOS51的研究與開(kāi)發(fā)

基于CygnalF040的RTOS51的研究與開(kāi)發(fā)

作者: 時(shí)間:2008-08-18 來(lái)源:網(wǎng)絡(luò ) 收藏

0.引 言

目前,我國對于大部分供電電力設備的監控和管理上基本還停留在人工巡查這種比較原始的管理方式下(例如鐵路道口的信號電源),不但管理效率低下,而且供電質(zhì)量和水平都得不到有效的保證。本文以實(shí)時(shí)操作系統small 為基礎,主要探討了一個(gè)用于電力系統現場(chǎng)監控終端單元的設計過(guò)程,希望能夠為提高配電自動(dòng)化水平提供一些思路,盡一點(diǎn)微薄之力。

1.Small 多任務(wù)實(shí)時(shí)操作系統

Small 是一個(gè)源代碼公開(kāi)的多任務(wù)實(shí)時(shí)操作系統,它可以簡(jiǎn)化那些復雜而且對時(shí)間要求嚴格的工程軟件設計工作。它具有公開(kāi)源代碼、可移植、可固化、占先式、中斷管理及RAM 需求小等特點(diǎn)。

2.系統功能描述

本故障診斷終端主要應用在鐵路道口信號燈電源的監控與管理,針對該故障診斷終端應用的具體場(chǎng)合,在設計時(shí)主要考慮以下幾個(gè)方面:實(shí)用性,由于本故障診斷終端主要用于監控鐵路道口信號電源的工作情況,所以以實(shí)用性為原則,一般情況下只要具有以下功能即可滿(mǎn)足需要:遠程檢測、分合控制、遠程開(kāi)合控制、越限報警及故障錄波;實(shí)時(shí)性,本故障診斷終端要求在信號電源的每個(gè)工頻周期內(20毫秒)不間斷的、均勻采集20個(gè)點(diǎn)離散數據,及時(shí)運算,發(fā)生故障時(shí)能夠及時(shí)報警,以便及時(shí)進(jìn)行處理,故對實(shí)時(shí)性有一定要求;可靠性,本故障診斷終端主要應用于各鐵路道口,工作地點(diǎn)多為野外,工作環(huán)境十分惡劣,必須有足夠的可靠性才能保證系統穩定運行。

3.系統硬件模塊

系統從總體上分成主控模塊,交流電信號輸入及調理模塊,人機接口模塊,CAN總線(xiàn)通信模塊以及開(kāi)關(guān)量輸入輸出通道5大模塊。系統的主控CPU選用Cygnal公司的C8051F040 SoC型單片機(以下簡(jiǎn)稱(chēng)040單片機)。系統液晶顯示LCD采用長(cháng)沙太陽(yáng)人公司生產(chǎn)2004字符型液晶顯示模塊。實(shí)時(shí)時(shí)鐘模塊經(jīng)過(guò)綜合比較,考慮到在設計中同時(shí)需要采用NVRAM和實(shí)時(shí)時(shí)鐘,我們設計中選用了非易失性的時(shí)間管理RAM-DS1743,以提高系統的集成度,增加系統的可靠性。系統CAN總線(xiàn)驅動(dòng)器在本設計中選用PHILIP公司生產(chǎn)的TJA1050T總線(xiàn)驅動(dòng)器。

4. 實(shí)時(shí)操作系統的軟件設計

根據系統實(shí)現的功能以及微處理器的特性,對系統進(jìn)行任務(wù)分割,確定每個(gè)任務(wù)的優(yōu)先級,并修改SmallRTOS51與硬件相關(guān)的部分內核代碼。

4.1任務(wù)的劃分

根據上述故障診斷終端所需實(shí)現的功能,劃分系統為故障檢測、采樣計算、CAN總線(xiàn)通信、人機交互界面、容錯設計等六個(gè)任務(wù)。實(shí)時(shí)內核SmallRTOS51提供任務(wù)調度、任務(wù)管理、任務(wù)間的通信、中斷管理和內存管理等功能。

4.2任務(wù)的創(chuàng )建及調度

SmallRTOS51使用靜態(tài)方法建立任務(wù),節省RAM的開(kāi)銷(xiāo),使得SmallRTOS51可以在小RAM的CPU中運行,而每一個(gè)任務(wù)必須是一個(gè)無(wú)限的循環(huán)。當系統啟動(dòng)多任務(wù)環(huán)境時(shí),通過(guò)調用OSStart()以初始化所有任務(wù)的堆棧,并將堆棧指針指向ID為0的任務(wù)堆??臻g;每個(gè)任務(wù)的堆棧結構如圖1所示。在任務(wù)調度方面,SmallRTOS51采用固定優(yōu)先級(亦稱(chēng)靜態(tài)優(yōu)先級)的分配策略,任何兩個(gè)任務(wù)的優(yōu)先級不能相同,允許用戶(hù)改變任務(wù)的優(yōu)先級。

4.3 系統軟件需求

根據系統功能要求,在SmallRTOS51平臺下需要實(shí)現下列API函數,并且需要使用SmallRTOS51提供的系統服務(wù),例如時(shí)間延時(shí)功能、信號量等。

4.3.1 人機界面

(1)鍵盤(pán)驅動(dòng)。

本系統采用獨立式鍵盤(pán)設計,菜單驅動(dòng)程序設計的實(shí)質(zhì)就是對鍵盤(pán)進(jìn)行周期性處理,使用消息隊列傳遞鍵盤(pán)消息來(lái)處理按鍵問(wèn)題;解析鍵值,執行功能模塊同時(shí)刷新畫(huà)面。在中斷發(fā)生后,首先獲取鍵值void getkey (void);應用系統函數完成去抖延時(shí);當確認有鍵按下時(shí),發(fā)送DOWNKEY消息;松開(kāi)時(shí)發(fā)送UPKEY消息,并依據鍵值的不同來(lái)進(jìn)行解析:未按鍵:在沒(méi)有按鍵的情況下,直接跳過(guò)鍵盤(pán)解析模塊,其鍵值為0x79;方向鍵:依照當前系統所處的工作狀態(tài)分成兩種情況,如果當前顯示畫(huà)面為菜單選擇狀態(tài),則上下方向鍵用來(lái)移動(dòng)游標,達到改變選項的目的。如果是設定畫(huà)面,則左右方向鍵用來(lái)移動(dòng)游標,改變設定選項,而上下鍵用來(lái)改變對應選項設定值,其鍵值為0xe9、0xd9,0xb9、0xf1;確認鍵:這里也分成兩種情況,如果當前顯示畫(huà)面為菜單選擇狀態(tài),則確認鍵用來(lái)進(jìn)入下一級子菜單或者功能模塊。而當前畫(huà)面為設定畫(huà)面時(shí),確認鍵用來(lái)確認存儲所更改的設定值,其鍵值為0xf1;返回鍵:返回鍵用來(lái)返回上一級菜單,返回鍵值為0xf8。鍵盤(pán)流程圖如圖2所示,人機界面軟件框圖如圖3所示。

(2)LCD液晶顯示部分。LCD的API函數實(shí)現如下功能:LCD的初始化配置;顯示ASCII字符串。圖6為L(cháng)CD模塊的接口框圖。應用程序通過(guò)下面8個(gè)函數完成對LCD接口的操作LcdPos()、LcdRead()、LcdWDat()、LcdInit()、DisANum()、LcdWrite()、DisAStr()、LCDWFont()、BcdToDec()、DecToBcd()。LcdInit()是模塊的初始化代碼。由于使用SmallRTOS51提供的服務(wù),LcdInit()必須在使用其它函數之前激活,并且在多任務(wù)啟動(dòng)之后調用,LcdInit()初始化硬件端口配置、創(chuàng )建信號量、設置LCD的工作模式。另外,通過(guò)LCDWFont函數可以自定義8個(gè)58像素的字符或符號。例如定義一個(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 鍵盤(pán)流程圖

圖3 人機界面軟件框圖

4.3.2 實(shí)時(shí)時(shí)鐘

DS1743內部集成的實(shí)時(shí)時(shí)鐘相關(guān)寄存器位于RAM中的最高八個(gè)地址,即控制寄存器位于地址1FF8,年,月,日,星期,時(shí),分,秒寄存器位于地址1FF9-1FFF??刂萍拇嫫饔袃蓚€(gè)位,讀取位和寫(xiě)入位,通過(guò)對這兩個(gè)位寫(xiě)入1中止外部時(shí)鐘寄存器的更新動(dòng)作,以預防在更新過(guò)渡期間讀到錯誤的時(shí)鐘數據。主函數體共有兩個(gè):Ds1743GetTime()、Ds1743SetTime(),其中uint8 DecToBcd (uint8 number) 與uint8 BcdTDeco (uint8 number)為十進(jìn)制與BCD碼相互轉換函數。

4.3.3 CAN總線(xiàn)驅動(dòng)程序

一般情況下最基本的CAN總線(xiàn)節點(diǎn)的通信軟件包括三個(gè)部分:CAN節點(diǎn)的初始化,消息的傳送,消息的接收。首先建立緩沖區,對CAN節點(diǎn)進(jìn)行初始化,主要包括以下幾個(gè)部分:CAN引腳輸出方式的設置,波特率參數的設置,消息對象的初始化,以及當允許接收或發(fā)送中斷時(shí)對相應中斷允許位的設置。要進(jìn)入初始化狀態(tài),必須設定CAN控制寄存器中的Init位為1。設定完成后再復位Init位退出初始化狀態(tài)。初始化程序主要完成對所有的報文對象進(jìn)行初始化(一般將所有值置零),對CAN 控制寄存器(CAN0CN)、位定時(shí)寄存器(BITREG)進(jìn)行設置,還要對發(fā)送報文對象和接收報文對象分別進(jìn)行初始化。主程序中規定對象初始化、發(fā)送和接收初始化,啟動(dòng)CAN 處理機制(對BITREG 和CAN0CN 初始化),下面為CAN 啟動(dòng)程序:

void StartCAN (uint8 count)

{

WORD bps;

Switch (count) // 波特率參數設置

{……………………………………...}

EIE2 | = 0x20; // 開(kāi)中斷

}

CAN 報文發(fā)送是由CAN 控制器自動(dòng)完成的,用戶(hù)只需根據接收到的遠程幀的識別符,將對應的數據轉移到發(fā)送緩沖寄存器,然后將此報文對象的編碼寫(xiě)入命令請求寄存器啟動(dòng)發(fā)送即可,而發(fā)送由硬件來(lái)完成。這里,我們使用定時(shí)更新發(fā)送報文對象中的數據,數據的發(fā)送有控制器自動(dòng)完成,當其收到一個(gè)遠程幀時(shí),就將具有相同識別符的數據幀發(fā)送出去。

CAN 報文的接收與發(fā)送一樣,是由CAN 控制器自動(dòng)完成的,接收程序只需從接收緩存器中讀取接收的數據,再進(jìn)行相應的處理即可。其基本方法與發(fā)送程序一致,只是接收程序采用中斷方式。在此應用中,接收程序主要接收上位機對下位機的參數設置數據,只有當修改時(shí)才需要接收數據,所以采用中斷方式處理比較合適。在對緩沖區進(jìn)行讀寫(xiě)過(guò)程中,引入讀、寫(xiě)兩個(gè)信號量分別對緩沖區兩端的操作進(jìn)行同步。這樣設計的優(yōu)點(diǎn)在于:當用戶(hù)任務(wù)想寫(xiě)但緩沖區滿(mǎn)時(shí),在信號量上睡眠,讓CPU運行別的任務(wù),待ISR從緩沖區讀走數據后喚醒此睡眠的任務(wù);類(lèi)似地,當用戶(hù)任務(wù)想讀但緩沖區空時(shí),也可以在信號量上睡眠,待外部設備有數據來(lái)了再喚醒。由于SmallRTOS51的信號量提供了超時(shí)等待機制,CAN口當然也具有超時(shí)讀寫(xiě)能力。

4.3.4開(kāi)關(guān)量輸入輸出模塊

開(kāi)關(guān)量輸入部分模塊的作用是為故障診斷終端正確監測開(kāi)關(guān)量的狀態(tài)提供輸入通道。開(kāi)關(guān)量輸入輸出部分模塊的底層驅動(dòng)函數主要包括兩個(gè)函數,分別是:

uchar SwitchStausGet(void) //獲取開(kāi)關(guān)量的狀態(tài)

void SwitchStausSet(uchar dat) //設定開(kāi)關(guān)量的狀態(tài)

5.結語(yǔ)

本設計中采用Small RTOS實(shí)時(shí)操作系統,對于實(shí)時(shí)操作系統,要求調度的實(shí)時(shí)性、時(shí)間響應的可確定性和系統的高度可靠性,最重要的指標就是內存的開(kāi)銷(xiāo)。本設計中單片機采用Cygnal F040,內部RAM為4352字節(4K+256),程序經(jīng)過(guò)優(yōu)化調試后,RAM總共占用402字節,符合系統內存要求,無(wú)須外擴RAM已能很好的實(shí)現系統功能。以Small RTOS51嵌入式操作系統為基礎的電力系統故障診斷終端系統具有性能穩定、實(shí)時(shí)性能良好、擴展性強等特點(diǎn)。通過(guò)系統運行測試表明系統工作穩定可靠,可以滿(mǎn)足各種實(shí)時(shí)性能要求,在故障診斷終端技術(shù)中有很好的應用前景。

參考文獻

[1] 張春雷,王東興 uC/OS- II 在C8051F020 單片機上的移植[J], 微計算機信息,2006.5:95-97

[2] Jean J.Labrosse. 嵌入式實(shí)時(shí)操作系統uC/OS-II . 第2版. 邵貝貝, 等譯. 北京:北京航空航天大學(xué)出版社, 2003.5

[3] 陳明計, 周立功. 嵌入式實(shí)時(shí)操作系統Small RTOS51原理及應用. 北京:北京航空航天大學(xué)出版社,2004.3

[4] 金永生, 范明鳳. Small RTOS51 的數據采集器設計,單片機與嵌入式系統應用

2004.5



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>