新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > μC/OS-Ⅱ在ATmega128上的移植Step by Step

        μC/OS-Ⅱ在ATmega128上的移植Step by Step

        作者: 時間:2016-10-08 來源:網絡 收藏

        r16,y+); // 打開中斷

        #endif

        #define OS_STK_GROWTH 1 // 堆棧向下生長

        #define OS_TASK_SW() OSCtxSw()

        2.2.3 OS_CPU_C.C文件

        μC/OS-II的移植需要用戶編寫OS_CPU_C.C中的十個函數:

        OSTaskStkInit();

        OSInitHookBegin ();

        OSInitHookEnd ();

        OSTaskCreateHook();

        OSTaskDelHook();

        OSTaskSwHook();

        OSTaskStatHook();

        OSTimeTickHook();

        OSTCBInitHook ();

        OSTaskIdleHook ();

        實際需要修改的只有OSTaskStkInit()函數,其它九個函數都是由用戶定義的。如果用戶需要使用這九個函數,可將文件OS_CFG.H中的#define constant

        OS_CPU_HOOKS_EN設為1,設為0表示不使用這些函數。本文自定義的任務堆棧結構下圖所示。函數OSTaskStkInit()是由OSTaskCreate()或OSTaskCreateExt()調用,用來初始化任務堆棧的。經初始化后的任務堆棧應該跟發生過一次中斷后任務的堆棧結構一樣。由前敘述可知,ATmega128在發生中斷后,自動保存了程序計數器PC。為了

        保存全部現場,還需要保存狀態寄存器SREG,R0~R31這32個通用寄存器及SP的值。

        需要注意的是:μC/OS-Ⅱ規定,在建立任務時,只能傳遞一個參數給任務,而且這個參數是一個指針;ICCAVR編譯器規定,傳遞給函數的第一個參數是放在R16、R17中的,所以在R16、R17的位置中放置的是向任務傳遞的參數。R28、R29的 值不需要入棧,是因為R28、R29所組成的Y指針被用作軟件堆棧的指針返回給調用函數。

        根據上述自定義任務堆棧的結構,編寫OSTaskStkInit()。其程序清單如2.2.3所示。

        程序清單L 2.2.3 OS_CPU_C.C

        #define OS_CPU_GLOBALS

        #include G:PortingICCAVRporting12_8EX1_mega128includes.h //包含頭文件

        /*

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

        * 九個接口函數(暫未使用)

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

        */

        #if OS_CPU_HOOKS_EN > 0 OS_VERSION > 203

        void OSInitHookBegin (void)

        {

        }

        #endif

        ... ...

        /*

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

        * OSTaskStkInit()

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

        */

        OS_STK *OSTaskStkInit (void (*task)(void *pd), void *p_arg, OS_STK *ptos,

        INT16U opt)

        {

        INT8U *psoft_stk;

        INT8U *phard_stk; //為操作AVR單片機軟、硬件堆棧而建立的臨時指針

        INT16U tmp;

        opt = opt; //'opt'未使用,此處可防止編譯器的警告

        psoft_stk = (INT8U *)ptos; // 載入堆棧指針

        phard_stk = (INT8U *)ptos

        - OS_TASK_SOFT_STK_SIZE // 任務棧棧空間的大小

        L1

        + OS_TASK_HARD_STK_SIZE; // 系統返回的堆棧(硬件堆棧) L2

        tmp = *(INT16U const *)task;

        *phard_stk-- = (INT8U)tmp;

        *phard_stk-- = (INT8U)(tmp >> 8); //把任務入口地址放入硬件堆棧

        //******************通用寄存器入棧**************************/

        *psoft_stk-- = (INT8U)0x00; // R0 = 0x00 L3

        *psoft_stk-- = (INT8U)0x01; // R1 = 0x01

        *psoft_stk-- = (INT8U)0x02; // R2 = 0x02

        *psoft_stk-- = (INT8U)0x03; // R3 = 0x03

        *psoft_stk-- = (INT8U)0x04; // R4 = 0x04

        *psoft_stk-- = (INT8U)0x05; // R5 = 0x05

        *psoft_stk-- = (INT8U)0x06; // R6 = 0x06

        *psoft_stk-- = (INT8U)0x07; // R7 = 0x07

        *psoft_stk-- = (INT8U)0x08; // R8 = 0x08

        *psoft_stk-- = (INT8U)0x09; // R9 = 0x09

        *psoft_stk-- = (INT8U)0x10; // R10 = 0x10

        *psoft_stk-- = (INT8U)0x11; // R11 = 0x11

        *psoft_stk-- = (INT8U)0x12; // R12 = 0x12

        *psoft_stk-- = (INT8U)0x13; // R13 = 0x13

        *phard_stk-- = (INT8U)tmp;

        *phard_stk-- = (INT8U)(tmp >> 8); //把任務入口地址放入硬件堆棧

        //***********R16、R17的位置中放置向任務傳遞的參數*****************/

        tmp = (INT16U)p_arg;

        *psoft_stk-- = (INT8U)tmp;

        *psoft_stk-- = (INT8U)(tmp >> 8);

        *psoft_stk-- = (INT8U)0x18; // R18 = 0x18

        *psoft_stk-- = (INT8U)0x19; // R19 = 0x19

        *psoft_stk-- = (INT8U)0x20; // R20 = 0x20

        *psoft_stk-- = (INT8U)0x21; // R21 = 0x21

        *psoft_stk-- = (INT8U)0x22; // R22 =

        0x22

        *psoft_stk-- = (INT8U)0x23; // R23 = 0x23

        *psoft_stk-- = (INT8U)0x24; // R24 =

        0x24

        *psoft_stk-- = (INT8U)0x25; // R25 = 0x25

        *psoft_stk-- = (INT8U)0x26; // R26 = 0x26

        *psoft_stk-- = (INT8U)0x27; // R27 = 0x27

        /***R28、R29用作軟件堆棧的指針儲存在任務控制塊OS_TCB的OSTCBStkPtr中***/

        *psoft_stk-- = (INT8U)0x30; // R30 = 0x30

        *psoft_stk-- = (INT8U)0x31; // R31 = 0x31L2

        *psoft_stk-- = (INT8U)0x80; // SREG = 0x80,開全局中

        tmp = (INT16U)phard_stk;

        *psoft_stk-- = (INT8U)(tmp >> 8); // SPH

        *psoft_stk = (INT8U) tmp; // SPL

        return ((void *)psoft_stk);

        }

        接下去的工作便是測試移植的代碼,具體的測試工作,請參考邵貝貝譯的《嵌入式實時操作系統μC/OS-II(第2版)》。


        上一頁 1 2 3 下一頁

        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 鄯善县| 泊头市| 汽车| 镇雄县| 萨迦县| 中牟县| 筠连县| 蒙城县| 西宁市| 疏附县| 滕州市| 沈丘县| 宜都市| 阳信县| 双鸭山市| 崇仁县| 沭阳县| 海盐县| 台安县| 灵台县| 洛浦县| 上饶市| 和平区| 遂宁市| 壶关县| 德昌县| 西乌珠穆沁旗| 宜兰县| 天全县| 房山区| 肥西县| 安仁县| 拜泉县| 民县| 芒康县| 康乐县| 清徐县| 东丰县| 江山市| 伊金霍洛旗| 阳原县|