※ delete task
● 從task目前所在的Q,將task拿出,再從link-list中拿走即刪除
● preemption kernel : A刪B不需要呼叫schedule
※ preemption point (在critical section內)
● linux :
1. interrupt可進
2. high priority可搶先low priotity
● uCOSII :
1. interrupt可進
※ 因為delete task很花時間,才加入preemption point
※ ptch->OSTCBDly = 0;
防止要刪除的task被timer放回readyQ
※ ptch->OSTCBStat = OS_STAT_RDY;
防止要刪除的task被其他task放回readyQ
※
OSLockNesting++;
OS_EXIT_CRITICAL();
OS_Dummy();
OS_ENTER_CRITICAL();
OSLockNesting--;
1. OSLockNesting++; OSLockNesting--;
只允許interrup,不允許context switch。
這裡不能改成OSSchedLock()和OSSchedUnlock(),
因為會有巢狀的問題,使得interrupt的狀態會錯誤。
2. OS_EXIT_CRITICAL(); OS_ENTER_CRITICAL();
critical method有三種,如果這裡用其他兩種寫法,
那1.的地方改成OSSchedLock()和OSSchedUnlock()是OK的。
沒有這樣做是因為,uCOSII為了要讓作業系統最能夠跨平台,
還是使用第一種critical method,因為它是最弱的一種CPU。
3. 某些CPU,disable interrupt和enable interrupt中間一定要空格幾行,
如果連在一起寫,後面那行會沒有效果,因此中間要接數個nop,
OS_Dummy()被定義成兩個nop。
※ OSTaskDelReq()
若task握有很多記憶體,直接刪除task,
如果task手中握有大量記憶體或resource,
那些資源就會空在那邊沒人用它。
※
OSTaskDelReq(將刪的TaskID);
將刪的Task中,DelReq欄位改為1(原為0)
OSTaskDel(OS_PRIO_SELF);
1. 以while確保delete成功
2. 以OSTimeDly(1)讓要delete的task能拿到CPU去delete自己。
※ uCOSII的技巧
因為uCOSII希望節省記憶體,
所以不像linux一樣花記憶體去紀錄很多和file相關的狀態。
-------------------------------------------------------------------
※ 改變task的優先權
1. 卡位(確保沒人)
2. 跟priority有關的欄位都要修改
3. 看在哪個queue裡
(4. priority由高變低要呼叫schedule)
※ 預先計算
將會重複多次運算相同東西的(priority)運算式提到外面,
進入critical section就不用在計算,為了簡短critical section的長度。
沒有留言:
張貼留言