新聞中心

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

        在MC68HC908GP32上移植μC/OS-II

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

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

        本文引用地址:http://www.104case.com/article/201609/305220.htm

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

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

        (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位標志寄存器CCR。與6805系列MCU相比,68HC08系列MCU的堆棧指針為16位,可以自由尋址。這就滿足了移植條件(5),且可以使用C編譯器生成代碼。GP32的用戶手冊可以在摩托羅拉公司的主頁上下載,http://www.motorola.com。

        在GP32上移植μC/OS-II的主要困難還是RAM資源太少。為了移植成功,必須采取措施減少RAM的用量,包括限制系統(tǒng)中的任務(wù)數(shù)量、仔細修改μ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ù)掛起、喚醒和刪除等擴展功能,但仍然支持任務(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)核進行裁剪。在本例中定義如下:

        #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 /*不包括帶擴展功能的任務(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

        /*定義進入臨界代碼區(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)閉
        主站蜘蛛池模板: 新建县| 柯坪县| 军事| 广安市| 安龙县| 安乡县| 怀柔区| 古田县| 绥江县| 昌吉市| 酉阳| 樟树市| 新竹县| 格尔木市| 新巴尔虎右旗| 乌海市| 南木林县| 桑日县| 南丰县| 溆浦县| 左权县| 体育| 宜川县| 松溪县| 漾濞| 贡嘎县| 寿阳县| 竹溪县| 尼勒克县| 新野县| 蓝田县| 和顺县| 太和县| 华容县| 华池县| 镇宁| 石柱| 临潭县| 区。| 昌都县| 武穴市|