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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > μC/OS-Ⅱ在ATmega128上的移植Step by Step

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

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

          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中的十個(gè)函數(shù):

          OSTaskStkInit();

          OSInitHookBegin ();

          OSInitHookEnd ();

          OSTaskCreateHook();

          OSTaskDelHook();

          OSTaskSwHook();

          OSTaskStatHook();

          OSTimeTickHook();

          OSTCBInitHook ();

          OSTaskIdleHook ();

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

          OS_CPU_HOOKS_EN設(shè)為1,設(shè)為0表示不使用這些函數(shù)。本文自定義的任務(wù)堆棧結(jié)構(gòu)下圖所示。函數(shù)OSTaskStkInit()是由OSTaskCreate()或OSTaskCreateExt()調(diào)用,用來初始化任務(wù)堆棧的。經(jīng)初始化后的任務(wù)堆棧應(yīng)該跟發(fā)生過一次中斷后任務(wù)的堆棧結(jié)構(gòu)一樣。由前敘述可知,ATmega128在發(fā)生中斷后,自動(dòng)保存了程序計(jì)數(shù)器PC。為了

          保存全部現(xiàn)場(chǎng),還需要保存狀態(tài)寄存器SREG,R0~R31這32個(gè)通用寄存器及SP的值。

          需要注意的是:μC/OS-Ⅱ規(guī)定,在建立任務(wù)時(shí),只能傳遞一個(gè)參數(shù)給任務(wù),而且這個(gè)參數(shù)是一個(gè)指針;ICCAVR編譯器規(guī)定,傳遞給函數(shù)的第一個(gè)參數(shù)是放在R16、R17中的,所以在R16、R17的位置中放置的是向任務(wù)傳遞的參數(shù)。R28、R29的 值不需要入棧,是因?yàn)镽28、R29所組成的Y指針被用作軟件堆棧的指針返回給調(diào)用函數(shù)。

          根據(jù)上述自定義任務(wù)堆棧的結(jié)構(gòu),編寫OSTaskStkInit()。其程序清單如2.2.3所示。

          程序清單L 2.2.3 OS_CPU_C.C

          #define OS_CPU_GLOBALS

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

          /*

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

          * 九個(gè)接口函數(shù)(暫未使用)

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

          */

          #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單片機(jī)軟、硬件堆棧而建立的臨時(shí)指針

          INT16U tmp;

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

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

          phard_stk = (INT8U *)ptos

          - OS_TASK_SOFT_STK_SIZE // 任務(wù)棧??臻g的大小

          L1

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

          tmp = *(INT16U const *)task;

          *phard_stk-- = (INT8U)tmp;

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

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

          *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); //把任務(wù)入口地址放入硬件堆棧

          //***********R16、R17的位置中放置向任務(wù)傳遞的參數(shù)*****************/

          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用作軟件堆棧的指針儲(chǔ)存在任務(wù)控制塊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è)試移植的代碼,具體的測(cè)試工作,請(qǐng)參考邵貝貝譯的《嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II(第2版)》。


          上一頁 1 2 3 下一頁

          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉