?? update.txt
字號:
uC/OS-II 在 AVR 上的移植
hotislandn@hotmail.com
IDE: PN
Compiler: AVR-GCC ( WinAVR 20050214 )
Target: ATmega16 @ 7.3728MHz
2005-07-28
V1.0
1. 由于ATmega16的RAM資源很少,所以在OS_CFG.H中關閉所有不必要的功能,同時優化代碼,減少RAM占用
在os_core.c中,有兩個數組: INT8U const OSMapTbl[8]與 INT8U const OSUnMapTbl[256],雖然聲明為const類型,但是avr-gcc并不會將其放置在flash中,必須加以修改為INT8U const OSMapTbl[8] PROGMEM 與INT8U const OSUnMapTbl[256] PROGMEM ,同樣的,該文件中訪問這些數組的語句也必須做相應的修改。這樣的結果是速度會受到影響,但是由于仍然是查表操作,任務切換的時間還是確定的。
2. 任務說明
系統中一共有5個用戶任務:Task1-Task5,其優先級依次為1,2,3,5,4。每個用戶任務的堆棧均為OS_USER_TASK_STK_SIZE(定義于os_cfg.h,目前為64字節)。
系統中建立有一個信號量T2sem與一個郵箱Tmbox。
Task1完成了Timer0的初始化,并打開了定時器中斷,使得任務調度可以正常進行。此后,該任務只隔一個很短的時間使得變量t1增加,同時取反PORTB.1。
Task2初始化了Timer2,并使能了Timer2中斷,然后任務掛起,等待信號量T2sem,如果等到且無錯誤,則使得變量t2增加。
Task3使得PD2上出現一個脈沖,以觸發INT0,并使得變量t3增加。
Task4使得PD3上出現一個脈沖,以觸發INT1,并使得變量t4增加。
Task5使得該任務掛起等待郵箱中有一條消息,如果取得消息,就將t5的值更新。
3. 中斷系統
需要引用系統服務的中斷,其底層部分被定義于AVRect.S中,中斷的處理函數被定義于AVRisr.c中,例如例子中外部中斷0與外部中斷1的服務函數。
對于無需引用系統服務的中斷函數,比如例子中的Timer2比較匹配中斷,可以全部定義于AVRisr.c中。
Timer2的中斷只是使得變量t6增加。
INT0的中斷向任務發出信號量。
INT1的中斷發送一個消息到信箱。
由于AVR的RAM有限,移植并未考慮中斷重入的問題。
2005-07-16
V0.9
1. OS版本為2.76
2. 使用Timer0的比較匹配中斷為系統定時,頻率為100Hz
3. 三種臨界代碼保護方式均可以使用,在OS_CPU.h里直接設置即可
如果安裝了WinAVR20050214,則直接運行start.bat,輸入make all即可開始編譯。
如果需要在AVRStudio仿真,運行make extcoff后即可生成調試所需的cof文件。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -