歡迎您光臨本站 登入註冊首頁

概述

1引言   uCOS-II是一個短小而功能強大的實時嵌入式操作系統。在JeanJ.Labrosse先生所著.由邵貝貝教授翻譯的Micro/uCOS-IITHEREAL-T……

1 引言
    uCOS-II是一個短小而功能強大的實時嵌入式操作系統。在Jean J.Labrosse先生所著.由邵貝貝教授翻譯的Micro/uCOS-II THE REAL-TIME KERNEL(Second Edition)一書中對這一操作系統作出了精彩的講解,該書是一部關於uCOS-II操作系統的經典教材,同時在書中提供了關於uCOS-II在windows環境下的移植的4個範例。本文對其第一個範例作一個在redhat linux9.0上的移植版本。移植的工作主要集中在三個方面,下文將分為三章,結合代碼詳細介紹。文章的最後將介紹我的試驗平台並演示我的試驗結果。

2 字元串的顯示
    字元串顯示函數PC-DispStr在文件pc.c中,這個文件本身不是uCOS-II的一部分。它的主要工作是建立一系列的功能函數來發揮PC機的強大功能,並被測試代碼所調用。
2.1 設置前景色和後景色
    我們使用類似於prinf("\033[30m")的語句來設置顏色.轉義序列就是一個讓shell執行一個特殊步驟的控制指令。轉義序列通常都是以ESC開頭(這也是它的命名原因)。在shell里表示為^[。這種表示法需要一點時間去適應, 也可以用\033完成相同的工怍(ESC的ASCII碼用十進位表示就是27,=用八進位表示的33)。\033聲明了轉義序列的開始,然後是[開始定義顏色。下面我們要選擇前景色(這裡是32,代表綠色)。背景色的40表示黑色。要是不想讓提示符後面的文字也變成綠色,我們用\033[0m關閉轉義序列,\033[0m是shell的默認顏色。前景色和背景色都有8種可用的選擇。可選顏色:紅色、綠色、黃色、藍色、洋紅、青色和白色。他們對應的顏色代碼是:30(黑色)、31(紅色)、32(綠色)、33(黃色)、34(藍色)、35(洋紅)、36(青色)、37(白色)。用同樣色方法設置背景色,不過要把第一個數字"3"替換成"4",例如40、41、42、43、44、45、46、47。雖然在這裡可以按照上面介紹的對應關係定義修改在pc.h中定義的前景色和後景色的宏,使對應關係更加明確。(注意:他的後面一位表示前景色,前面一位表示後景色),但是我們在這裡的設計思路是盡量不對原書中的代碼作改動,所以在函數的實現中直接使用switch語句,對相應的前景色和後景色 。(linux的shell只支持以上幾種顏色)
switch (color&0xF0) /*查看前景色*/
{ case DISP_FGND_BLACK: printf("\033[30m");break;
……
}
switch(color&0x0F) /*查看後景色*/
{ case DISP_BGND_BLACK: prinf ("\033[40m");
break;
……
}
2.2跟蹤游標的位置
    我使用printf("\033[%u;%uH",y+1,x+1)來跟蹤游標的位置。33是聲明了轉義序列的開始,上文已經介紹,不再累敘,[y;xH是設置游標位置的格式。x和y分別表示橫軸和縱軸。

3 鍵盤輸入
    鍵盤輸入函數PC_GetKey在windows環境下,由於有庫函數kbhit返回最近所敲的按鍵.就很容易實現。而在linux環境下我們需要構造自己的kbhit,在參考文獻2中John.Wiley.Sons先生提供了一種現成的實現方法(這個方法會阻塞read函數.在本文中並不適用),這裡我們使用了另外的一種實現方法,下面介紹給出其實現代碼.
int kbhit(void){
struct timeval tv;
fd_set readFd;
struct termios newKbdMode;
if(!inited){
newKbdMode.c_lflag&=~(ICANON | ECHO);
newKbdMode.c_cc[VTIME]=0;
newKbdMode.c_cc[VMIN]=1;
tcsetattr(0,TCSANOW,&newKbdMode);
atexit(rekbd);
inited=1;
}
tv.tv_sec=0;
tv.tv_usec=0;
FD_ZERO(&readFd);
FD_SET(STDIN_FILENO,&readFd);
select(1,&readFd,NULL,NULL,&tv);
if(FD-ISSET(STDIN-FILENO,&readFd))
return 1;
else
return 0;
}
3.1 控制台的初始化
    首先,這裡使用了全局變數inited,它是一個初始化與否的標記.因為函數kbhit將被多次調用,而初始化只需要做一次.這樣.當發現inited置1以後,就不會去做重複性的初始化工作了。如果inited為0,就需要對控制台(鍵盤)做初始化工作,這裡定義了內核結構體termios類型的變數newKbdMode,我們需要對這個結構體的兩個成員c_lflag和c_cc進行初始化,代碼中對c_lflag的設置表示終端為不回顯的非標準模式。c_cc[VTIME]=0,c_cc[VMIN]=1表示讀函數會等待.直到出現1個鍵盤輸入為止。(關於這個結構體的詳細分析,可參閱參考文獻2的第5章)。然後再調用tcsetattr把設置的值寫入。最後,函數atexit將在3.3節詳敘。

3.2 檢測鍵盤的輸入
    在這裡我們使用宏FD_ZERO把內核的結構體readFd清0.用宏FD_SET把標準輸入的文件描述符STDIN_FILENO和readFd關聯,然後用select函數來監測輸入.他只關注一個描述符,所以第一個參數為1,第二個參數為上面的readFd,後面的兩個參數表示是否關註標准輸出和出錯的文件描述符,我們不要,所以置0.最後一個參數表示超時時間,我們不需要,所以置0。經過以上的處理后,如果有輸入時.宏FD_ISSET就會返回非0值。我們就知道鍵盤上有輸入。

3.3 系統退出
    在windows環境下使用了成對的函數PC_DOSSaveReturn()和PC_DOSReturn。前一個保存DOS的狀態,后一個在退出時前調用.恢復保存的DOS狀態。而在linux下,表面看來我僅使用函數exit()直接退出,而沒有進行類似的保存一恢復處理.但實際上在linux下我們調用了函數atexit(function)來設置程序正常結束前調用的函數,當程序通過調用exit()返回時,參數function所指定的函數會先被調用.然後才真正由exit()結束程序。function將指定函數rekbd(函數的實現見下面的代碼),這個函數就是清屏和清處所有前文的屬性設置,\033聲明了轉義序列的開始,然後是[2J,表示清屏。[0m表示關閉所有屬性。
void rekbd(void){
prinf("\033[0m");
prinf("\033[2J");
}

4 MAKEFILE 文件的編寫
    在Jean J.Labrosse先生的原書中是使用boland c的編譯器.而我們在linux下使用GCC的編譯器,由於編譯器的改變.所以makefile就需要重寫。為了簡化makefile的編寫,我提供一種最簡單的方法,那就是把所有uCOS-II 的源碼(SOFTWAREuCOS-IISOURCE). 以及配置頭文件和測試函數(SOFTWAREuCOS-IIEX1_x86LBC45SOURCE).還有按上文編寫的pc.c和pc.h文件,全部放在linux的根目錄下.假設為/test78,則makefile可簡寫為如下方式:
UCOS_SRC=/test78
UCOS_PORT=/test78
UCOS_PC=/test78
all:
gcc-I$(UCOS_SRC) -I$(UCOS_PORT) -I$(UCOS_PC) test.c $(UCOS_SRC)/uCOS_II.C $(UCOS_PC)/
pc.c $(UCOS_PORT)/os_cpu_c.c -o test
    all是一個偽目標,"偽目標" 並不是一個文件,只是一個標籤,它的特性是,總是被執行的。這樣的目的是讓編譯器每次都產生新的目標。-o test指定輸出文件為test.'-I'選項指定搜索的目錄.
    注意:把所有源文件都放在一個目錄下也許並不是一個好方法,它使得整個工程雜亂無章,特別是在工程比較大時.是不能這樣處理的。但這裡僅僅是為了簡化makefile的編寫,提供一個可行的方法。所以在這個makefile的前面,我定義了幾個宏,如果需要編譯的幾個文件在路徑下,就只需要指定路徑就可以了。

5 結束語
    本文的創新點主要體現在
1.自建的鍵盤輸入函數。由於(Beginning.Linux.Programming)中實現會阻塞read函數,所以本文採用了改進的方法實現鍵盤輸入,詳見第3節。
2.MAKEFILE文件。由於編譯器的改變,我們需要改寫makefile文件,本文提供了一種非常簡單的編寫方法,詳見第4節。
    我的試驗平台如下:在Virtual PC 2004上安裝red hat linux 9.0,並且在linux下進行編譯和調試。

參考文獻:
[1]Jean J.Labrosse(邵貝貝譯) 《嵌入式實時操作系統UC/OS-II(第2版)》
[2]John.Wiley.Sons.Beginning.Linux.Programming,Third.Edition
[3]Werner Zimmermann uCOS-II-Port for the LINUX Operating System
[4]石紹應,張圮,羅詩途.基於嵌入式操作系統VxWorks的戰車虛擬儀錶顯示技術研究[J].微計算機信息,2005,4:136-137
[5]錢晨,徐榮華,王欽若.基於Linux操作系統的設備驅動程序開發,微計算機信息.2004,9


[admin via 研發互助社區 ] 在linux上模擬uCOS-II實時操作系統的實現已經有2344次圍觀

http://cocdig.com/docs/show-post-42198.html