色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 在MC68HC908GP32上移植μC/OS-II

          在MC68HC908GP32上移植μC/OS-II

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

          在前幾講中,介紹了μC/OS-II 的概念、工作機(jī)制,還介紹了μC/OS-II在Intel 80X86CPU上的移植,相信讀者通信學(xué)習(xí),已經(jīng)對移植的過程和步驟有了一定的了解。ΜC/OS-II最初是為摩托羅拉68HC11系列單片機(jī)設(shè)計的。 68HC11系列單片機(jī)有外部總線,可以外接RAM和ROM;而沒有外部總線8位MCU。由于RAM容量的限制,移植就存在一定的困難;但對于有些8位的 MCU,將μC/OS-II移植到MOTOROLA MC68H908GP32(以下簡稱GP32)上。

          本文引用地址:http://cafeforensic.com/article/201609/305220.htm

          一、在GP32上移植μC/OS-11的主要問題

          在第(4)講中,介紹過要移植μC/OS-11,目標(biāo)處理必須滿足以下要求:

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

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

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

          (4)處理器支持足夠的RAM,保存全局變量和作為多任務(wù)環(huán)境下的任務(wù)堆棧。

          (5)處理器有將堆棧指針和其他CPU寄存器讀出和存儲到堆棧或內(nèi)存中的指令。

          編譯后的μC/OS-II的內(nèi)核大約有6~10KB;如果只保留最核心的代碼,則最小可壓縮到2KB。RAM的占用與系統(tǒng)中的任務(wù)數(shù)有關(guān),任務(wù)堆棧要占用大量的RAM空間,堆棧的大小取決于任務(wù)的局部變量、緩沖區(qū)大小及可能的中斷嵌套的層數(shù)。所以,所要移植的系統(tǒng)中必須有足夠的RAM資源。而像MOTOROLA6805系列的8位MCU,由于RAM資源太小且堆棧指針是固定的,不能滿足上面的第(4)條和第(5)條要求,所以μC/OS-II不能在這類處理器上運行。

          GP32是68HC08家庭的成員,具有512字節(jié)的片內(nèi)RAM,32K字節(jié)的片內(nèi)Flash,8MHz總線時鐘。內(nèi)部寄存器包括1個8位累加器A,1個16位索引寄存器X,1個16位堆棧指針寄存器SP,1個16位程序指針寄存器 PC及1個8位標(biāo)志寄存器CCR。與6805系列MCU相比,68HC08系列MCU的堆棧指針為16位,可以自由尋址。這就滿足了移植條件(5),且可以使用C編譯器生成代碼。GP32的用戶手冊可以在摩托羅拉公司的主頁上下載,http://www.motorola.com。

          在GP32上移植μC/OS-II的主要困難還是RAM資源太少。為了移植成功,必須采取措施減少RAM的用量,包括限制系統(tǒng)中的任務(wù)數(shù)量、仔細(xì)修改μC/OS-II內(nèi)核、去掉不使用的部分、限制任務(wù)的斷嵌套層數(shù)、在任務(wù)中盡量減少使用局部變量等等。在采取了上述措施后,可將RAM用量減少到最低。但需要提醒的是,為了節(jié)省堆棧空間而采用的限制中斷嵌套層數(shù)的方法將影響系統(tǒng)的實時性能。所以,在GP32上移植μC/OS-II更多的是一種演示,能更好地說明μC/OS-II內(nèi)核的可裁剪性和靈活性。

          在本講中將介紹一個移植實例。為了減少RAM用量,在本例中只運行了2個用戶任務(wù)。盡量減池一內(nèi)核中不必要的模塊(包括由箱、消息隊列、內(nèi)存管理等),去掉了任務(wù)掛起、喚醒和刪除等擴(kuò)展功能,但仍然支持任務(wù)的創(chuàng)建和管理,也保留了信號量模塊來用來任務(wù)間的通訊。

          二、工具和運行環(huán)境

          要實現(xiàn)μC/OS-II向GP32的移植,需要一個面向MC68HC08的C編譯器。筆者使用的是HIWARE公司的C編譯器。移植過程同樣適用于MC68HC08家庭的其他成員。

          三、移植中所需修改的文件

          首先是編寫整個項目的公共頭文件include.h,這個文件定義使用內(nèi)核中的哪些模塊。Include.h會被所有的C源程序引用。還要修改和CPU相關(guān)的三個文件,分別是頭文件OS_CPU08.H、匯編代碼文件 OS_CPU08.ASM和C代碼文件OS_CPU08.C。

          1.include.h文件

          include.h是主頭文件,在所有后綴名為.C的文件的開始都包含include.h文件。文件中可以內(nèi)核進(jìn)行裁剪。在本例中定義如下:

          #define OS_MAX_EVENTS 2 /*共用了2個信號量*/

          #define OS_MAX_MEM_PART 0 /*不使用內(nèi)存塊功能*/

          #define OS_MAX_QS 0 /*不使用消息隊列功能*/

          #define OS_MAX_TASKS 3 /*共有3個任務(wù)(包括空閑任務(wù))*/

          #define OS_LOWEST_PRIO 20 /*定義最低優(yōu)先級20*/

          #define OS_TASK_IDLE_STK_SIZE 60 /*定義空閑任務(wù)堆棧60字節(jié)*/

          #define OS_TASK_STAT_EN 0 /*不使用統(tǒng)計任務(wù)*/

          #define OS_MBOX_EN 0 /*不使用消息郵箱功能*/

          #define OS_MEM_EN 0 /*不包括內(nèi)存管理部分代碼*/

          #define OS_Q_EN 0 /*不包括消息隊列部分代碼*/

          #define OS_SEM_EN 1 /*定義包括信息量相關(guān)代碼*/

          #define OS_TASK_CHANGE_PRIO_EN 0 /*不包括任務(wù)優(yōu)先級動態(tài)改變代碼*/

          #define OS_TASK_CREATE_EN1 /*包括任務(wù)創(chuàng)建函數(shù)代碼*/

          #define OS_TASK_CREATE_EXT_EN 0 /*不包括帶擴(kuò)展功能的任務(wù)創(chuàng)建函數(shù)*/

          #define OS_TASK_DEL_EN 0 /*不包括刪除任務(wù)函數(shù)代碼*/

          #define OS_TASK_SUSPEND_EN 0 /*不包括任務(wù)掛起和喚醒函數(shù)代碼*/

          #define OS_TICKS_PER_SEC 10 /*定義每秒的時鐘節(jié)拍數(shù)*/

          對于不同類型的處理器,還需要改寫include.h文件,增加自己的頭文件,但必須加在文件末尾。在安裝μC/OS-II的時候,附帶了幾個移植實例,例如,針對Intel 80X86的代碼安裝到IIL目錄下。我們?yōu)镚P32編寫的移植實例可放在IIHC08下,這樣,為GP32改寫的include.h文件中應(yīng)該加入下列語句:

          #include iiHC08_CPU08.ASM

          #include iiHC08_CPU08.C

          #include iiHC08_CPU08.H

          2.OS_CPU08.H文件

          OS_CPU08.H文件中定義了硬件相關(guān)的基本信息:

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

          typedef unsigned char BOOLEAN;

          typedef unsigned char INT8U;

          typedef signed char INT8S;

          typedef unsigned short INT16U;

          typedef signed short INT16S;

          typedef unsigned long INT32U;

          typedef signed long INT32S;

          /*定義堆棧增長方向*/

          #define OS_STK_GROWTH1 /*堆棧由高地址向低地址增長*/

          /*定義堆棧單位*/

          #define OS_STK INT8U

          /*定義進(jìn)入臨界代碼區(qū)開關(guān)中斷宏*/

          #define OS_ENTER_CRITICAL() asm sei

          #define OS_EXIT_CRITICAL() asm cli

          #define OS_TASK_SW() asm swi

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

          由于不同的處理器有不同的字長,μC/OS-II的移植需要重新定義一系列的數(shù)據(jù)結(jié)構(gòu)。具體字長還和使用的C編譯器有關(guān)。在GP32中堆棧是按字節(jié)操作的,堆棧數(shù)據(jù)類型OS_STK聲明為8位。μC/OS-II中所有任務(wù)的堆棧都必須用OS_STK聲明。


          上一頁 1 2 3 下一頁

          關(guān)鍵詞:

          評論


          相關(guān)推薦

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

          關(guān)閉