<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          ICCAVR下移植于ATMEGA32的UCOSII

          作者: 時間:2013-12-12 來源:網(wǎng)絡 收藏

          費了九牛二虎之力終于把移植到M32上了,似乎沒有想怪中那么興奮,只是感覺輕松了許多,因為原本打算是在三個星期前搞定的,想想根本原因是沒有把握好調試程序時的一些細節(jié),為了一些不可能的東西在鉆牛角尖....

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

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

          知道了軟硬堆棧就好辦了,我的程序是從嵌入式實時操作系統(tǒng)uC/OS-II(第二版)>的實例1直接改過來的,其實例的中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文檔上說過,如果函數(shù)不是嵌套很大一般用16就夠了,這里我用help文檔上說的最大的.
          //函數(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文件上方便一點,R20~R23我設置為編譯器不使用,這樣似乎有點浪費,讀者完可以自己改過來.
          *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修改相應的定義:

          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") /*關中斷*/
          #define OS_EXIT_CRITICAL() asm("sei") /*開中斷*/

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



          OS_CPU_A.ASM文件直接改成M32相應的匯編,可參考的技術文檔,當然一些偽指令技術文檔里面是沒有的,可查找相關的書籍.這里也寫出來:

          對寄存器作定義:

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

          定義宏:

          .macro XXX //XXX宏的名字
          ;寫指令
          .endmacro //宏結束


          M32我用了定時器0,感覺這個8位的定時器一般會少用.直接用Tools菜單下的,Application Builder來生成定時器的在4M晶振下產生100HZ的初始值,誤差為0.2% .

          以下是我在Project option下的設置:

          ICCAVR下移植于ATMEGA32的UCOSII

          晶振相關文章:晶振原理


          關鍵詞: ICCAVR ATMEGA32 UCOSII

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();