<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          移植μC/OS-Ⅱ

          作者: 時間:2016-10-08 來源:網(wǎng)絡(luò) 收藏

          這一章介紹如何將μC/OS-Ⅱ移植到不同的處理器上。所謂移植,就是使一個實(shí)時內(nèi)核能在某個微處理器或微控制器上運(yùn)行。為了方便移植,大部分的μC/OS-Ⅱ代碼是用C語言寫的;但仍需要用C和匯編語言寫一些與處理器相關(guān)的代碼,這是因為μC/OS-Ⅱ在讀寫處理器寄存器時只能通過匯編語言來實(shí)現(xiàn)。由于μC/OS-Ⅱ在設(shè)計時就已經(jīng)充分考慮了可移植性,所以μC/OS-Ⅱ的移植相對來說是比較容易的。如果已經(jīng)有人在您使用的處理器上成功地移植了μC/OS-Ⅱ,您也得到了相關(guān)代碼,就不必看本章了。當(dāng)然,本章介紹的內(nèi)容將有助于用戶了解μC/OS-Ⅱ中與處理器相關(guān)的代碼。

          本文引用地址:http://www.ex-cimer.com/article/201610/305739.htm

          要使μC/OS-Ⅱ正常運(yùn)行,處理器必須滿足以下要求:

          1.處理器的C編譯器能產(chǎn)生可重入代碼。

          2.用C語言就可以打開和關(guān)閉中斷。

          3.處理器支持中斷,并且能產(chǎn)生定時中斷(通常在10至100Hz之間)。

          4.處理器支持能夠容納一定量數(shù)據(jù)(可能是幾千字節(jié))的硬件堆棧。

          5.處理器有將堆棧指針和其它CPU寄存器讀出和存儲到堆?;騼?nèi)存中的指令。

          像Motorola6805系列的處理器不能滿足上面的第4條和第5條要求,所以μC/OS-Ⅱ不能在這類處理器上運(yùn)行。

          圖8.1說明了μC/OS-Ⅱ的結(jié)構(gòu)以及它與硬件的關(guān)系。由于μC/OS-Ⅱ為自由軟件,當(dāng)用戶用到μC/OS-Ⅱ時,有責(zé)任公開應(yīng)用軟件和μC/OS-Ⅱ的配置代碼。這本書和磁盤包含了所有與處理器無關(guān)的代碼和Intel80x86實(shí)模式下的與處理器相關(guān)的代碼(C編譯器大模式下編譯) 。如果用戶打算在其它處理器上使用μC/OS-Ⅱ,最好能找到一個現(xiàn)成的移植實(shí)例,如果沒有只好自己編寫了。用戶可以在正式的μC/OS-Ⅱ網(wǎng)站www. μCOS-Ⅱ.com中查找一些移植實(shí)例。

          圖 8.1μC/OS-II 硬件和軟件體系結(jié)構(gòu)

          如果用戶理解了處理器和C編譯器的技術(shù)細(xì)節(jié),移植μC/OS-Ⅱ的工作實(shí)際上是非常簡單的。前提是您的處理器和編譯器滿足了μC/OS-Ⅱ的要求,并且已經(jīng)有了必要工具。移植工作包括以下幾個內(nèi)容:

          z 用#define設(shè)置一個常量的值(OS_CPU.H)

          z 聲明10個數(shù)據(jù)類型(OS_CPU.H)

          z 用#define聲明三個宏(OS_CPU.H)

          z 用C語言編寫六個簡單的函數(shù)(OS_CPU_C.C)

          z 編寫四個匯編語言函數(shù)(OS_CPU_A.ASM)

          根據(jù)處理器的不同,一個移植實(shí)例可能需要編寫或改寫50至300行的代碼,需要的時間從幾個小時到一星期不等。

          一旦代碼移植結(jié)束,下一步工作就是測試。測試一個象μC/OS-Ⅱ一樣的多任務(wù)實(shí)時內(nèi)核并不復(fù)雜。 甚至可以在沒有應(yīng)用程序的情況下測試。 換句話說, 就是讓內(nèi)核自己測試自己。這樣做有兩個好處:第一,避免使本來就復(fù)雜的事情更加復(fù)雜;第二,如果出現(xiàn)問題,可以知道問題出在內(nèi)核代碼上而不是應(yīng)用程序。 剛開始的時候可以運(yùn)行一些簡單的任務(wù)和時鐘節(jié)拍中斷服務(wù)例程。一旦多任務(wù)調(diào)度成功地運(yùn)行了,再添加應(yīng)用程序的任務(wù)就是非常簡單的工作了。

          8.00 開發(fā)工具

          如前所述,移植μC/OS-Ⅱ需要一個C編譯器,并且是針對用戶用的CPU的。因為μC/OS-Ⅱ是一個可剝奪型內(nèi)核,用戶只有通過C編譯器來產(chǎn)生可重入代碼;C編譯器還要支持匯編語言程序。 絕大部分的C編譯器都是為嵌入式系統(tǒng)設(shè)計的, 它包括匯編器、 連接器和定位器。

          連接器用來將不同的模塊(編譯過和匯編過的文件)連接成目標(biāo)文件。 定位器則允許用戶將代碼和數(shù)據(jù)放置在目標(biāo)處理器的指定內(nèi)存映射空間中。 所用的C編譯器還必須提供一個機(jī)制來從C中打開和關(guān)閉中斷。一些編譯器允許用戶在C源代碼中插入?yún)R編語言。這就使得插入合適的處理器指令來允許和禁止中斷變得非常容易了。 還有一些編譯器實(shí)際上包括了語言擴(kuò)展功能,可以直接從C中允許和禁止中斷。

          8.01 目錄和文件

          本書所付的磁盤中提供了μC/OS-Ⅱ的安裝程序,可在硬盤上安裝μC/OS-Ⅱ和移植實(shí)例代碼(Intel80x86實(shí)模式,大模式編譯)。我設(shè)計了一個連續(xù)的目錄結(jié)構(gòu),使得用戶更容易找到目標(biāo)處理器的文件。如果想增加一個其它處理器的移植實(shí)例,您可以考慮采取同樣的方法(包括目錄的建立和文件的命名等等) 。

          所有的移植實(shí)例都應(yīng)放在用戶硬盤的SOFTWAREμCOS-Ⅱ目錄下。各個微處理器或微控制器的移植源代碼必須在以下兩個或三個文件中找到:OS_CPU.H,OS_CPU_C.C,OS_CPU_A.ASM。匯編語言文件OS_CPU_A.ASM是可選擇的,因為某些C編譯器允許用戶在C語言中插入?yún)R編語言,所以用戶可以將所需的匯編語言代碼直接放到OS_CPU_C.C中。放置移植實(shí)例的目錄決定于用戶所用的處理器, 例如在下面的表中所示的放置不同移植實(shí)例的目錄結(jié)構(gòu)。注意,各個目錄雖然針對完全不同的目標(biāo)處理器,但都包括了相同的文件名。

          8.02INCLUDES.H

          在第一章中曾提到過,INCLUDES.H是一個頭文件,它在所有.C文件的第一行被包含。

          #includeincludes.h

          INCLUDES.H使得用戶項目中的每個.C文件不用分別去考慮它實(shí)際上需要哪些頭文件。使用INCLUDES.H的唯一缺點(diǎn)是它可能會包含一些實(shí)際不相關(guān)的頭文件。這意味著每個文件的編譯時間可能會增加。 但由于它增強(qiáng)了代碼的可移植性, 所以我們還是決定使用這一方法。用戶可以通過編輯INCLUDES.H來增加自己的頭文件,但是用戶的頭文件必須添加在頭文件列表的最后。

          8.03OS_CPU.H

          OS_CPU.H包括了用#defines定義的與處理器相關(guān)的常量,宏和類型定義。OS_CPU.H的

          大體結(jié)構(gòu)如程序清單L8.1所示。

          程序清單 L8.1 OS_CPU.H.

          #ifdefOS_CPU_GLOBALS

          #defineOS_CPU_EXT

          #else

          #defineOS_CPU_EXTextern

          #endif

          /*

          ************************************************************************

          * 數(shù)據(jù)類型

          *(與編譯器相關(guān))


          上一頁 1 2 3 4 5 6 下一頁

          關(guān)鍵詞:

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();