[摘要]:目前嵌入式系統正在不斷地向智能化、網絡化的方向發展,在實時控制系統中采用嵌入式操作系統已成為當前嵌入式應用系統中的一個發展方向。本文以開發電能計量電表中應用C/OS-II為實例,介紹了將實時嵌入式操作系統C/OS-II移植到目標系統中的方法,分析和研究了在單片機系統中使用嵌入式操作系統的有關問題。
[關鍵詞]:嵌入式操作系統; mC/OS-II; 內核; 實時性; 電能計量電表
1 引言
隨著后PC時代和網絡以及通信技術時代的到來,嵌入式操作系統在通信、電子、自動化等領域受已經到了越來越多的關注。因為一個好的嵌入式實時操作系統能夠提高產品的研制效率,縮短產品的開發周期,所以許多生產廠家正在紛紛考慮采用嵌入式操作系統技術來開發自己的產品。
實時嵌入式操作系統的種類繁多,大體可分為兩種——商用型及免費型。商用型的實時操作系統功能穩定、可靠、有完善技術支持及售后服務,但其昂貴價格限制了它在為數眾多的低端低成本的場合的應用。并且對這些場合來講,一個包含網絡協議核、文件管理,內存管理的操作系統實在顯得過于龐大了。它們需要的僅僅是一個穩定的包含任務管理及進程調度的實時內核,對一個 8位或16位單片機的應用場合,一個代碼長度不超過10KB,占用系統資源不超過10%象mC/OS-II這樣的實時內核是非常適合的。
2 mC/OS-II 系統簡介
mC/OS-II 是由Labrose先生編寫的開放式內核,具有源碼公開,可移植、可固化、可裁剪,穩定性及可靠性高的特點。其內核提供任務調度與管理、時間管理任務同步與通信、內存管理及中斷服務等功能,支持64用戶服務。90%的代碼函數用標準的ANSI C語言書寫,程序可讀性強、移植性好。適合于小型控制系統,具有執行效率高,占用空間小,實時性能優良,可擴展性強的特點,加之它穩定、可靠,現已被廣泛應用在航空、醫療器械、工業控制等領域,被證明是一個成熟穩定的實時內核。
3 在AT89C51上運行mC/OS-II
要使用mC/OS-II,首先就必須把這個內核成功地移植到使用的CPU上去。下面就給出在電能計量電表所用的AT89C51上移植mC/OS-II過程。mC/OS-II移植的軟件部分要完成以下工作。
3.1 與編譯器有關的代碼
在不同的處理器中有不同的字長,所以必須定義一系列數據類型以確保移植的正確性。在C/OS-II中,不使用C的char、int和long等數據類型,這些都是和編譯器相關的,在AT89C51處理器中,各種數據類型定義如下:
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U;
typedef signed char INT8S;
typedef unsigned int INT16U;
typedf signed int INT16S;
typedef unsigned long INT32U;
typedef signed long INT32S;
typedef float FP32;
typedef double FP64;
typedef unsigned char OS_STK;
mC/OS-II需要先禁止中斷訪問代碼的臨界區,并且在訪問完畢后重新允許中斷。mC/OS-II定義了兩個宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()來禁止和允許中斷。實現方法如下:
#define OS_ENTER_CRITICAL() EA = 0
#define OS_EXIT_CRITICAL() EA = 1
#define OS_STK_GROWTH 0
#define OS_TASK_SWO 0SCtxSW()
3.2 4個匯編語言函數
這部分需要對處理器的寄存器進行操作,所以必須用匯編語言來編寫。mC/OS-II的移植要求用戶編寫4個簡單的匯編語言函數:OSStarHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickISR()。
OSStarHighRdy()在多任務系統啟動函數OSStar()中調用。主要功能是將就緒表中最高優先級任務的棧指針加載到SP中,并強制中斷返回。這樣就緒的最高優先級任務就如同從中斷處理返回到運行態一樣,使得整個系統得以運轉。
OSCtxSw()在任務級任務切換函數中調用。任務級的切換問題是通過發軟中斷命令或依靠處理器執行陷阱指令來完成的。由于AT89C51沒有軟中斷命令或依靠處理器執行陷阱指令,所以用OS_TASK_SW()直接調用OSCtxSw()來完成。
OSIntCtxSw()通過調用OSIntCtxSw()來從ISR中執行切換功能。具體完成任務是調整堆棧指針,保存當前任務的SP,載入就緒最高優先級任務的SP,恢復就緒最高優先級任務的環境變量,中斷返回,從而完成中斷級任務切換。
OSTickISR()是系統時鐘節拍中斷服務函數。這是一個周期性中斷,為內核提供時鐘節拍,頻率越高系統負荷越重。此外還要編寫6個與操作系統有關的函數,有關這些函數具體功能更詳細的闡述,請參考文獻[1][2]。做完以上工作后,mC/OS-II就可以運行了。
4 在電能計量電度表中應用mC/OS-II
4.1 電能計量電度表的功能與任務分配
電能計量電度表是為了方便供電局進行用量管理,同時也為了使用戶合理用電而進行“尖、峰、平、谷”不同時段分別計費的智能儀器。圖1是電能計量電度表結構原理圖。該系統主要由兩個部分構成,一是電能計量芯片AD7755,二是數據的采集、存儲、顯示和報警系統。
圖1 電能計量電度表結構原理圖
根據電能計量電度表的工作原理,結合mC/OS-II可以把電能計量儀器的軟件結構劃分為下述幾個任務:
(1)RS-485口命令讀取。串口命令是從上位PC主機或紅外線抄表儀器發送到電能計量儀器的數據讀取或設置命令。這些命令必須為串口完全接收,不允許電能計量表在接收命令時發生數據丟失。實時要求很高。
(2)1s將保存在RAM中的當前用電量存儲到EEPROM。以防止單片機失電時電量計量丟失,實時要求高。
(3)100ms完成一次時鐘芯片實時鐘讀取,以便更新當前的年、月、日、時、分秒。每100ms進行一次,或接收上位機廣播校時時鐘芯片,實時要求很高。
(4)溫度芯片數值的讀取和存儲每300ms進行一次,實時要求較高。
(5)RS-485或紅外線抄表儀器口數據回送,電能計量電表接收到上位機命令后,完成指定操作,并將處理結果送回上位機或紅外線抄表儀器,實時要求低。
(6)液晶顯示內容每3s更新一次,液晶每3s更新顯示數據。實時要求很低。
(7)如果5min內沒有按鍵操作,則關閉液晶顯示以降低功耗。實時要求很低。
上面將實現的功能劃分為7個任務,并對這些任務的實時要求作了分析。在實時設計中,任務的的實時要求越高,對應的優先級就應該越高。另外,需要增加一個最高優先級任務來提供準確的100ms事件流,上述任務劃分如表1所示。
表1 任務劃分表
4.2 基于mC/OS-II的中斷處理
在mC/OS-II中,中斷處理也非常重要的,電能計量電表的中斷源及各種中斷用途以及優先級如表2所示。
表2 電能計量電表的中斷
雖然mC/OS-II允許使用多個中斷,并允許多層中斷嵌套,但為了減少中斷處理時間,提高系統響應速度,中斷處理程序或發出信號燈,通知相應的任務去處理。或進行簡單的數據處理,中斷處理的結構非常簡單,處理時間也很短,所以極少會出現多層中斷嵌套的情況。
在完成任務劃分后,還需要考慮任務的通信,在初始化mC/OS-II時創建了以下信號燈和消息郵箱用于任務間通信:
(1)串口命令信號燈SemCmd。該信號燈由串口接收緩沖區滿中斷處理程序發出,由任務2(RS-485或紅外抄表儀器命令讀取)接收。表示上位機已經有命令通過串口發送過來。
(2)時鐘芯片讀取或校準消息郵箱Mbox。該消息由任務1或任務2發出,由任務3(100ms一次系統時間校正或廣播校時時鐘芯片)接收。
(3)電量存儲信號燈Sem1s。該信號燈由任務3發出,由任務4接收。以1s為周期存儲當前電量到EEPROM。
(4)溫度數值的讀取信號燈Sem300ms。該信號燈由任務3發出,由任務5接收。以300ms為周期發出,通知任務5存儲溫度。
(5)顯示更新信號燈Sem5s。該信號燈由任務3發出,由任務7(3s一次液晶顯示內容更新)接收,以3s為周期發出,通知任務7刷新液晶顯示。
(6)液晶自動關閉信號燈Sem5min。該信號燈由任務3發出,由任務8(5min液晶自動關閉)接收,以5min為周期發出,通知任務8。如果過去5min內沒有按鍵,則關閉液晶顯示。
(7)串口命令緩沖區滿信號燈SemCmdProc。該信號燈由任務2(RS-485口命令讀取)發出,由任務6(RS-485或紅外抄表儀器口數據回送)接收。用于向上位機發送數據。
每個任務都沒有被刪除,其軟件流程如圖2所示:
初始化消息郵箱, 信號燈
5 結 語
目前我們開發的這個基于mC/OS-II內核的電能計量電表應用系統在系統的實時響應速度、軟件設計的模塊化問題、系統的抗干擾能力等方面都解決得比較好。已經在實際中投入運行,獲得了比較好的效果。