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

          新聞中心

          EEPW首頁 > 嵌入式系統 > 設計應用 > μCOS-II在ATmega128單片機上的移植與開發(fā)

          μCOS-II在ATmega128單片機上的移植與開發(fā)

          作者: 時間:2013-04-13 來源:網絡 收藏

            的定時器中斷

            

          有三個定時器:T0,T1,T2,可以為提供精確的時鐘源。的三個定時器都有計數溢出中斷功能,而且T1和T2還有匹配比較中斷,即定時器計數到設定的值時,產生中斷并自動清零。若系統采用這種中斷方式,其好處是在中斷服務程序ISR中不需要重新裝載定時器的值。

            將移植到ATmega128

            移植就是使一個實時內核能在ATmega128上運行。大部分的代碼是用ANSIC編寫的,因此移植性很好。但是對不同的微處理器,仍然需要使用C和匯編語言來編寫其中與處理器相關的代碼,寄存器的讀、寫只能通過匯編語言的存儲和加載指令來實現。要使μCOS-II能夠正常工作,處理器必須滿足以下要求:

           ?、偬幚砥鞯腃編譯器能產生可重入代碼;可重入代碼是指可以被一個以上的任務調用,而不必擔心其數據會被破壞的代碼。可重入代碼任何時候都可以被中斷,一段時間以后又可以重新運行,而相應的數據不會丟失,不可重入代碼則不行。本文所使用ImageCrafT公司的ICCAVRV6. 30編譯器能產生可重入代碼;

            ②用C語言可以打開和關閉中斷,本文所使用的ICCAVRV6. 30編譯器支持在C語言中內嵌匯編語句且提供專門開關中斷的宏:CLI() 和SEI() 。這樣,使得在C語言中開關中斷非常方便;

           ?、厶幚砥髦С种袛啵⑶夷軌虍a生定時中斷(通常在10-100Hz 之間) ,ATmega128,有3 個定時器,能產生μC/OS-Ⅱ所需的定時中斷;

            ④ 處理器能夠支持容納一定數量的硬件堆棧,ATmega128有4KRAM,硬件堆??梢蚤_辟在這4KRAM中;

           ?、萏幚砥饔袑⒍褩V羔樅推渌拇嫫髯x取和存儲到堆棧或內存的指令,一般的單片機都滿足這個要求(如PUSH、POP指令) ,且ATmega128還具有直接訪問I/O寄存器的指令( IN、OUT等) 。

            移植的實現μC/OS-Ⅱ的移植工作包括以下幾個內容:

            (1) 用Typedef聲明與編譯器相關的數據類型(在OS-CPU. H文件中) ,由于不同的微處理器有不同的字長,在μC/OS-Ⅱ代碼中不能使用C語言的shORT、inT、lOng 等數據類型,而采用INT8U、INT16U、INT32U等直觀又可移植的數據類型來代換相應數據類型。

            (2) 用# definE設置一個常量OS-STK-GROWTH的值(OS-CPU. H) ,決定堆棧的生長方向,置0表示堆棧從下往上生長,置1表示堆棧從上往下生長。

            (3) # definE聲明三個宏(OS-CPU. H) 。即進入臨界代碼段(criTicaLcOdEsecTiOn) 的方法OS-CRITICAL-METHOD定義為3 ,在宏OS-ENTER-CRITICAL() 中得到當前處理器狀態(tài)字的值,并將其保存在C函數的局部變量中,這個變量在宏OS-EXIT-CRITICAL( ) 中用于恢復PSW。宏OS-TASK-SW() 是在內核從低優(yōu)先級任務切換到高優(yōu)先級任務時用到的,它總是在任務級代碼中被調用。在ATMEGA128上移植,直接調用OSCTxSw () 任務切換函數就可以了。

            (4) 用C語言編寫十個簡單的函數(OS-CPU-C. C) ,OS2TAskSTKIniT() ;OSIniTHoOkBegiN() ;OSIniTHoOKEnd () ; OSTAskCreaTeHoOK( ) ;OSTAskDelHoOK( ) ;OSTAskSw HoOK();OSTAskSTaTHoOK() ;OSTimETickHoOk () ;OSTCB IniTHoOK() ;OSTAsKIdleHoOK() ;實際需要修改的只有OSTAskSTKIniT() 函數,其它九個函數都是由用戶定義的。如果用戶需要使用這九個函數,可將文件OS-CFG. H中的# definEcOnsTAnTOS-CPU-HOOKS-EN設為1,設為0表示不使用這些函數。函數OSTAskSTKIniT( ) 是由OSTAskCreaTE() 或OSTAskCreaTEExT() 調用,用來初始化任務堆棧的。經初始化后的任務堆棧應該跟發(fā)生過一次中斷后任務的堆棧結構一樣。由前敘述可知,ATmega128在發(fā)生中斷后,自動保存了程序計數器PC。為了保存全部現場,還需要保存狀態(tài)寄存器SREG ,R0~R31這32個通用寄存器及SP的值。

            (5) 編寫四個匯編語言函數(OS-CPU-A. S) ,OSSTARTHighRdy () 使就緒態(tài)任務中優(yōu)先級最高的任務開始運行;OSCTxSw () 完成將處理器的寄存器保存到堆棧中的任務后,將任務指針指向要恢復運行的任務

          ,復制新任務的優(yōu)先級,得到新任務的堆棧指針,恢復將運行任務的寄存器;OSIntC2TxSw () 完成在ISR中執(zhí)行任務的切換;OSTicKISR() 提供系統時鐘節(jié)拍服務;這些函數涉及到出棧和入棧操作,因此需要用匯編語言編寫。做完以上工作,就是測試內核的移植是否正確。測試一個實時內核,可以運行一些簡單的任務和時鐘節(jié)拍中斷任務,一旦調試成功就可以在上面擴展功能。

            硬件驅動程序的編寫

            μCOS-II移植完成以后,就要在實時內核之上編寫外設驅動程序。外設驅動程序可以提供訪問外圍設備的接口,把操作系統和外圍設備硬件分離開來,當外設改變時,只需修改設備驅動程序,不影響操作系統內核。外設驅動程序主要完成以下功能:

            (1) 對設備初始化和釋放;

            (2) 把數據從內核傳送到硬件和從硬件讀取數據;

            (3) 讀取應用程序傳送給設備文件的數據和回送應用程序請求的數據;

            (4) 檢測和處理設備出現的錯誤。對于擴展相應的API函數,不同的應用有不同的要求,可以根據硬件結構和實際應用,編寫操作系統的API函數。

            基于μCOS-II進行擴展的RTOS的總體結構。在內核上開發(fā)應用,在把內核移植到自己的硬件目標板上后,在實時內核的基礎上寫出相應的驅動程序、內存操作等API函數,建立實時操作系統,最后利用這些API函數編寫用戶自己的應用程序,就構成了嵌入式系統軟件。而應用程序處于整個系統的頂層,根據具體應用要求,其功能有多個任務完成,每個任務可以調用API函數,也可以調用與處理器無關的代碼提供的系統服務。

            總 結

            采用μCOS-II內核開發(fā)的RTOS具有良好的實時性,可裁剪性,應用它可以使產品更可靠,功能更強大,開發(fā)周期更短。該系統目前已在我院開發(fā)的護理用體態(tài)語言機上成功應用。


          上一頁 1 2 下一頁

          評論


          相關推薦

          技術專區(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); })();