在51微控制器中,不能直接改動pc,但有一種方法是能夠改變pc的。函式呼叫裡會把pc值壓入堆疊中,呼叫結束後,會把pc值彈出到
pc中。
能改變pc就能夠控制程式流程。
1.在任務中切換出去
#define max_tasks 8 //任務槽最大個數.
unsigned char idata task_stack[max_tasks][2];//任務堆疊.
//儲存當前斷點 並把sp=sp-2;
task_stack[task_id][0] =*(sp--);
task_stack[task_id][1] =*(sp--);
2.在定時器中,定時時間到就切換回來。
// 實時切換回
sp=task_stack[task_id]+1;
3.還須要儲存定時時間
unsigned char idata task_time[max_tasks]; //乙個任務乙個定時時間
比方定時器定時時間是10ms ,每10ms查詢一次各個實時任務時間是否到。到了就切換相應的任務執行。否則各任務定時時間減10ms
#define timer_reload() //使能t/c 初始10ms
void timer0init()
void tm0_isr() interrupt 1 using 1
4.還須要什麼呢?
51系列小型作業系統精髓 簡單實現3
現在遇到的問題 1.任務不用預載入,進入乙個任務,載入乙個任務。沒有任務時,定時器怎麼處理?當只有乙個任務時,怎麼處理?多個任務怎麼輪轉或按優先順序切換?2.關於各任務定時時間,乙個乙個地減是否麻煩,有沒有更好的方法?3.沒有保護寄存,這樣切換,是否對?當任務函式有多個層巢狀時,有沒有問題?incl...
51系列小型作業系統精髓 簡單實現4
include define max tasks 2 任務槽個數.必須和實際任務數一至 define max task dep 12 最大棧深.最低不得少於2 個,保守值為12.unsigned char idata task stack max tasks max task dep 任務堆疊.un...
51系列小型作業系統精髓 簡單實現3
如今遇到的問題 1.任務不用預載入,進入乙個任務。載入乙個任務。沒有任務時。定時器怎麼處理?當僅僅有乙個任務時,怎麼處理?多個任務怎麼輪轉或按優先順序切換?2.關於各任務定時時間,乙個乙個地減是否麻煩,有沒有更好的方法?3.沒有保護寄存,這樣切換,是否對?當任務函式有多個層巢狀時。有沒有問題?inc...