51系列小型作業系統精髓 簡單實現2

2021-09-08 12:46:12 字數 765 閱讀 1020

在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...