就只有 8 個 task,每個數字代表一個 priority,每個 priority 只有一個 task。
task 0 是 reserverd system task,作 background task 使用。
這樣 scheduler 就很簡單:
SAVECONTEXT;
currtaski=0;
for(i=7;i>0;i--)
if(readytask[i]==true){
currtaski=i;
break;
}
RESTORECONTEXT;
bool readytask[] 就是標示現在是 ready to run 的 task。
delay 要實做,要配合 timer
int delaytask[i];
timer 的 ISR:
for(i=1;i<8;i++)
if(delaytask[i]>0){
delaytask[i]--;
if(delaytask[i]==0){
readytask[i]=true;
delaytask[i]=-1; // for safe
}
}
...
然後如果有改變,就要 call reschedule()
create task 就超簡單,stack 也是預先宣告好的 array..
createTask(int priority, (void *taskbody)(), int *stack);
task 都create 完,call start_scheduler( ) 就可以了。
download 下來包含 atmel studio 4, 6 的project 檔,可以 build OK (使用 native compileer , not winavr)
沒有留言:
張貼留言