Schedular always schedules the highest-priority task to run.
Task-level scheduling : OSSched() => call OS_TASK_SW()
ISR-level scheduleing: OSIntExit() => call OSIntCtxSw()
-不同點在於對PSW或CPU flags的 saving/restoration
OSSchedLock() : 將schedular鎖加1層,lock>0時不會去呼叫schedular。
OSSchedUnlock() : 將schedular鎖解開一層。
Idle Task
系統裡最低優先權的Task,不能被user-tasks delete或suspend。
如果要進入省電狀態,可以在OSTaskIdelHook裡使用HALT-like的指令。
Statistics Task
系統開始時就創造,每秒會執行去計算CPU的使用率。
優先權為OS_LOWPEST_PRIO-1。
OSStatInit() 是初始化這個Task的函式,這函式必須在OS_TaskStat(Statistic本體)執行前被呼叫。
Interrupt under uC/OS-II

(1) 存下所有的CPU register到被中斷的task stack
(2) Call OSIntEnter() 來將OSintNesting counter加1
(3) 如果進到第一層ISR
(4) 將目前的sp位置存進目前執行的Task的OSTCBStkPtr
-為避免context-switch可能會發生
(5) 清除 interrupt source 以保留讓 interrupt 可以再進入的機會
(6) 再開啟 interrupt
(7) user 定義的 interrupt service
(8) Call OSIntExit() 減少 ineterrupt nesting counter,當 counter 為0時表示所有巢狀 interrupt 都做完時,要去看看有沒有 HPT 被 ISR (某一層) 叫醒,如果有的話就要呼叫 context-switch,然後回到 HPT 而不是被中斷的 task。
(9) 如果被中斷的task還是目前最高優先的task,那OSIntExit()會繼續回到ISR,將所有的CPU register回存。
(10) 跳回被中斷的task被中斷的那行,如果schdular被disable那uC/OS-II也會回到被中斷的task。

Starting of uC/OS-II
OSInit() 初始化所有的資料結構然後創造OS_TaskIdle和OS_TaskStat
OSStart() pops 出 HPT ready task 的 CPU registers,然後執行一個return從ISR回來
-不會回到 OSStart
沒有留言:
張貼留言