2009年6月16日 星期二

chapter 5

※ Time Management
所以的OS都必須面臨怎麼管理時間,
包括micro kernel都要將這部分放在kernel裡面,
否則很難寫。
1. OSTimeDly()
2. OSTimeDlyHMSM() 和OSTimeDly()設計方法幾乎一樣,
多一個時間的轉換,把小時.分...轉成tick
3. OSTimeDlyResume() 有人想睡5個tick的時間,
因為有緊急事件,不能睡那麼久,用OSTimeDlyResume()叫他
4. OSTimeGet() 沒啥意義,字面上
5. OSTimeSet() 同上

※ Delay a task until tx
t=OSTimeGet()
if(tx-t>0)
OSTimeDly(tx-t)
OSTimeDly()睡多久,OSTimeGet()得到現在時間
利用這兩個函式,寫出要睡到下午5點鐘的程式。
----->會發生錯誤,t會有誤差。

※ OSTimeDly()
1. 把task從rdyQ裡移除
2. TCB裡的欄位OSTCBDly代表想要睡多久,要睡幾個tick
3. 最高優先權的task跑去睡覺,所以要呼叫OS_Sched()

※ OSTimeDlyHMSM()
1. 和OSTimeDly差不多
2. 將時分秒轉換成幾個tick(毫秒)
3. 因為integer,所以最大65535,如果大於65535就用loop解決
OSTimeDly(32768)不用65535因為怕溢位.....

※ OSTimeTick() Timer(1)
1. timer為interrupt進來,CPU去做ISR,前半段和後半段用組語寫,
前半段組語,將CPU目前的狀態全部存下來,將來就可以回復。
後半段,把記憶體的值搬到CPU。從哪邊被打斷就從哪邊重新執行。
中間用C語言寫就可以。
2. OSTimeTick()
完全使用C語言撰寫,演算法和資料結構最為重要.....,
3. 從組語裡去呼叫OSTimeTick()
5. OSTCBList將uCOSII裡所有的task串接在一起
4. OSTimeTick()裡的foreach(....)
去OSTCBList裡每個task做檢查看OSTCBDly是否>0,
如果大於0就-1,代表經過1個tick的時間,
如果等於1,將從1變0的時候,代表等的時間已經到了,即讓task變ready
5. task最多:uCOSII2.5.2->64,uCOSII2.8.x->256,linux->以k來計算
6. OSTimeTick()是function call,執行時間會很長,
就會造成I/O的performance會不好,中斷會被disable掉太久的時間。
要自己enable interrupt。
timer這個interrupt的priority非常高,較低優先的的那些task和interrupt會進不來,
為了讓這個情況不發生,所以driver最好不要這樣寫。

※ OSTimeTick() Timer(2)
1. 這種寫法比較好,但程式碼比較複雜,執行時間更長。
2. 中斷進來呼叫ISR,ISR只執行OSMBoxPost,就結束了,因此ISR長度很短。
3. OSMBoxPost送出一個message,只是把某一個或某幾個flag設為1,就執行完了。
4. interrupt進來,CPU收到並呼叫ISR,執行OSMBoxPost,往下執行,ISR結束。
接下來由task當作kernel thread接手,此時中斷被打開,優先權很高。
TickTask()
{
OSMBoxPend()
OSTimeTick()
OS_Sched() //這裡要重新排程 因為是系統裡自己寫的程式
}
OSTimeTick() Timer(1)不用自己call OS_Sched()是因為
ISR結束時會呼叫OSINTExit(),裡面就會call OS_Sched(),所以不用再去call
6. 在linux裡,ISR為top half,kernel thread為bottom half(可延遲的function)
7. 在uCOSII裡,OSTickISR()為top half,OSTimeTick()為bottom half

suspend task

※ OSTaskSuspend()
1. 把某個task從rdyQ移走,將狀態改成OS_STAT_SUSPEND
2. 若是自己把自己停掉,就要call OS_Sched()

※
一個task可能會在 OS_STAT_SUSPEND,OS_STAT_SEM,OS_STAT_FLAG
都代表task在某各waitingQ裡

※ OSTaskResume()
1. ptcb->OSTCBStat &= ~OS_STAT_SUSPEND==OS_STAT_RDY
成立的話,表示這各task可以繼續往下執行,
所有等的事件都已經滿足。
2. ptcb->OSTCBDly==0
可能再等時間的發生(timer interrupt),ptcb->OSTCBDly代表要等的tick數,
不等於0的話代表不能繼續往下執行。
3.
(ptcb->OSTCBDly==0){
OSRdyGrp = ptcb->OSTCBBitY;
OSRdyTbl[ptcb->OSTCBY] = ptcb->OSTCBBitX;
可能會造成OS_TimeDly(2)睡不到1個tick
ex.
第一個動作B睡一個tick
第二個動作A去suspend(B)
第三個動作C去resume(B)
(程式碼有少,跟課本不一樣????)

※ 把TCB抄出來,幫助除錯。
memcpy到一半時,中斷進來,可能會造成資料結構,
有部份是新的,有部份是舊的。
用critical section包住,可以保證資料是完整的。

delete task

※ 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的長度。

2009年3月12日 星期四

作業一

還以為很簡單

結果弄很久

知道哪裡有問題

但不知道問題從何而來

好像三年多白唸了一樣

想了很久還是想不出來 噗

前天上課遲到

果然會使吸收變差XD

2009年3月9日 星期一

第一次

知道老師在問什麼= =

終於不是被三振了

不過上課反而沒有全神貫注一 一

下次小考大概又要被K了

2009年3月4日 星期三

今天 昨天

今天還蠻認真上課的(自以為)

不過還是很多東西不懂

該怎麼說呢

老師說了很多"大致上"

或者"有錯".....

還是沒有辦法很清楚的得到老師想傳達的訊息一 一

...

2009年3月1日 星期日

今日小考

被三振了

是因為我第0章沒去聽的緣故嗎= =

ˋˊ