歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁 裝配圖網(wǎng) > 資源分類 > DOC文檔下載  

畢業(yè)設計(論文)嵌入式操作系統(tǒng)μCOSII在C8051F040單片機中移植研究

  • 資源ID:38436475       資源大?。?span id="fnny5gq" class="font-tahoma">323KB        全文頁數(shù):24頁
  • 資源格式: DOC        下載積分:10積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要10積分
郵箱/手機:
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復下載(系統(tǒng)自動生成)
支付方式: 微信支付   
驗證碼:   換一換

 
賬號:
密碼:
驗證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會被瀏覽器默認打開,此種情況可以點擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預覽文檔經過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標題沒有明確說明有答案則都視為沒有答案,請知曉。

畢業(yè)設計(論文)嵌入式操作系統(tǒng)μCOSII在C8051F040單片機中移植研究

目 錄 摘要…………………………………………………………..………………………..………….….1 關鍵詞…………………………………………………………………………………..…………....1 Abstract…………………………………………………………………………………..…………..2 Key words…………………………………………………………………………………..………..2 1. 緒論…………………………………………………………………………………………….…3 1.1 嵌入式操作系統(tǒng)………………………………………………………………..……….…..3 1.1.1 嵌入式系統(tǒng)的發(fā)展狀況……………………………………………………………....3 1.1.2 嵌入式操作系統(tǒng)的分類和發(fā)展………………………………………….…………...5 1.2 本課題研究的目的和意義……………………………………………………..……….…..5 2. µC/OS-Ⅱ嵌入式實時操作系統(tǒng)……………………………………………………….…………6 2.1 選擇µC/OS-Ⅱ的原因……………………………………………………………..……….6 2.2 µC/OS-Ⅱ操作系統(tǒng)內容簡介…………………………………………………...…………..7 2.2.1 內核結構……………………………………………………………..………………..7 2.2.2 任務管理……………………………………………………………...……………….8 2.2.3 時間管理……………………………………………………..………………………10 2.2.4 任務間通信與同步……………………………………………..……………………11 2.2.5 內存管理………………………………………………………..……………………12 3. C8051F系列單片機的特點……………………………………………………………………..13 3.1 C8051F系列單片機的特點……………………………………………………………..…13 3.2 C8051F040的性能概述……………………………………………….…………………...13 4. µC/OS-Ⅱ在C8051F040上的移植………………………………………………………….…..15 4.1 µC/OS-Ⅱ硬件平臺的選擇………………………………………………….…………..…15 4.2 µC/OS-Ⅱ移植內容………………………………………………………….……………..15 4.2.1 OS_CPU.H頭文件的修改………………………………………………………….16 4.2.2 OS_CPU_A.ASM匯編文件的修改…………………………………………………17 4.3 µC/OS-Ⅱ在C8051F040上的運行測試……………………………………..……….……19 4.4 基于µC/OS-Ⅱ的C8051F040運用系統(tǒng)開發(fā)………………………………..…….……..21 5. 結論………………………………………………………………………………...……………22 參考文獻……………………………………………………………………………………………23 嵌入式操作系統(tǒng)μC/OS-II在C8051F040單片機中移植研究 摘要:隨著現(xiàn)代控制技術、多媒體技術與Internet的應用和普及,以計算機技術、芯 技術和軟件技術為核心的數(shù)字化技術得到了迅猛發(fā)展,掀起了一場數(shù)字化技術革命,促使消費電子、計算機、通信一體化趨勢的步伐加快,嵌入式系統(tǒng)技術成為發(fā)展重點。 本文主要介紹了嵌入式實時操作系統(tǒng)µC/OS-Ⅱ在C8051 F040上的移植過程。首先,描述了嵌入式系統(tǒng)的發(fā)展狀況;第二部分,介紹了µC/OS-Ⅱ操作系統(tǒng)的內容,包括內核結構,任務管理,時間管理,任務間通信與同步和內存管理;第三部分,介紹了C8051F系列單片機的特點;第四部分,詳細的敘述了µC/OS-Ⅱ移植的過程。 可以預見,由于µC/OS-Ⅱ具有不可替代的優(yōu)點,µC/OS-Ⅱ將在以后的嵌入式系統(tǒng)設計中得到廣泛應用。 關鍵詞:µC/OS-Ⅱ;C8051F040;嵌入式實時操作系統(tǒng);移植 Embedded operating system μ C / OS-II in the C8051F040 MCU Transplantation Abstract:With application and popularization of modern control technology , multimedia technology and Internet, the digitized technology taking computer technology , chip technology and software engineering as the core has got swift and violent development, raise digitized technical revolution, impel paces of consuming electron , computer , integrated trend of communication to accelerate, embedded systematic technology becomes the developing focus。 This dissertation mainly introduces µC/OS-Ⅱtransplantation course on C8051 F040 of embedded real-time operating system;and secondly, introduced µ C/OS- II operating system elements, including core structure, task management, time management, intertask communication and synchronization, and memory management.;The third part, on the characteristics of C8051F Series MCU; fourth part of a detailed description of the μ C/OS- Ⅱ transplant process. It can be predicted that as µC/OS-Ⅱ irreplaceable advantages µC/OS-Ⅱ will be at a later embedded systems design widely used. Key words:µC/OS-Ⅱ;C8051F040;Embedded Real-time OS;Porting 23 1 緒論 1.1 嵌入式操作系統(tǒng) 1.1.1 嵌入式系統(tǒng)的發(fā)展狀況 嵌入式系統(tǒng)誕生于微型機時代,隨著微型機技術的完善和發(fā)展,微型機出現(xiàn)了嵌入式應用環(huán)境,傳統(tǒng)電子設備的智能化不同于通用機的嵌入式應用?,F(xiàn)代計算機有通用計算機和嵌入式計算機兩大分支,他們是兩個完全不同的計算機技術領域。通用計算機系統(tǒng)是高速海量數(shù)值計算,嵌入式系統(tǒng)是對象嵌入和智能化控制。分工后兩個分支呈現(xiàn)高速發(fā)展的態(tài)勢。 嵌入式系統(tǒng)是嵌入到對象體系中的專用計算機應用系統(tǒng)。其嵌入性是指非獨立存在的物理空間,專用性是滿足對象體系要求的軟硬件裁剪,它是智能化的工具保證。由于傳統(tǒng)電子系統(tǒng)的嵌入式應用環(huán)境是超小型、超低價、高可靠的嵌入式計算機,這就需要尋求芯片化的徹底解決辦法,單片微型計算機應運而生,走單片機獨立發(fā)展道路成了必然選擇。 一個嵌入式系統(tǒng)包括硬件和軟件兩部分。硬件包括微處理器、存儲器及外設器件等,而軟件包括操作系統(tǒng)軟件和應用程序。為了提高系統(tǒng)性能,除了需要對硬件和軟件進行優(yōu)化外,還會引入總線的概念。與普通計算機系統(tǒng)類似,嵌入式系統(tǒng)仍然包括微處理器、存儲設備和輸入、輸出設備,但是它與一般的PC系統(tǒng)還有很大的區(qū)別。一般來講,嵌入式系統(tǒng)在功耗、體積、成本、可靠性、速度、處理能力、電磁兼容性等方面均受到應用要求的制約。 作為二十世紀人類最偉大的發(fā)明之一,計算機在期待著第五代出現(xiàn)的同時,也邁入了其另一個新階段——后PC時代。后PC時代的到來,使得人們開始越來越多的接觸到一個新的概念——嵌入式產品,如手機、PDA、數(shù)控機床等。其實,嵌入式操作系統(tǒng)很早以前就出現(xiàn)就得到了廣泛應用,如微型計算器、PC中的鍵盤,都是最典型最簡單的嵌入式系統(tǒng)。如果說PC機的出現(xiàn)構建了信息產業(yè)的框架,推動了整個信息產業(yè)和人類文明的發(fā)展和前進,那么嵌入式系統(tǒng)的發(fā)展將會更加完善這個框架,并成為信息產業(yè)發(fā)展的加速器。 根據(jù)IEEE的定義,嵌入式系統(tǒng)是控制、監(jiān)視或者輔助設備機器和車間運行的裝置,這主要是從產品的應用角度加以定義的。按照目前業(yè)界和學術界對嵌入式系統(tǒng)的普遍看法,嵌入式操作系統(tǒng)被定義為以應用為中心,以計算機技術為基礎,軟硬件可裁剪,適應應用系統(tǒng)對功能、可靠性、成本、體積、功耗嚴格要求的專用計算機系統(tǒng)。 嵌入式系統(tǒng)技術是將先進的計算機技術、半導體技術及電子技術和各個行業(yè)的具體應用相結合后的產物,這一點就決定了它必然是一個技術密集、資金密集、高度分散、不斷創(chuàng)新的知識集成系統(tǒng)。綜觀嵌入式系統(tǒng)技術的發(fā)展,大致經歷了以下三個階段: (1)第一階段是嵌入式技術的早期階段。 嵌入式操作系統(tǒng)的發(fā)展歷史悠久,可以說它是伴隨著數(shù)字計算機的出現(xiàn)而誕生的。但早期的計算機主要器件由電子管、晶體管等組成,體積過于龐大,因而阻礙了嵌入式系統(tǒng)的發(fā)展。早期系統(tǒng)以功能簡單的專用計算機或單片機為核心的可編程控制器形式存在,具有監(jiān)測、伺服、設備指示等功能。這一階段系統(tǒng)的主要特點是系統(tǒng)結構和功能都相對單一,處理效率較低,存儲容量較小,幾乎沒有用戶接口,比較適合于各類專用領域。 (2) 第二階段是以嵌入式處理器/控制器和嵌入式操作系統(tǒng)為標志的嵌入式系統(tǒng)。 隨著并行技術、先進控制、流水線、強有力的中斷系統(tǒng)、操作系統(tǒng)等技術的發(fā)展,特別是在微處理器問世以后,嵌入式系統(tǒng)得到了真正的發(fā)展。微處理器的廣泛應用形成了一個廣闊的嵌入式應用市場。 這一階段系統(tǒng)的主要特點是計算機硬件出現(xiàn)了高可靠、低功耗的嵌入式處理器;同時,各類商業(yè)嵌入式操作系統(tǒng)開始出現(xiàn)并得到遜色發(fā)展,嵌入式操作系統(tǒng)能運行于各種不同類型的微處理器上,兼容性好;操作系統(tǒng)內核小、效率高,并具備高度的模塊化和擴展性;具備文件和目錄管理、設備支持、多任務、網(wǎng)絡支持、圖形窗口以及用戶界面等功能;具備大量的應用程序接口,開發(fā)應用程序簡單;嵌入式應用軟件豐富。 (3)第三階段是以芯片技術和Internet技術為標志的嵌入式系統(tǒng)。 微電子技術發(fā)展迅速,SOC技術使嵌入式系統(tǒng)越來越小,功能越來越強。隨著NOC的出現(xiàn),以及Internet技術與信息家電、工業(yè)控制技術等的結合日益密切,嵌入式系統(tǒng)的網(wǎng)絡化趨勢將推動其更加快速的發(fā)展。 近幾年嵌入式操作系統(tǒng)技術的發(fā)展有以下幾個顯著的變化: (1)新的處理器越來越多,一方面,嵌入式操作系統(tǒng)自身結構的設計更易于移植,以便在短時間內支持更多種微處理器;另一方面,系統(tǒng)應能使用驅動程序開發(fā)與配置環(huán)境,造就一個新的BSP和驅動程序結構,以適應微處理器不斷升級變化所產生的需求。 (2)開放源碼之風已波及嵌入式系統(tǒng)廠家。數(shù)量相當多的嵌入式系統(tǒng)廠家出售產品時,就附加了源程序代碼并含生產版稅。 (3)后PC時代更多的產品使用嵌入式操作系統(tǒng),它們對實時性要求并不高。 (4)電信設備、控制系統(tǒng)要求的高可靠性,對嵌入式系統(tǒng)提出了新的要求。 (5)各類通用機上使用的新技術、新觀念正逐步移植到嵌入式系統(tǒng)中。 (6)各種嵌入式Linux操作系統(tǒng)正迅速發(fā)展,已經形成了能與Windows CE等嵌入式操作系統(tǒng)進行有力競爭的局面。 (7)面向定制趨勢,在系統(tǒng)級整合改造并支持應用特制的性能,即在定制商品化的軟硬件上提供高性能和高可靠性系統(tǒng)服務,將操作系統(tǒng)的功能和內存需求定制成每個應用所需的系統(tǒng)。 (8)嵌入式系統(tǒng)的多媒體化和網(wǎng)絡化方向趨勢。 (9)基于知識的嵌入式系統(tǒng)也已開始出現(xiàn)。 隨著因特網(wǎng)技術的成熟、帶寬的提高,ICP在網(wǎng)上提供的信息內容日趨豐富、應用項目多種多樣,嵌入式電子設備的功能不再單一,電氣結構也更復雜。 后PC時代,計算機將無處不在,家用電器將向數(shù)字化和網(wǎng)絡化發(fā)展,電視機、冰箱、微波爐、電話等都將嵌入計算機,并通過家庭控制中心與Internet聯(lián)接,轉變?yōu)橹悄芫W(wǎng)絡家電,還可以實現(xiàn)遠程醫(yī)療、遠程教育等。中國擁有最大的手機用戶,而掌上電腦和PDA等因為易于使用,攜帶方便、價格便宜而得到了快速發(fā)展,PDA與手機已呈現(xiàn)融合趨勢。用掌上電腦或PDA上網(wǎng),人們可以隨時隨地獲取信息。新的手持設備將使無線互聯(lián)訪問成為更加普遍的現(xiàn)象。與互聯(lián)網(wǎng)聯(lián)接,結合音頻應用,如MP3功能,將會促使移動計算設備市場創(chuàng)造新的銷售記錄。整合手機模塊,為移動計算設備提供語音功能,也將是大勢所趨。 1.1.2 嵌入式操作系統(tǒng)的分類和發(fā)展 國外的嵌入式操作系統(tǒng)有VXWORK、QNX、PALMOS、Windows CE、Linux、µC/OS-Ⅱ等,國內有基于Windows CE的機頂盒系統(tǒng)和HOPEN OS等。 從應用方面分為面向低端設備的嵌入式操作系統(tǒng)和面向高端設備的嵌入式操作系統(tǒng)。傳統(tǒng)的嵌入式系統(tǒng)主要是面向低端設備的操作系統(tǒng),如各種工業(yè)系統(tǒng)、汽車發(fā)動機系統(tǒng)和防報死系統(tǒng)、民用微波爐、洗衣機、冰箱等。這類應用客觀上要求操作系統(tǒng)體積小,實時性強,開放源代碼的實時操作系統(tǒng)µC/OS就屬這類。芯片技術的發(fā)展使得高端設備也成為嵌入式系統(tǒng)。這類系統(tǒng)通常具體和計算機主板相似的結構,使用的CPU是功能強大的16位和32位微處理器。信息化家電、掌上電腦、機頂盒、WAP手機,WinCE、PALMOS和Linux便屬于這類操作系統(tǒng)。 嵌入式軟件是數(shù)字化產品的核心,PC的出現(xiàn)使桌面軟件得到了飛速發(fā)展,而數(shù)字化產品的廣泛普及必將為嵌入式軟件產業(yè)的蓬勃發(fā)展提供無窮的推動力。操作系統(tǒng)控制著應用程序和硬件之間的交互作用,應用程序控制著系統(tǒng)的運行。 隨著嵌入式應用系統(tǒng)架構的開發(fā)越來越復雜,嵌入式操作系統(tǒng)軟件的開發(fā)往往開始得很晚,導致軟硬件的集成被推遲,所以,很可能導致研發(fā)出有設計錯誤的產品,錯失市場機會,造成設計反復、成本高昂等問題。因此,軟件成為設計開發(fā)的關鍵,軟件需要在標準化平臺上運行,軟件發(fā)展需要工具支持,軟件發(fā)展不斷促進標準的建立,如MIPI、OpenGL、JSR184等。 1.2 本課題研究的目的和意義 嵌入式操作系統(tǒng)是嵌入式系統(tǒng)發(fā)展到一定階段的產物,是為了滿足日益復雜的嵌入式系統(tǒng)設計的要求而產生的。隨著微處理器功能的不斷提升,嵌入式操作系統(tǒng)的應用范圍也變得越來越強大。對基于特定嵌入式操作系統(tǒng)上的軟件設計研究已成為了近年來的熱點,并且對于嵌入式操作系統(tǒng)在實際工程中的推廣應用有著重要的意義。本課題研究在存儲器資源受限,但應用非常廣泛的8位單片機(以C8051F040為例)中移入嵌入式µC/OS-Ⅱ操作系統(tǒng),為8位單片機的應用提供新的空間。 2 µC/OS-Ⅱ嵌入式實時操作系統(tǒng) 2.1 選擇µC/OS-Ⅱ的原因 µC/OS是一個實時操作系統(tǒng),是由Jean J.Labrosse于1992年首先設計編寫的。1999年,Labrosse又編寫了µC/OS-Ⅱ。該操作系統(tǒng)是一個高度簡潔、可ROM固化、可裁剪、實現(xiàn)搶先式實時多任務的操作系統(tǒng)內核,可用于各種微處理機系統(tǒng)。µC/OS-Ⅱ可管理多達64個任務,并可提供如下服務: (1)信號燈 (2)互斥式信號燈 (3)事件標志 (4)消息隊列 (5)任務管理 (6)存儲塊管理 (7)定時管理 實時執(zhí)行體一般包括一套支持實時系統(tǒng)所必需的機制。在嵌入式應用中,這一套機制被稱為實時執(zhí)行體或實時操作系統(tǒng)內核。操作系統(tǒng)就是一個實時執(zhí)行體??刹眉舻捏w系結構是指一個軟件系統(tǒng)能夠支持多種應用而無需在接口上做很大的變動。因此,可以開發(fā)出成本低、品種多的軟件產品。 µC/OS-Ⅱ的特點如下: (1) 開放的源代碼 (2) 可移植性:絕大部分用ANSI C寫,和硬件相關的用匯編語言寫。 (3) 可固化性:只要有合適的軟件工具就可以µC/OS-Ⅱ嵌入到產品中去。 (4) 可裁剪性:產品可以只調用很少的µC/OS-Ⅱ,這樣可以減少存儲空間,這是依靠條件編譯來實現(xiàn)的。 (5) 占先式:µC/OS-Ⅱ是運行就緒條件下優(yōu)先級最高的任務。 (6) 多任務:µC/OS-Ⅱ可以管理64個任務,8個給系統(tǒng)。 (7) 可確定性:µC/OS-Ⅱ函數(shù)調用與服務執(zhí)行時間是可知的。 (8) 任務棧:使用µC/OS-Ⅱ??臻g校驗函數(shù)可以確定任務有多少棧空間。 (9) 系統(tǒng)服務:µC/OS-Ⅱ提供例如郵箱、信號量、消息隊列等系統(tǒng)服務。 (10) 中斷管理:中斷足以使正在執(zhí)行的任務暫時掛起。 (11) 穩(wěn)定性和可靠性:µC/OS-Ⅱ是基于µC/OS的,已有幾百個商業(yè)應用。 對于國內大多數(shù)使用8051系列單片機的用戶來說,µC/OS-Ⅱ具有很高的性價比,很適合這樣的嵌入式應用。µC/OS-Ⅱ是基于優(yōu)先級的搶占式實時多任務操作系統(tǒng),具有如下特點:開放源代碼,可移植性,可裁剪性,良好的穩(wěn)定性和可靠性。 µC/OS-Ⅱ很容易地移植到各種各樣的CPU平臺上,只要這一種微處理機能滿足以下條件即可:具有堆棧指針,可執(zhí)行CPU內部寄存器的入棧、出棧指令;所使用的C編譯器支持內嵌匯編指令,或者C編譯器支持可擴展、可連接匯編模塊,使得中斷控制能夠在C語言匯總實現(xiàn)。 µC/OS-Ⅱ可以在絕大多數(shù)的8位、16位、32位,甚至是64位的微處理機系統(tǒng)或數(shù)字信號處理器系統(tǒng)中運行。 2.2 µC/OS-Ⅱ操作系統(tǒng)內容簡介 2.2.1 內核結構 就像所有的實時內核一樣,µC/OS-Ⅱ 需要在存取代碼核心區(qū)時禁止中斷,在存取完成后再將中斷重新打開。禁止中斷是為了保護核心區(qū)代碼,以免出現(xiàn)多個任務或中斷服務程序同時進入該代碼區(qū)。中斷禁止時間是實時內核的一項最重要的指標,因為它影響著系統(tǒng)對實時事件的響應能力。 µC/OS-Ⅱ試圖將這段中斷禁止時間減至最小。但是,這在很大程度上還取決于系統(tǒng)的CPU結構,以及編譯器生成的代碼質量。CPU通常提供禁止/允許中斷的匯編指令,而用戶的編譯器必須支持從C語言中直接執(zhí)行這種操作。有一些編譯器允許用戶在C原碼中插入?yún)R編語句,這樣,就使得插入允許和禁止中斷的指令非常方便。 為了將由于上述編譯器的差異而導致的中斷設置差異隱藏起來,µC/OS-Ⅱ了兩個宏來實現(xiàn)對中斷的允許和禁止:OS_ENTER_CRITICAL( )和OS_EXIT_CRTICAL( )。這兩個宏的實現(xiàn)是由CPU決定的,它們在os_cpu.h的頭文件中定義,每種CPU都會在os_cpu.h中移植實現(xiàn)這個宏。 OS_ENTER_CRITICAL( )和OS_EXIT_CRTICAL( )可以有三種不同的實現(xiàn)方法。具體使用哪種,取決于用戶的CPU能力。用戶可通過#define OS_CRITICAL_METHOD 來定義選用一種實現(xiàn)方法。 第一種方法:#define OS_CRITICAL_METHOD1 這也是最簡單的一種實現(xiàn)OS_ENTER_CRITICAL( )和OS_EXIT_CRTICAL( )的方法。如果用戶在中斷禁止的情況下調用了一個µC/OS-Ⅱ函數(shù),而在從一個µC/OS-Ⅱ函數(shù)返回時,中斷將被允許。但是,如果用戶在調用µC/OS-Ⅱ之前已禁止了中斷,而一般在調用返回以后仍要求禁止中斷。 第二種方法:#define OS_CRITICAL_METHOD2 這種實現(xiàn)方法在實現(xiàn)OS_ENTER_CRITICAL( )時,是將禁止的中斷狀態(tài)保留在堆棧中,然后禁止中斷。而OS_EXIT_CRTICAL( )的實現(xiàn)只需要簡單地將中斷狀態(tài)從堆棧中恢復出來。通過這種方案,無論是在中斷禁止時,還是中斷允許時調用µC/OS-Ⅱ服務,都可以在該調用前后保留中斷狀態(tài)。 第三種方法:# define OS_CRITICAL_METHOD3 有些編譯器提供了一些功能擴展,允許用戶獲取CPU狀態(tài)字,并可以將它存入函數(shù)的局部變量中。µC/OS-Ⅱ代碼主要由C語言實現(xiàn),而C語言中的數(shù)據(jù)類型一般與硬件平臺所對應的編譯器有關。為了實現(xiàn)在各種硬件平臺上的可移植性,µC/OS-Ⅱ了自己定義的基本數(shù)據(jù)類型。 µC/OS-Ⅱ庫函數(shù)可以分為以下幾類:任務控制類:用于實現(xiàn)µC/OS-Ⅱ啟動、任務管理、任務調度、任務優(yōu)先級設置等功能。動態(tài)內存管理類:用于實現(xiàn)µC/OS-Ⅱ內存的動態(tài)管理。用µC/OS-Ⅱ時,最好采用µC/OS-Ⅱ的內存管理函數(shù)。 為了使μC/OS-Ⅱ能管理用戶任務,用戶必須在建立一個任務的時候,將任務的起始地址與其它參數(shù)一起傳給下面兩個函數(shù)中的一個:OSTastCreat或OSTaskCreatExt()。OSTaskCreateExt()是OSTaskCreate()的擴展,擴展了一些附加的功能。 圖2.1是μC/OS-Ⅱ控制下的任務狀態(tài)轉換圖。在任一給定的時刻,任務的狀態(tài)一定是在這五種狀態(tài)之一。 圖2-1 任務狀態(tài)轉換圖 2.2.2 任務管理 任務可以是一個無限的循環(huán),也可以是在一次執(zhí)行完畢后被刪除掉。這里要注意的是,任務代碼并不是被真正的刪除了,而只是µC/OS-Ⅱ不再理會該任務代碼,所以該任務代碼不會再運行。任務看起來與任何C函數(shù)一樣,具有一個返回類型和一個參數(shù),只是它從不返回。任務的返回類型必須被定義成void型。這里提到的函數(shù)可以在OS_TASK文件中找到。其內容包括如何在用戶的應用程序中建立任務、刪除任務、改變任務的優(yōu)先級、掛起和恢復任務,以及獲得有關任務的信息。 µC/OS-Ⅱ可以管理多達64個任務,并從中保留了四個最高優(yōu)先級和四個最低優(yōu)先級的任務供自己使用,所以用戶可以使用的只有56個任務。任務的優(yōu)先級越高,反映優(yōu)先級的值則越低。在最新的µC/OS-Ⅱ中,任務的優(yōu)先級數(shù)也可作為任務的標識符使用。想讓µC/OS-Ⅱ管理用戶的任務,用戶必須要先建立任務。 用戶可以通過傳遞任務地址和其它參數(shù)到以下兩個函數(shù)之一來建立任務:OSTaskCreate() 或 OSTaskCreateExt()。OSTaskCreate()與µC/OS是向下兼容的,OSTaskCreateExt()是OSTaskCreate()的擴展版本,提供了一些附加的功能。用兩個函數(shù)中的任何一個都可以建立任務。 任務可以在多任務調度開始前建立,也可以在其它任務的執(zhí)行過程中被建立。在開始多任務調度(即調用id參數(shù)為要建立的任務創(chuàng)建一個特殊的標識符。該參數(shù)在µC/OS以后的升級版本中可能會用到,但在µC/OS-Ⅱ中還未使用。這個標識符可以擴展µC/OS-Ⅱ功能,使它可以執(zhí)行的任務數(shù)超過目前的64個。pbos是指向任務的堆棧棧底的指針,用于堆棧的檢驗。stk_size用于指定堆棧成員數(shù)目的容量。也就是說,如果堆棧的入口寬度為4字節(jié)寬,那么stk_size為10000是指堆棧有40000個字節(jié)。該參數(shù)與pbos一樣,也用于堆棧的檢驗。pext是指向用戶附加的數(shù)據(jù)域的指針,用來擴展任務的OS_TCB。每個任務都有自己的堆??臻g。堆棧必須聲明為OS_STK類型,并且由連續(xù)的內存空間組成。用戶可以靜態(tài)分配堆??臻g(在編譯的時候分配)也可以動態(tài)地分配堆??臻g(在運行的時候分配)。用戶可以用C編譯器提供的malloc()函數(shù)來動態(tài)地分配堆??臻g,在動態(tài)分配中,用戶要時刻注意內存碎片問題。特別是當用戶反復地建立和刪除任務時,內存堆中可能會出現(xiàn)大量的內存碎片,導致沒有足夠大的一塊連續(xù)內存區(qū)域可用作任務堆棧,這時malloc()便無法成功地為任務分配堆??臻gµC/OS-Ⅱ 支持的處理器的堆棧既可以從上(高地址)往下(低地址)長也可以從下往上長。 用戶在調用OSTaskCreate()或OSTaskCreateExt()的時候必須知道堆棧是怎樣長的,因為用戶必須得把堆棧的棧頂傳遞給以上兩個函數(shù),當OS_CPU.H文件中的OS_STK_GROWTH置為0時,用戶需要將堆棧的最低內存地址傳遞給任務創(chuàng)建函數(shù)。任務所需的堆棧的容量是由應用程序指定的。用戶在指定堆棧大小的時候必須考慮任務所調用的所有函數(shù)的嵌套情況,任務所調用的所有函數(shù)會分配的局部變量的數(shù)目,以及所有可能的中斷服務例程嵌套的堆棧需求。另外,堆棧必須能儲存所有的CPU寄存器。有時候決定任務實際所需的堆??臻g大小是很有必要的。因為這樣用戶就可以避免為任務分配過多的堆棧空間,從而減少自己的應用程序代碼所需的RAM(內存)數(shù)量。µC/OS-Ⅱ提供的OSTaskStkChk()函數(shù)可以提供這種有價值的信息。 為了使用µC/OS-Ⅱ的堆棧檢驗功能,必須要 做以下幾件事情:在OS_CFG.H文件中設OS_TASK_CREATE_EXT為1。用OSTaskCreateExt()建立任務,并給予任務比實際需要更多的內存空間。在OSTaskCreateExt()中,將參數(shù)opt設置為OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR。將想檢驗的任務的優(yōu)先級作為OSTaskStkChk()的參數(shù)并調用之。OSTaskStkChk()順著堆棧的棧底開始計算空閑的堆??臻g大小,具體實現(xiàn)方法是統(tǒng)計儲存值為0的連續(xù)堆棧入口的數(shù)目,直到發(fā)現(xiàn)儲存值不為0的堆棧入口。注意堆棧入口的儲存值在進行檢驗時使用的是堆棧的數(shù)據(jù)類型。 有時候刪除任務是很有必要的。刪除任務,是說任務將返回并處于休眠狀態(tài),并不是說任務的代碼被刪除了,只是任務的代碼不再被µC/OS-Ⅱ調用。任務的刪除意味著:它的任務控制塊從OSTCBList鏈表中移到OSTCBFreeList,這樣時鐘節(jié)拍函數(shù)中就不會處理它了,這樣調度把它置入就緒表的可能性就沒了;如果它已經處于就緒表中,那么它將被移出,這樣調度器函數(shù)就不會處理它,這樣它被調度運行的機會就沒了;在建立任務的時候會分配給任務一個優(yōu)先級。在程序運行期間,用戶可以通過調用OSTaskChangePrio()來改變任務的優(yōu)先級。換句話說,就是µC/OS-Ⅱ允許動態(tài)的改變任務的優(yōu)先級。 用戶不能改變空閑任務的優(yōu)先級,但可以改變調用本函數(shù)的任務或者其它任務的優(yōu)先級。為了改變調用本函數(shù)的任務的優(yōu)先級,可以指定該任務當前的優(yōu)先級或OS_PRIO_SELF,OSTaskChangePrio()會決定該任務的優(yōu)先級。用戶還必須指定任務的新優(yōu)先級。因為µC/OS-Ⅱ不允許多個任務具有相同的優(yōu)先級,所以OSTaskChangePrio()需要檢驗新優(yōu)先級是否是合法的。 2.2.3 時間管理 µC/OS-Ⅱ要求提供定時中斷來實現(xiàn)延時與超時控制等功能。這個定時中斷叫做時鐘節(jié)拍,它應該每秒發(fā)生10至100次。時鐘節(jié)拍的實際頻率是由用戶的應用程序決定的。時鐘節(jié)拍的頻率越高,系統(tǒng)的負荷就越重。時鐘的 中斷服務子程序和節(jié)時鐘節(jié)函數(shù)OSTimeTick——該函數(shù)用于通知µC/OS-Ⅱ發(fā)生了時鐘節(jié)拍中斷。這里主要講述五個與時鐘節(jié)拍有關的系統(tǒng)服務: (1) OSTimeDly() (2) OSTimeDlyHMSM() (3) OSTimeDlyResume() (4) OSTimeGet() (5) OSTimeSet() µC/OS-Ⅱ提供了這樣一個系統(tǒng)服務:申請該服務的任務可以延時一段時間,這段時間的長短是用時鐘節(jié)拍的數(shù)目來確定的。實現(xiàn)這個系統(tǒng)服務的函數(shù)叫做OSTimeDly()。調用該函數(shù)會使µC/OS-Ⅱ進行一次任務調度,并且執(zhí)行下一個優(yōu)先級最高的就緒態(tài)任務。任務調用OSTimeDly()后,一旦規(guī)定的時間期滿或者有其它的任務通過調用OSTimeDlyResume()取消了延時,它就會馬上進入就緒狀態(tài)。只有當該任務在所有就緒任務中具有最高的優(yōu)先級時,它才會立即運行。 OSTimeDly()雖然是一個非常有用的函數(shù),但應用程序需要知道延時時間對應的時鐘節(jié)拍的數(shù)目。用戶可以使用定義全局常數(shù)OS_TICKS_PER_SEC的方法將時間轉換成時鐘段,但這種方法有時顯得比較愚笨。如果增加了OSTimeDlyHMSM()函數(shù)后,用戶就可以按小時(H)、分(M)、秒(S)和毫秒(m)來定義時間了,這樣會顯得更自然些。與OSTimeDly()一樣,調用OSTimeDlyHMSM()函數(shù)也會使µC/OS-Ⅱ進行一次任務調度,并且執(zhí)行下一個優(yōu)先級最高的就緒態(tài)任務。任務調用OSTimeDlyHMSM()后,一旦規(guī)定的時間期滿或者有其它的任務通過調用OSTimeDlyResume()取消了延時,它就會馬上處于就緒態(tài)。同樣,只有當該任務在所有就緒態(tài)任務中具有最高的優(yōu)先級時,它才會立即運行。 µC/OS-Ⅱ允許用戶結束延時正處于延時期的任務。延時的任務可以不等待延時期滿,而是通過其它任務取消延時來使自己處于就緒態(tài)。這可以通過調用OSTimeDlyResume()和指定要恢復的任務的優(yōu)先級來完成。實際上,OSTimeDlyResume()也可以喚醒正在等待事件的任務,雖然這一點并沒有提到過。在這種情況下,等待事件發(fā)生的任務會考慮是否終止等待事件。 無論時鐘節(jié)拍何時發(fā)生,µC/OS-Ⅱ都會將一個32位的計數(shù)器加1。這個計數(shù)器在用戶調用OSStart()初始化多任務和4,294,967,295個節(jié)拍執(zhí)行完一遍的時候從0開始計數(shù)。在時鐘節(jié)拍的頻率等于100Hz的時候,這個32位的計數(shù)器每隔497天就重新開始計數(shù)。 用戶可以通過調用OSTimeGet()來獲得該計數(shù)器的當前值。也可以通過調用OSTimeSet()來改變該計數(shù)器的值注意,在訪問OSTime的時候中斷是關掉的。這是因為在大多數(shù)8位處理器上增加和拷貝一個32位的數(shù)都需要數(shù)條指令,這些指令一般都需要一次執(zhí)行完畢,而不能被中斷等因素打斷。 2.2.4 任務間通信與同步 在µC/OS-Ⅱ中,有多種方法可以保護任務之間的共享數(shù)據(jù)和提供任務之間的通訊。這里只講其中的兩種:一是利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()來關閉中斷和打開中斷。當兩個任務或者一個任務和一個中斷服務子程序共享某些數(shù)據(jù)時,可以采用這種方法。二是利用函數(shù)OSSchedLock()和OSSchedUnlock()對µC/OS-II中的任務調度函數(shù)上鎖和開鎖。用這種方法也可以實現(xiàn)數(shù)據(jù)的共享。 圖2-2 事件控制塊的使用 圖2.2表示任務和中斷服務子程序之間是如何進行通訊的。一個任務或者中斷服務子程序可以通過事件控制塊ECB(Event Control Blocks)來向另外的任務發(fā)信號。這里,所有的信號都被看成是事件(Event)。這也說明為什么上面把用于通訊的數(shù)據(jù)結構叫做事件控制塊。 一個任務還可以等待另一個任務或中斷服務子程序給它發(fā)送信號。只有任務可以等待事件發(fā)生,中斷服務子程序是不能這樣做的。對于處于等待狀態(tài)的任務,還可以給它指定一個最長等待時間,以此來防止因為等待的事件沒有發(fā)生而無限期地等下去。 多個任務可以同時等待同一個事件的發(fā)生。在這種情況下,當該事件發(fā)生后,所有等待該事件的任務中,優(yōu)先級最高的任務得到了該事件并進入就緒狀態(tài),準備執(zhí)行。上面講到的事件,可以是信號量、郵箱或者消息隊列等。當事件控制塊是一個信號量時,任務可以等待它,也可以給它發(fā)送消息。 2.2.5 內存管理 在ANSI C中可以用malloc()和free()兩個函數(shù)動態(tài)地分配內存和釋放內存。但是,在嵌入式實時操作系統(tǒng)中,多次這樣做會把原來很大的一塊連續(xù)內存區(qū)域,逐漸地分割成許多非常小而且彼此又不相鄰的內存區(qū)域,也就是內存碎片。由于這些碎片的大量存在,使得程序到后來連非常小的內存也分配不到。在任務堆棧中,講過用malloc()函數(shù)來分配堆棧時,也討論過內存碎片的問題。另外,由于內存管理算法的原因,malloc()和free()函數(shù)執(zhí)行時間是不確定的。 在µC/OS-Ⅱ中,操作系統(tǒng)把連續(xù)的大塊內存按分區(qū)來管理。每個分區(qū)中包含有整數(shù)個大小相同的內存塊。利用這種機制,µC/OS-Ⅱ 對malloc()和free()函數(shù)進行了改進,使得它們可以分配和釋放固定大小的內存塊。這樣一來,malloc()和free()函數(shù)的執(zhí)行時間也是固定的了。 如圖2.3,在一個系統(tǒng)中可以有多個內存分區(qū)。這樣,用戶的應用程序就可以從不同的內存分區(qū)中得到不同大小的內存塊。但是,特定的內存塊在釋放時必須重新放回它以前所屬于的內存分區(qū)。 顯然,采用這樣的內存管理算法,上面的內存碎片問題就得到了解決。為了便于內存的管理,在µC/OS-Ⅱ中使用內存控制塊(memory control blocks)的數(shù)據(jù)結構來跟蹤每一個內存分區(qū),系統(tǒng)中的每個內存分區(qū)都有它自己的內存控制塊。 圖2-3 內存分區(qū) 3 C8051F系列單片機的特點 3.1 C8051F系列單片機的特點 Cygnal公司推出的C8051F系列單片機將80C51系列單片機從MCU推向了SOC(片上系列)時代,其主要特點是: ⑴指令運行速度大大提高。C8051F系列采用CIP-51的CPU模式,指令以時鐘周期為運行單位。與8051相比,相同的時鐘下,單周期指令運行速度為原來的12倍;全指令集平均運行速度為原來的9.5倍。 ⑵I/O從固定方式到交叉開關配置。C8051F系列采用開關網(wǎng)絡以硬件方式實現(xiàn)I/O端口的靈活配置。在這種通過交叉開關配置的I/O端口系統(tǒng)中,單片機外部為通用I/O口,內部有輸入/輸出的電路單元,通過相應的配置寄存器控制的交叉開關配置到所選擇的端口上。 ⑶為單片機提供了一個完善的時鐘系統(tǒng)。當程序運行時,可實現(xiàn)內外時鐘的動態(tài)切換。 ⑷從傳統(tǒng)的仿真調試到基于JTAG接口的在系統(tǒng)調試。C8051F的JTAG接口不僅支持FLASH ROM的讀/寫操作及非侵入式在系統(tǒng)調試,而且它的JTAG邏輯還為在系統(tǒng)測試提供了邊界掃描功能。 ⑸從引腳復位到多源復位。C8051F的多復位源提供了上電復位、掉電復位、外部引腳復位、軟件復位、時鐘檢測復位、比較0復位、WDT復位和引腳配置復位。眾多的復位源為保障系統(tǒng)的安全、操作的靈活以及零功耗系統(tǒng)設計帶來極大的好處。 3.2 C8051F040的性能概述 C8051F040在一個芯片內集成了構成單片機數(shù)據(jù)采集或控制系統(tǒng)所需要的幾乎所有的模擬和數(shù)字外設及其他功能部件。它的供電電壓為2.7~3.6V,帶有內部可編程振蕩器。 C8051F040的A/D轉換部分包括:一個12位ADCO子系統(tǒng),可以測量12路外部輸入和1路內部溫度傳感器輸出,最高轉換速度為100KS/s;一個8位ADC1子系統(tǒng),可以測量8路外部輸入,最高轉換速度為500KS/s。C8051F040的ADC有單端輸入和差分輸入兩種測量方式,另外它還集成了跟蹤保持電路和可編程窗口檢測器。同時,C8051F040有兩個12位電壓方式DAC。每個DAC的輸出擺幅均為0~VREF(對應的輸入碼范圍是0x000~0Xfff)。 C8051F040的內核采用流水線指令結構,70%的指令的執(zhí)行時間為1個或2個系統(tǒng)時鐘周期,它的最高時鐘頻率可達25MHz。同時,它具有64KB的FLASH,可以進行在系統(tǒng)編程,扇區(qū)大小512B,另外,它還有64KB的外部數(shù)據(jù)存儲器接口,可以編程為復用和非復用方式。 C8051F040有8B寬的端口I/O,所有口線均耐5V電壓。它可以同時使用SMBus,SPI以及2個UART串口。另外,它還有可編程的16位計數(shù)器/定時器陣列,5個捕捉/比較模塊,5個通用16位計數(shù)器/定時器以及專用的看門狗定時器。 除上述功能外,C8051F040還集成了BOTSH-CAN,它兼容CAN技術規(guī)范2。0A和2.0B,主要由CAN內核、消息RAM(獨立于CIP-51的RAM)、消息處理單元和控制寄存器組成。CAN內核由CAN協(xié)議控制器和負責消息收發(fā)的串行/并行轉換RX/TX移位寄存器組成。消息RAM用于存儲消息目標和每個目標的仲裁掩碼。這種CAM處理器有32個隨意配置為發(fā)送和接收的消息目標,并且每一個消息目標都有它自己的識別掩碼,所有的數(shù)據(jù)傳輸和接收濾波都是由CAN控制器完成的,而不是由CIP-51來完成。通常CAN內核不能直接訪問消息RAM,而必須通過接口寄存器IFI或IF2來訪問。另外,CIP-51的SFR并不能直接訪問CAN內部寄存器的所有單元,其配置CAN、消息目標、讀取CAN狀態(tài)以及獲取接收數(shù)據(jù)、傳遞發(fā)送數(shù)據(jù)都由SFR中的6個特殊寄存器來完成,其中CANOCN、CANODAL、CANOADR 3個寄存器主要用來訪問修改其他不能直接訪問的CAN內部寄存器,消息處理單元則用于根據(jù)寄存器中的消息來控制CAN內核中移位寄存器和消息RAM之間的數(shù)據(jù)傳遞,同時,它還可用來管理中斷的產生。 4 µC/OS-Ⅱ在C8051F040上的移植 4.1 µC/OS-Ⅱ硬件平臺的選擇 Cygnal公司(現(xiàn)Sillicon Labs公司)的C8051F系列單片機是完全集成的混合信號系統(tǒng)級芯片(SOC),具有與MCS-51指令集完全兼容的高速 CIP-51內核。C8051F系列單片機在一個芯片內部集成了構成一個單片機數(shù)據(jù)采集或控制系統(tǒng)所需要的幾乎所有模擬和數(shù)字外設及其他功能部件,它是完全集成的混合信號片上系統(tǒng)型MCU,具有64個數(shù)字I/O引腳,C8051F040具有CAN2.0B控制器、 4352字節(jié)(256+4k)內部集成的數(shù)據(jù)RAM和64k字節(jié)在系統(tǒng)可編程FLASH程序存儲器。C8051F040是C8051F04X系列單片機中一種。其特性如下: (1)高速、流水線結構的8051兼容的CIP-51內核 (2)控制器局域網(wǎng)控制器,有32個消息對象,每個消息對象有自己的標識 (3)全速、非侵入式的系統(tǒng)調試接口 (4)真正12位、100ksps的ADC,帶PGA和8通道模擬多路開關 (5)允許高電壓差分放大器輸入到12/10位ADC,增益可編程 (6)真正8位500ksps的ADC,帶PGA和8通道模擬多路開關 (7)兩個12位DAC,具有可編程數(shù)據(jù)更新方式 (8)64KB可在系統(tǒng)編程的FLASH存儲器 (9)4352字節(jié)的片內RAM (10)可尋址64KB地址空間的外部數(shù)據(jù)存儲器接口 (11)硬件實現(xiàn)的SPI、SMBus/12C和兩個UART串行接口 (12)5個通用的16位定時器 (13)具有6個捕捉/比較模塊的可編程計數(shù)器/定時器陣列 (14)片內看門狗定時器、VDD監(jiān)視器和溫度傳感器 具有片內VDD監(jiān)視器、看門狗定時器和時鐘振蕩器的C8051F040MCU是真正能獨立工作的片上系統(tǒng)。所有模擬和數(shù)字外設均可由用戶固件使能/禁止和配置。另外,µC/OS-Ⅱ的運行平臺需要一定的條件如下: (1)由與µC/OS-Ⅱ主要是由C語言編寫的,所以要求所選CPU的C編譯器能夠產生可重入的代碼。 (2)所用C語言提供對中斷控制的方法。 (3)所用CPU支持中斷,并且能夠產生定時中斷,以便實現(xiàn)任務的切換; (4)所用CPU支持具有足夠深度的硬件堆棧; (5)所用CPU的指令系統(tǒng)中,應含有可將堆棧指針和其他CPU寄存器的內容入棧/出棧,或寫入/讀出內存的指令。 由此可見,C8051F040是適合實時操作系統(tǒng)µC/OS-Ⅱ的移植的。選擇C8051F040單片機是正確的。 4.2 µC/OS-Ⅱ移植內容 開發(fā)環(huán)境選用Keil集成開發(fā)環(huán)境,它支持C8051F040單片機,并且具有很高的編譯效率,目標板是基于C8051F040的系統(tǒng)。C8051F040單片機有JTAG接口,通過Keil開發(fā)環(huán)境與目標板進行在系統(tǒng)編程和非侵入式的全速、在系統(tǒng)調試。由µC/OS-Ⅱ的軟件體系結構如圖4.1可知,進行µC/OS-Ⅱ的移植只需要修改與硬件有關的OS_CPU.H、OS_CPU_C.C、OS_CPU_A.ASM三個文件。但是Keil編譯器的缺省編譯的函數(shù)是不具有可重入性,而系統(tǒng)的多任務必須要求具有可重人性,因此必須對在多任務時調用的所有函數(shù)后面都加上reentrant關鍵字,告訴編譯器該函數(shù)具有可重人性。下面將論述對與硬件相關的三個文件的修改。 要將µc/OS-Ⅱ移植到一個新的硬件平臺上,應該了解µc/OS-Ⅱ操作系統(tǒng)的總體結構。 圖 4-1 µc/OS-Ⅱ體系結構示意圖 4.2.1 OS_CPU.H頭文件的修改 OS_CPU.H 文件中包含與處理器相關的常量,宏和結構體的定義。由于不同的處理器有不同的字長,µC/OS-Ⅱ的移植需要重新定義一系列的數(shù)據(jù)結構。需要改動部分主要是有三點: 1、C8051F單片機的數(shù)據(jù)字節(jié)是8位,故堆棧的數(shù)據(jù)類型OS-STK定義為8位。修改如下: typedef unsigned char OS-STK; 2、C8051F單片機的堆棧指針SP的生長是從低字節(jié)到高字節(jié),也就是從下往上增長,因此應這樣修改: #define OS-STK-GROWTH 0; 3、采用的關中斷的方式是,先將中斷禁止狀態(tài)保存到堆棧中,然后禁止中斷。所以開關中斷應修改如下: #define OS_ENTER_CRITICAL() EA=0 //關中斷 #define OS_EXIT_CRITICAL() EA=1 //開中斷 4、µC/OS-Ⅱ在8051上的移植采用程序調用代替,和在8086上的堆棧格式相同: #define OS_TASK_SW() OSCtXSW(); 4.2.2 OS_CPU_A.ASM匯編文件的修改 µC/OS-Ⅱ的移植需要用戶改寫OS_CPU_A.ASM中的四個函數(shù): (1)OSStartHighRdy() (2)OSCtxSw() (3)OSIntCtxSw() (4)OSTickISR() 該文件主要包括任務切換的處理和系統(tǒng)時鐘的定時,主要的子程序函數(shù)有OSStartHighRdy(),OSCtxSw(),OSIntCtxSw()和OSTickISR()。 因為匯編子程序將被C函數(shù)所調用,因此,匯編程序的編寫必須遵循Keil C函數(shù)和匯編子程序的調用規(guī)則。當µC/OS-Ⅱ啟動多任務時,必須調用OS- StartHighRdy()函數(shù)使處于最高優(yōu)先級的任務處于就緒態(tài)并且開始運行。 OSStartHighRdy()函數(shù)從處于最高優(yōu)先級任務的TCB獲得該任務的任務堆棧指針,從該堆棧中恢復所有的寄存器內容,并把OSRunning置為TRUE后返回執(zhí)行該任務。系統(tǒng)直接進行任務切換或者應用程序通過處理器軟件陷阱指令執(zhí)行時,系統(tǒng)將通過調用OSC-txSw()函數(shù)完成上下文的切換。 該函數(shù)完成的操作是:將通用寄存器壓人硬件堆棧,從當前任務的TCB獲得該任務的任務堆棧指針,把當前硬件堆棧里的內容全部保存到任務堆棧中,同時保存仿真堆棧指針?C-XBP的值,接著把等待任務中最高優(yōu)先級的任務置為當前任務,最后執(zhí)行OSStartHigh-Rdy()函數(shù)相同的操作。系統(tǒng)每次中斷執(zhí)行中斷服務子程序后,如果沒有更高優(yōu)先級的等待任務就返回,否則執(zhí)行中斷任務切換函數(shù)OSIntCtxSw()。該函數(shù)跟OSCtxSw()函數(shù)相似,只是由于是從中斷服務子程序中進入的,必須在開始調整堆棧指針SP,去掉在調用OSIntExit(),OSIntCtxSw()過程中壓人堆棧的多余內容。 因為µC/OS-Ⅱ的系統(tǒng)調度和系統(tǒng)定時都是由系統(tǒng)節(jié)拍決定的,因此需要提供周期性的系統(tǒng)時鐘信號,µC/OS-Ⅱ建議使用10ms~200ms的系統(tǒng)時鐘。由于系統(tǒng)在每一個節(jié)拍都要檢查是否由高優(yōu)先級的任務在等待,如果有就進行系統(tǒng)的任務切換,這樣當每個時鐘周期越短,系統(tǒng)的任務切換就越頻繁,CPU的負荷就越重,從而引起系統(tǒng)不能正常工作。相反,當時鐘周期越長,任務切換的頻率越低,導致不能充分應用CPU,任務的響應時間變長。所以要根據(jù)系統(tǒng)負荷的大小合理的確定系統(tǒng)時鐘,在這里采用定時器0作為產生20ms的系統(tǒng)定時,系統(tǒng)定時是一個中斷服務子程序。該中斷服務子程序是OSTicklSR()函數(shù),當定時器0發(fā)生中斷時進入中斷服務子程序。 如圖4.2可知,任務堆棧中保存的仿真堆棧與系統(tǒng)硬件堆棧相向生長,中間為空閑間隔,顯然µC/OS-Ⅱ原型提供的堆棧檢測函數(shù)OSTaskStrChk()將失效。 因為所有任務堆棧使用相同大小的空間,所以占用空間最大的任務函數(shù)的空間大小為防真堆棧的空間大小。這里將任務堆棧空間大小用宏定義在OS_CFG.H文件中,可以根據(jù)實際情況作以下修改。 圖4-2 堆棧結構圖 (1)OSCtxSw(),該函數(shù)完成的是任務級切換工作,其目的是為了保證處理器永遠運行就緒表中優(yōu)先級最高的任務。 Void OSCtxSw(void) ﹛ 通過自定義的宏操作PUSHALL,將寄存器R0-R7、DRH、DPL、B、ACC和PSW保存草硬件堆棧中;得到硬件堆棧長度=SP-#OSStkStart; 根據(jù)長度值將內容通過字節(jié)拷貝的方式復制到當前任務堆棧中,同時將仿真指針?C_XBP的值也復制到任務堆棧中; 調用用戶定義函數(shù)OSTaskSwHook(); OSTCBCur=OSTCBHighRy; OSPrioCur=OSPrioHighRy; 通過變量OSTCBCur->OSTCBStkPtr獲得要恢復的任務的任務堆棧指針; 將任務堆棧中內容復制到硬件堆棧中,恢復SP和?C_XBP的值; 執(zhí)行宏操作POPALL恢復處理器寄存器的值; 執(zhí)行中斷返回指令RETI; ﹜ (2)OSStartHighRdy(),該函數(shù)是由操作系統(tǒng)啟動函數(shù)OSStart()調用的,功能是使系統(tǒng)能即使運行優(yōu)先級最高的就緒任務。對C8051F040而言,處理如下: Void OSStarHighRdy(void) ﹛ 調用用戶可自定義的函數(shù)OSTashSWHook(); 獲取任務堆棧指針:任務堆棧指針=OSTCBH個時Rdy->OSTCBSskPtr; 要恢復內容的長度=任務堆棧起駛地址中存放的內容; 根據(jù)長度,通過字節(jié)拷貝將內容復制到系統(tǒng)idata空間中的硬件堆棧內; 恢復硬件堆棧指針SP和?C_XBP的值; OSRunning=TRUE; 對硬件堆棧執(zhí)行自定義的宏操作PUSHALL,恢復寄存器R0-R7、DRH、DPL、B、ACC和PSW 執(zhí)行中斷返回指令RETI; ﹜ (3)OSIntCtxSw(),與OSCtxSw()相比較,OSIntCtxSw()也是執(zhí)行任務切換的,但它是在中斷服務程序中執(zhí)行的。修改如下: Void OSIntCtxSw(void) ﹛ 調整硬件堆棧指針SP的值;SP=SP-4; 將當前硬件堆棧中的所有內容以及變量?C_XBP都復制到當前任務的任務堆棧中; 調用用戶可定義的函數(shù)OSTaskSwHook(); OSTCBCur=OSTCH個時Ry; OSPrioCur=OSPrioHighRy; 通過變量OSTCBCur->OSTCBStkPtr獲得要恢復的任務的任務堆棧

注意事項

本文(畢業(yè)設計(論文)嵌入式操作系統(tǒng)μCOSII在C8051F040單片機中移植研究)為本站會員(1666****666)主動上傳,裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對上載內容本身不做任何修改或編輯。 若此文所含內容侵犯了您的版權或隱私,請立即通知裝配圖網(wǎng)(點擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因為網(wǎng)速或其他原因下載失敗請重新下載,重復下載不扣分。




關于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  sobing.com 裝配圖網(wǎng)版權所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對上載內容本身不做任何修改或編輯。若文檔所含內容侵犯了您的版權或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!