熟女人妻水多爽中文字幕,国产精品鲁鲁鲁,隔壁的少妇2做爰韩国电影,亚洲最大中文字幕无码网站

技術頻道

娓娓工業
您現在的位置: 中國傳動網 > 技術頻道 > 技術百科 > 實時操作系統µC/OS-II在C8051F120上的移植

實時操作系統µC/OS-II在C8051F120上的移植

時間:2008-06-13 14:23:00來源:dujing

導語:?本文介紹了實時操作系統µC/OS-II的特點,討論了其在51系列單片機上移植的必要性。
摘要 本文介紹了實時操作系統µC/OS-II的特點,討論了其在51系列單片機上移植的必要性。并選擇8位單片機C8051F120作為移植目標,分析了µC/OS-II的具體移植過程。最后設計例程驗證了移植的正確性。 關鍵詞 C8051F120;µC/OS-II;移植 [align=center]The Porting of Real-Time Operation System µC/OS-II on C8051F120 Taiyuan University of Technology Tian Juan[/align] Abstract The paper introduces the characteristic of real-time operation system µC/OS-II, and discusses the necessity of porting µC/OS-II on 51 series MCU. Then the specific process of porting µC/OS-II on C8051F120 which is selected as porting target is analyzed. The paper ends with designing test program to prove the success of the porting. Keywords C8051F120; µC/OS-II; porting 引言 傳統的嵌入式系統設計往往采用前/后臺系統。應用程序是一個無限的循環,在循環中調用相應的函數完成對應的操作,這部分可以看成后臺行為。中斷服務程序處理異步事件,這部分可以看成前臺行為[1]。在大多數對實時性要求較高的場合中,這種系統結構就無法滿足應用的要求,實時內核逐步成為嵌入式系統設計的主流。µC/OS-II是一個完整的,可移植、固化、裁減的占先式實時多任務內核,不僅結構簡單,絕大部分采用C語言,而且可移植性好,很容易被移植到各種微處理器上,在移植過程中,只需要做少量的修改工作即可。目前µC/OS-II最多支持64個任務,總是在執行處于就緒態的優先級最高的任務。并且因其源代碼的完全公開和優越性能而得到了廣泛的應用。 51系列單片機是美國Intel公司在1980年推出的高性能8位單片機,目前仍然是我國使用最廣泛的單片機系列之一,有非常大的應用環境與前景。如果開發一套基于51系列單片機的操作系統,那么用戶只需要編寫各個任務的程序,不必同時將所有任務運行的各種情況記在心中,不但大大減少了程序編寫的工作量,而且減少了出錯的可能性[2]。 所以,在51系列單片機上移植實時操作系統µC/OS-II是很有必要的。 1 µC/OS-II的移植條件 要使µC/OS-II移植到處理器后能正常運行,處理器必須滿足以下條件: ● 處理器的C編譯器能產生可重入代碼。µC/OS-II是可剝奪型內核,總是讓就緒態的高優先級的任務先運行,中斷服務程序可以搶占CPU,所以只能通過C編譯器產生可重入代碼。可重入函數可以被一個以上的任務調用,而不必擔心數據被破壞。 ● 處理器的C編譯器能在C語言中開中斷和關中斷。因為µC/OS-II在處理臨界段的時候,須關中斷,處理完畢后,再開中斷。 ● 處理器支持中斷,并且能產生定時中斷。因為µC/OS-II是通過硬件中斷來實現系統時鐘,并在時鐘中斷服務程序中來處理與時間相關的問題,實現任務之間的調度。 ● 處理器具有一定數量的硬件堆棧,并且有將堆棧指針和其他CPU寄存器內容讀出、并存儲到堆棧或內存中的指令。因為µC/OS-II為每一個任務分配任務堆棧,在任務切換時,需要先保存當前任務堆棧內容,再恢復最高優先級任務堆棧內容。 2 CPU芯片的選擇 隨著現代通信技術的發展,智能化系統對DSP需求的增長要求不斷提高單片機運算速度[3]。C8051F系列單片機就是在這樣的情況下由Silabs公司推出的,它是完全集成的混合信號系統級芯片,具有與8051兼容的微控制器內核,在不擴展8位數據總線的情況下,使單周期指令速度提高到原8051的12倍。而C8051F120作為C8051F系列中的高端產品就被選擇為系統移植的對象。 C8051F120的內部資源有:64個I/O引腳,5個16位通用計數器/定時器,6個捕獲/比較模塊,硬件實現的SPI,SMBus/IIC和兩個UART串行接口,片內看門狗定時器,2個比較器,真正12位100ksps的8通道ADC,8位500ksps的8通道ADC,128KB的FLASH存儲器,8448B的內部數據RAM[4]。 由于C8051F120處理器和使用的Keil編譯器都能夠很好的滿足上述移植條件,所以可以把µC/OS-II移植到C8051F120上。在實際開發系統中,使用外部晶體振蕩器,晶振頻率為22.1184MHZ,并外擴256KB的RAM。 3 移植過程 µC/OS-II的移植可以看作是對µC/OS-II代碼的修改。µC/OS-II的代碼分為與處理器無關的代碼,與處理器相關的代碼和與應用相關的代碼。與處理器無關的代碼原則上是不用修改可以直接添加,但由于Keil編譯器的特殊性,必須在需要可重入的函數聲明的后面標注reentant關鍵字,即加上重入屬性;又因為pdata既是Keil的關鍵字又是µC/OS-II的一些函數的形參,會導致編譯錯誤,所以把pdata改為pdat。與處理器相關的代碼包括3個文件:OS_CPU.H、OS_CPU_C.C、OS_CPU_A.ASM,需要大量的修改后才能添加,這是移植工作的重點。另外,與應用相關的代碼包括2個頭文件:INCLUDES.H和OS_CFG.H。INCLUDES.H是一個主頭文件,出現在每個.C文件的第一行。INCLUDES.H文件使得工程項目中的每個.C文件無需分別考慮它實際上需要哪些頭文件。還可以在頭文件列表的最后添加自己的頭文件。OS_CFG.H是系統配置文件,µC/OS-II的裁減過程是通過對OS_CFG.H中的相關常量進行設置來完成[5]。可以分為任務管理功能的裁減,節省代碼存儲空間;數據結構的裁減,節省數據存儲空間;系統節拍頻率設置和任務堆棧大小設置。 3.1 OS_CPU.H OS_CPU.H包括了用#define語句定義的、與處理器相關的常數、宏以及類型。 數據類型的定義是為了保證可移植性。而且必須把任務堆棧的數據類型告訴µC/OS-II,通過為OS_STK聲明恰當的C數據類型來實現的。C8051F120的堆棧是8位的,所以聲明OS_STK: typedef INT8U OS_STK; //堆棧的寬度為8位 µC/OS-II為了處理臨界段代碼,須關中斷,處理完畢后,再開中斷。所以定義2個宏來關中斷和開中斷:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。這2個宏可以用3種方法實現,具體用哪種方法,取決于使用的處理器類型和C編譯器。C8051F120使用方法1來處理臨界段,即直接開關中斷。這樣定義既減少了程序行數,又避免了退出臨界區后關中斷造成的死機。根據中斷允許寄存器 IE的第7位EA為中斷允許總控制位,EA=0屏蔽所有中斷,EA=1允許所有中斷,所以定義語句為: #define OS_ENTER_CRITICAL() EA=0 //關中斷 #define OS_EXIT_CRITICAL() EA=1 //開中斷 C8051F120堆棧從下向上增長(0=向上,1=向下),通過配置常數OS_STK_GROWTH指定堆棧的方向。所以定義語句為: #define OS_STK_GROWTH 0 //堆棧從下向上增長,1=向下增長 µC/OS-II的任務切換是通過模仿中斷動作完成的,但C8051F120沒有軟中斷指令,所以用函數調用的方式實現任務切換,定義語句為: #define OS_TASK_SW() OSCtxSw() // OSCtxSw()是用于實現任務切換的函數 3.2 OS_CPU_C.C OS_CPU_C.C包括10個C函數:OSTaskStkInit()函數和9個Hook函數。OSTaskStkInit()函數在任務創建時被調用,用來初始化任務堆棧。Hook函數用來擴展µC/OS-II的功能,可以不包含任何代碼,但必須聲明。最后添加Timer0初始化函數,包括選擇工作模式,設定初值和使能中斷,因為要使用C8051F120的Timer0實現時鐘中斷。 在修改OSTaskStkInit()函數之前,需要先知道任務堆棧的結構。µC/OS-II為每一個任務都分配了任務堆棧,任務堆棧由系統堆棧和仿真堆棧兩部分組成。由于C8051F120要求堆棧設置在片內RAM中,而片內RAM空間又非常有限,因此所有任務的任務堆棧設置在片內RAM中是幾乎不可能的。只能把任務堆棧存放在片外RAM,并在片內RAM設置一個公共堆棧,即系統堆棧,棧底地址為?STACK。在任務切換時,需先保存當前任務堆棧內容,再恢復最高優先級任務堆棧內容,即進行任務堆棧和系統堆棧的復制。仿真堆棧是用來為可重入函數完成參數傳遞和存放局部變量的,設置在片外RAM,增長方向由上向下,棧指針為?C_XBP。 所以,任務堆棧初始化可以看作是把處于就緒態的最高優先級任務的任務堆棧內容復制到系統堆棧的過程。首先要獲得任務堆棧最低地址和長度,因為需要從任務堆棧中恢復15個寄存器內容到系統堆棧,所以堆棧長度為15。然后從下向上依次復制寄存器內容,復制順序是:PCL,PCH,PSW,ACC,B,DPL,DPH,R0,R1,R2,R3,R4,R5,R6,R7。最后保存仿真堆棧地址,并返回任務堆棧最低地址。這樣就完成了任務堆棧初始化。 3.3 OS_CPU_A.ASM OS_CPU_A.ASM包括4個匯編語言函數,這4個函數都是不可重入的,并且定義了系統堆棧空間大小。 OSStartHighRdy ()函數,用來使就緒態任務中優先級最高的任務開始運行。OSCtxSw()函數,實現CPU正常運行時任務間的切換,即對當前任務堆棧的保存和對最高優先級任務堆棧的彈出,使最高優先級任務獲取CPU的控制權。OSIntCtxSw()函數,作用是在中斷服務程序中執行中斷級別任務切換。它的絕大多數代碼和OSCtxSw()函數是一樣的,區別在于中斷服務函數已經保存了寄存器內容,則不需要再在OSIntCtxSw()函數中保存。OSTickISR()函數,是系統時鐘的中斷服務程序,主要功能是檢查是否有由于延時而被掛起的任務成為就緒任務。如果有,就調用OSIntCtxSw()函數進行任務切換,從而運行最高優先級任務。因為µC/OS-II在每一個節拍都要檢查有沒有更高優先級的任務在等待執行,如果有,就要進行任務切換。所以,時鐘節拍率越高,系統的額外負荷就越重。 4 系統測試 按照上述移植步驟,作者在Keil編譯環境下實現了µC/OS-II在C8051F120上的具體移植。為了防止在編譯時出現段過大的錯誤,需要選擇內存模式為大模式,并相應的在STARTUP.A51 文件中設置XBPSTACK=1。創建2個任務來驗證µC/OS-II移植的成功: OSTaskCreate (TaskLed, (void *)0, TaskStartStkLed,2); OSTaskCreate (TaskSmg, (void *)0, TaskStartStkSmg,3); 程序流程圖如圖1所示。任務TaskLed閃爍1次后,向任務TaskSmg發送消息并等待回復,任務TaskSmg得到消息后顯示閃爍次數,并進行回復。最終效果為P4.0連接的LED閃爍1次,則P5口連接的數碼管顯示數字加1,最大顯示為9,之后自動清零。經過4小時的連續實驗,一切運行正常,這就驗證了移植代碼的正確性。 [align=center] 圖1 程序流程圖[/align] 需要注意的是,C8051F120的使用涉及到SFRPAGR的保護,因為C8051F120擁有太多的模擬和數字資源,它們都需要相應的SFR控制,而標準8051保留的SFR空間不能滿足所需的SFR寄存器,所以C8051F120另外安排了SFRPAGE來擴展更多的SFR寄存器空間。同一個SFR地址配合不同的SFRPAGE值,控制不同的資源。但如果是非中斷情況下發生任務切換,并且在新任務中改變了SFRPAGE,那么回到以前的任務后很可能SFRPAGE已經改變,從而無法控制正確的資源,還有可能使程序跑飛。因為不同的資源往往需要不同的SFRPAGE,為了解決這一問題,在所有出現SFRPAGE賦值的地方都應當作臨界代碼保護起來,這樣就可以完全避免因SFRPAGE值的錯誤而引出的問題[6]。 5 結論 µC/OS-II是一種實時性好、代碼量小的多任務實時操作系統,具有很好的穩定性與可靠性,可廣泛移植到不同構架的微處理器上。本文完整的闡述了µC/OS-II的移植過程,并在C8051F120上實現了雙任務同步通信。論文對51系列單片機的µC/OS-II移植具有普遍的指導意義。

標簽:

點贊

分享到:

上一篇:變頻器維修實例解析

下一篇:微能WIN-V63矢量控制變頻器在...

中國傳動網版權與免責聲明:凡本網注明[來源:中國傳動網]的所有文字、圖片、音視和視頻文件,版權均為中國傳動網(www.hysjfh.com)獨家所有。如需轉載請與0755-82949061聯系。任何媒體、網站或個人轉載使用時須注明來源“中國傳動網”,違反者本網將追究其法律責任。

本網轉載并注明其他來源的稿件,均來自互聯網或業內投稿人士,版權屬于原版權人。轉載請保留稿件來源及作者,禁止擅自篡改,違者自負版權法律責任。

網站簡介|會員服務|聯系方式|幫助信息|版權信息|網站地圖|友情鏈接|法律支持|意見反饋|sitemap

傳動網-工業自動化與智能制造的全媒體“互聯網+”創新服務平臺

網站客服服務咨詢采購咨詢媒體合作

Chuandong.com Copyright ?2005 - 2025 ,All Rights Reserved 深圳市奧美大唐廣告有限公司 版權所有
粵ICP備 14004826號 | 營業執照證書 | 不良信息舉報中心 | 粵公網安備 44030402000946號

主站蜘蛛池模板: 理塘县| 泉州市| 鄂州市| 黔西| 方山县| 衡山县| 乌兰县| 武强县| 金秀| 遂宁市| 新巴尔虎右旗| 青铜峡市| 分宜县| 富裕县| 中超| 德兴市| 华容县| 龙里县| 汕尾市| 平定县| 永城市| 府谷县| 辽源市| 乐陵市| 南漳县| 庆元县| 富源县| 富阳市| 桃园县| 凯里市| 修武县| 六枝特区| 南漳县| 游戏| 阜平县| 柞水县| 桂阳县| 三都| 石楼县| 郧西县| 汕尾市|