新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ICCAVR下移植于ATMEGA32的UCOSII

        ICCAVR下移植于ATMEGA32的UCOSII

        作者: 時(shí)間:2013-12-12 來(lái)源:網(wǎng)絡(luò) 收藏

        費(fèi)了九牛二虎之力終于把移植到M32上了,似乎沒(méi)有想怪中那么興奮,只是感覺(jué)輕松了許多,因?yàn)樵敬蛩闶窃谌齻€(gè)星期前搞定的,想想根本原因是沒(méi)有把握好調(diào)試程序時(shí)的一些細(xì)節(jié),為了一些不可能的東西在鉆牛角尖....

        計(jì)算機(jī)網(wǎng)絡(luò)的老師給我們講過(guò)大部人都是"蝸牛"!?,只有少部分人是"老鷹"......"老鷹"可以一下沖上高空,而"蝸牛"只有慢慢地爬,也可以到達(dá)山頂.不過(guò)我覺(jué)得只要蝸牛掌握了正確的方法或許也有機(jī)會(huì)變成---老鷹!(也許其他的蝸牛們也是這么想的~~)

        廢話少說(shuō)了.其實(shí)正確的寫(xiě)法是uC/OS-II,u就是micro的意思,為了方便均用代替,要移植必須要知道編譯器的堆棧情況.的堆棧指針是向下增長(zhǎng)的,堆棧指針指向SRAM的最高地址.其堆棧還分為軟堆棧和硬堆棧.軟堆棧是用于寄存器入棧的,而硬堆棧用于的函數(shù)地址進(jìn)出棧的,函數(shù)調(diào)用或進(jìn)出中斷函數(shù)時(shí)會(huì)用到.軟堆棧實(shí)際是分布在硬堆棧的下面.軟堆棧用Y寄存器作為指針,硬堆棧用SP為作指針.(不知看懂了沒(méi).表達(dá)似乎不太好...)其實(shí)也附帶有移植于M103的UCOSII,不過(guò)M103跟M32是有區(qū)別的.

        知道了軟硬堆棧就好辦了,我的程序是從嵌入式實(shí)時(shí)操作系統(tǒng)uC/OS-II(第二版)>的實(shí)例1直接改過(guò)來(lái)的,其實(shí)例的中8086的SP指針直接用M32的Y寄存器代替,將M32的硬堆棧指針SP保存到軟堆棧中,下面是我的一段堆棧初始化的程序:

        OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
        {
        INT16U tmp;
        INT8U *stk;
        INT8U *hard_stk; //硬件堆棧指針
        INT16U stk_tmp; //硬堆棧變量
        opt = opt; //防止編譯器警告
        pdata="pdata";
        stk_tmp=(INT16U)ptos; //得到硬堆棧的地址
        hard_stk=(INT8U *)ptos;//指向硬堆棧
        stk = (INT8U *)ptos-40;//指向軟堆棧,40為硬堆棧的大小,的help文檔上說(shuō)過(guò),如果函數(shù)不是嵌套很大一般用16就夠了,這里我用help文檔上說(shuō)的最大的.
        //函數(shù)地址入棧
        tmp = *(INT16U const *)task;//得到函數(shù)地址,這里參考了ICCAVR里面自帶的M103的UCOSII源文件.
        *hard_stk-- = (INT8U)(tmp); //函數(shù)地址入棧
        *hard_stk-- = (INT8U)(tmp>> 8);
        stk_tmp=(INT16U)hard_stk; //得到硬堆棧的地址
        //Rx入棧
        *stk-- = 0;
        *stk-- = 1;
        *stk-- = 2;
        *stk-- = 3;
        *stk-- = 4;
        *stk-- = 5;
        *stk-- = 6;
        *stk-- = 7;
        *stk-- = 8;
        *stk-- = 9;
        *stk-- = 10;
        *stk-- = 11;
        *stk-- = 12;
        *stk-- = 13;
        *stk-- = 14;
        *stk-- = 15;
        *stk-- = 16;
        *stk-- = 17;
        *stk-- = 18;
        *stk-- = 19; //為了在OS_CPU_A.S文件上方便一點(diǎn),R20~R23我設(shè)置為編譯器不使用,這樣似乎有點(diǎn)浪費(fèi),讀者完可以自己改過(guò)來(lái).
        *stk-- = 24;
        *stk-- = 25;
        *stk-- = 26;
        *stk-- = 27;
        *stk-- = 30;
        *stk-- = 31;
        /*SREG入棧*/
        *stk-- =0x80; //PUSH SREG
        /*SP入棧*/
        *stk-- = (INT8U)(stk_tmp); //sp
        *stk = (INT8U)((stk_tmp)>> 8); //sp
        return ((OS_STK *)stk);
        }

        在OS_CPU.H修改相應(yīng)的定義:

        typedef unsigned char BOOLEAN;
        typedef unsigned char INT8U; /* Unsigned 8 bit quantity */
        typedef signed char INT8S; /* Signed 8 bit quantity */
        typedef unsigned int INT16U; /* Unsigned 16 bit quantity */
        typedef signed int INT16S; /* Signed 16 bit quantity */
        typedef unsigned long INT32U; /* Unsigned 32 bit quantity */
        typedef signed long INT32S; /* Signed 32 bit quantity */
        typedef float FP32; /* Single precision floating point */
        typedef double FP64; /* Double precision floating point */

        typedef unsigned char OS_STK; /*堆棧入口為8位 Each stack entry is 8-bit wide */

        #define OS_CRITICAL_METHOD 1 #define OS_ENTER_CRITICAL() asm("cli") /*關(guān)中斷*/
        #define OS_EXIT_CRITICAL() asm("sei") /*開(kāi)中斷*/

        #define OS_TASK_SW() OSCtxSw();/*暫時(shí)直接用函數(shù)代替*/



        OS_CPU_A.ASM文件直接改成M32相應(yīng)的匯編,可參考的技術(shù)文檔,當(dāng)然一些偽指令技術(shù)文檔里面是沒(méi)有的,可查找相關(guān)的書(shū)籍.這里也寫(xiě)出來(lái):

        對(duì)寄存器作定義:

        TCNT0 = $32;
        SREG=$3F;
        SPH=$3E;
        SPL=$3D;

        定義宏:

        .macro XXX //XXX宏的名字
        ;寫(xiě)指令
        .endmacro //宏結(jié)束


        M32我用了定時(shí)器0,感覺(jué)這個(gè)8位的定時(shí)器一般會(huì)少用.直接用Tools菜單下的,Application Builder來(lái)生成定時(shí)器的在4M晶振下產(chǎn)生100HZ的初始值,誤差為0.2% .

        以下是我在Project option下的設(shè)置:

        ICCAVR下移植于ATMEGA32的UCOSII

        晶振相關(guān)文章:晶振原理


        關(guān)鍵詞: ICCAVR ATMEGA32 UCOSII

        評(píng)論


        相關(guān)推薦

        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 治多县| 浮山县| 泾川县| 固安县| 淄博市| 凤庆县| 虞城县| 辉南县| 昭通市| 当涂县| 莆田市| 莒南县| 随州市| 武城县| 南阳市| 高青县| 淮安市| 乌兰浩特市| 武义县| 文安县| 抚宁县| 吴川市| 滨海县| 阿克苏市| 昌江| 汝州市| 黔东| 东方市| 武川县| 高雄市| 寿光市| 伊吾县| 将乐县| 沾益县| 侯马市| 杭州市| 漳州市| 舞钢市| 赤水市| 山阳县| 荃湾区|