?? k51說明.txt
字號:
1. k51簡介
適用于MCS-51的占先式的小 kernel,簡單實用,體積小,RAM需求小。
最多4個任務,各占一個register bank (不需要向堆棧存r0-r7了!)。
main() 是4個任務中的一個。
簡單有效的 signal 和 mutex。
2 k51的使用
2.1 k51編程接口
void k51_init()
所有的等待timer置為0,除main()外的任務設為 not-ready, main()為ready 和 running。
根據PRIO_MAIN設置 register bank。
unsigned char task1_init()
unsigned char task2_init()
unsigned char task3_init()
unsigned char task4_init()
設置任務的堆棧,置任務為ready、not-running。直到下一次中斷或等待,
剛剛完成init的任務才可能running。
void k51_sleep(unsigned char count_ticks)
使任務進入idle,count_ticks個節拍后恢復為ready。
void k51_signal_init(unsigned char idata* p_sig)
對一個信號進行初始化,應當在wait和send的調用前調用這個函數。信號初始化后是not-signaled。
void k51_signal_wait(unsigned char idata* p_sig)
如果信號不是signaled狀態,任務將進入idle,直到isr或另一個任務send這個信號。
如果信號是 signaled狀態,任務將繼續running而信號成為not-signaled。
void k51_signal_send(unsigned char idata* p_sig)
發送信號。如果沒有任務在這個信號上等待,則這個信號被設為signaled狀態;如果有任務在等待,并它的
優先級更高,則進行任務切換;如果等待的任務的優先級更低,則把它置為ready, 但不進行切換。
void k51_mutex_init (unsigned char idata* p_mut);
對一個互斥體進行初始化,應當在wait和send的調用前調用這個函數?;コ怏w初始化后是available。
void k51_mutex_wait (unsigned char idata* p_mut);
如果互斥體不是available狀態,任務將進入idle,直到另一個任務release這個互斥體。
如果互斥體是 available狀態,任務將繼續running而互斥體成為not-available。
void k51_mutex_release(unsigned char idata* p_mut);
釋放互斥體。如果沒有任務在等待這個互斥體,則這個互斥體成為 available 狀態;如果有任務在等待,
則最高優先級的等待任務被設為 ready, 如果它的優先級高于當前運行的任務,則切換任務;如果上述
被設為 ready 的任務優先級更,則不進行切換。
void k51_tick();
在時鐘中斷調用這個函數。如果不使用 sleep 功能,則可以不調用它。每次調用都會使正在 sleep 的
任務的 sleep 時間減少1,直到變成0,這時該任務將會變為 ready。
unsigned char data k51_int_nest 和 void k51_int_exit()
這些參考了uC/OS-II。進入中斷使 k51_int_nest 增1,離開中斷使 k51_int_nest 減1,
并調用k51_int_exit(),可能的任務切換會在這個函數中進行。
2.2 用法說明
在 k51_cfg.inc, 設置 main()所占用的優先級,是否允許task3及task4
(注意如果不允許task3就一定不要允許task4),是否允許mutex。
項目中應當包含k51start.asm, 它是從C51的STARTUP.A51改寫而來的.
需要特別的啟動碼應以 k51start.asm 作為起點。
在k51_a.asm里,根據k51_cfg.inc的配置,含入了適當的源程序文件。所以在build項目的時候,
應當包含k51_a.asm,不是k51a1234.asm,k51a123.asm和k51a12.asm中的任一個。
除了main(),任務對應的函數必須是 void task1(); void task2(); void task3(); void task4();
2.3 應當注意的問題
2.3.1 只允許一個任務在一個 signal 上等待。
如果有兩個以上任務同時在等待一個 signal, 則向這個 signal 進行 send 時,其中的一個任務
成為 ready, 等待列表完全清除,其它任務將永遠沒有機會恢復運行。
2.3.2 盡量用匯編寫 isr
好處多得不得了。尤其是,在 RAM 寶貴的51上面,可以顯著減少堆??臻g需求。
2.3.3 不能用 C51 的 interrupt 關鍵字定義中斷服務函數
它不能提供所需要的堆棧結構??梢栽谶M入中斷用匯編調用c函數,但需要向堆棧保存r0-r7.
所以強烈推薦用匯編寫 isr。
3 大致的統計數據
沒有任務的代碼大小。
---------------------------------------------------
use mutex no mutex RAM req
---------------------------------------------------
4 tasks 1070 886 9Bytes+12bits
3 tasks 765 655 7Bytes+9bits
2 tasks 510 452 5Bytes+6bits
---------------------------------------------------
上述的Bytes在"data": 0-7fh.
每個signal 或 mutex 需 1 字節, "idata", 0-ffh.
4 產生k51的背景
我學習和使用MCS-51有很長時間了,前一段時間學習uC/OS-II,看了高人在8051上的移植,看得頭大無比。
我寫程序有些追求簡單或者說簡潔,看到這些程序感覺非常的不爽。于是自己寫了一個小kernel。我自己
以后應當會經常用它的!
可能早有類似的東西了,我信息不靈,是井底之蛙,大家不要笑我!
戈衛東, 2005-12-2
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -