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

uCOS II在C8051F120上的移植

admin @ 2014-03-25 , reply:0

概述

   由於計算機技術的進步,單片機系統硬體規模越來越大,功能也越來越強,從而給運行嵌入式操作系統提供了硬體支持。為了更好地管理系統軟硬體資源,嵌入式實時操作系統逐漸應用到……

    由於計算機技術的進步,單片機系統硬體規模越來越大,功能也越來越強,從而給運行嵌入式操作系統提供了硬體支持。為了更好地管理系統軟硬體資源,嵌入式實時操作系統逐漸應用到嵌入式硬體平台。

1 嵌入式實時操作系統(RTOS)
    嵌入式實時操作系統是嵌入式系統極為重要的組成部分,是能對整個系統及其操作部件裝置等資源進行統一協調、指揮和控制的系統軟體。RTOS具有通用操作系統的基本特點,如能夠有效管理越來越複雜的系統資源;能夠把硬體虛擬化,使得開發人員從繁忙的驅動程序移植和維護中解脫出來;能夠提供庫函數、驅動程序、工具集以及應用程序。
    在嵌入式RTOS環境下,實時應用程序的開發設計過程得到了較大地簡化,不需要大的改動就可增加新的功能,而且通過將應用程序分割成若干獨立的任務模塊,使對實時性要求苛刻的事件都得到了快速、可靠的處理。但是,使用嵌入式RTOS必需增加額外的ROM/RAM開銷和2%~5%的CPU負荷。

2 uCOS II簡介
2.1 uCOS II的特點
    uCOS II是一種公開源代碼、結構小巧實時內核的實時操作系統,其內核提供任務調度與管理、時間管理、任務間同步與通信、內存管理和中斷服務等功能。它適用於小型控制系統,具有執行效率高、佔有空問小、實時性能優良和擴展性強等特點,最小內核可以編譯至2k左右。
    uCOS II實時內核採用佔先式調度策略,不支持時間片輪調度法,核心是始終運行就緒條件下的優先順序最高的任務。在uCOS II中每一個任務必須賦予一個明確的並且與其他任務不同的優先順序,根據各個任務的優先順序,動態地切換各個任務,保證了對實時性的要求。如果希望某個任務的優先順序根據條件的變化而發生改變,則可以通過調用改變任務優先順序的函數來實現。

2.2 uCOS II的體系結構
    uCOS II的體系結構如圖1所示。
 
圖1 uCOS II體系結構
    uCOS II大部分代碼是用c語言寫的,只有一些與處理器相關的代碼是用彙編語言寫的,因為uCOS II在讀寫處理器寄存器時只能通過彙編語言來實現。
    uCOS II內核分為與處理器無關部分和與處理器相關部分,其中與處理器相關的文件有三個:C語言文件OS_CPU.H,OS_CPU_C.C和彙編文件OS_CPU_A.ASM。在用uCOS II作為內核來編寫嵌入式測控系統的控制軟體之前,必須先完成uCOS II操作系統在微處理器上的移植工作,移植工作主要是修改與處理器相關的文件,使之適合待移植的處理器類型,其它內核文件直接嵌套使用即可。

3 uCOS II在C8051F120上的移植
    數據採集系統採用了新華龍公司的C8051F120作為主控晶元,通過A/D介面採集處理感測器輸入的溫度壓力信號。
3.1 OS_CPU.H文件的修改
(1)C8051F120是一種內核為51的單片機,其增長堆棧方向從低地址到高地址,故其堆棧增長方嚮應定義為1,即
#define OS_STK_ GROWTH 1
(2)定義相關宏。C8051F120有直接開關中斷的指令,對臨界區的設定直接定義如下:
#define OS_ENTER_CRITICAL EA =0
#define OS_EXIT_CRITICAL EA =1
任務切換宏封裝了對任務切換函數OSCtxSw()的調用,定義如下:
#define OS_TASK_SW OSCtxSw()
(3)數據類型的定義。根據C8051F120晶元特點來定義數據類型和數據長度,其定義與常用51內核單片機相同。

3.2 OS_CPU.C文件的修改
(1)添加系統時鐘初始化程序
    C8051F120採用TIMER0作為系統時鐘中斷源,其代碼為可重入函數:
void InitTimer0(void) reentrant
{SFRPAGE =0x00;//切換寄存器頁
TMOD =TMOD&0xF0;
TMOD=TMOD | 0x01;//模式1(16位定時器),僅受TR0控制
TH0=0x70; //定義Tick=50次/秒(即0.02秒/次)
TL0=0x00;
ET0=1;//允許T0中斷
TR0=1;
}
(2)任務堆棧初始化函數的改寫
    任務堆棧空間由高至低依次將保存著PSW,ACC,B,DPL,DPH等寄存器。為了使任務的調度一致,初始狀態的堆棧實際上是模擬了一次中斷髮生后的堆棧結構,以便在OSSched()進行任務調度時,從堆棧中恢復剛開始運行時的處理器現場。當前任務堆棧初始化完成後,OSTaskStklnit返回新的堆棧指針stk,在OSTaskCreate()執行時將調用OS_TaskStkInit的初始化過程,然後再通過調用OSTCBInit()將返回的sp指針保存到該任務的TCB塊中。

3.3  OS_CPU.ASM文件的修改
    OS_CPU.ASM文件是用彙編語言編寫的模塊,包括大量對處理器寄存器的讀寫操作,其中主要由4個彙編語言函數:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()組成,每一個函數都需要用PUBLIC聲明為可以被外部模塊調用。
    uCOS II任務的切換,系統寄存器需要頻繁完成進棧和出棧操作,為了減少代碼編寫工作量,在OS_CPU.ASM中根據晶元特點將寄存器的進棧出棧操作定義為宏。

3.4 數據採集任務的實現
    為了提高數據採集實時性和可靠性,對每個模擬量數據,uCOS II採用單獨的任務來實現。下面給出溫度和壓力數據採集的實現程序。溫度數據採集任務程序:
void Task1(void *pada)
{
mux_select = MUX_CPU_TEMP;//溫度數據測量
StartCollect();
For(;;)
{read_TEMP_inputs();//數據讀入,標度轉換
temp_long=ADC0 - 42380/2;
temp_long= (temp_long* 200L)/156;
cpu_temperature=temp_long;
……
OSTimeDly(OS_TICKS_PER_SEC);//任務調度
}
}
壓力數據採集任務程序:
void Task2(void *pada)
{
mux_select = MUX_CPU_PRESS;//溫度數據測量
StartCollect();// start the collecting
For(;;)
{read_Press_inputs();
press_long= ADC0;
press_long= temp_ long;
……
OSTimeDly(OS_TICKS_PER_SEC);//任務調度
}
}


[admin via 研發互助社區 ] uCOS II在C8051F120上的移植已經有3883次圍觀

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