※ ISR只能做 non-blocking
※ OSSemCtreate(cnt)
1. prevent -> OSEventCnt = cnt;
一次最多有cnt個人能進去critical section
2. struct第一個欄位記錄使用函式的種類
3. OS_EventWaitListInit() 把waitingQ全部清空為0
※ OSSemDel()
1. semaphore通常拿來做IPC使用
2. opt = OS_DEL_NO_PEND
有人在semaphore的waitingQ裡面,不能刪除semaphore
3. opt = OS_DEL_ALWAYS
不管有沒有人在waiting裡面,都做刪除
4. 檢查OSEventGrp來判斷裡面有沒有人
5. 將waitingQ中所有的task搬回readyQ,
否則這些task將永遠不會執行。
6. OSEventTaskRdy()每呼叫一次,就會有一個task進入readyQ,
一直呼叫到waitingQ都變0
※ 系統裡面可以有多個semaphore,
每個semaphore都會有自己的waitingQ。
系統裡面有幾各CPU就有幾各readyQm。
※ OSSemPend() lock
1. A想進入critical section,做OSSemPend()lock,
檢查OSEventCnt是否大於0,成立-1,回傳。
2. B已經進入critical section,A想進入critical section,
做OSSemPend()lock,檢查OSEventCnt,沒有大於0,
此時A將自己從readyQ擺到waitingQ,呼叫OS_Sched()。
B離開critical section,做OSSemPost()unlock,
使用EventTaskRdy()叫醒想進入critical section的A,
此時,A與B兩個都是ready的,這時看schedule決定誰執行。
若是A的priority較高,A去看自己的status是ready的,進入critical section。
3. 和2相同,多了timeout的條件。
A可能會被kernel的timer或是B其中一個叫醒。
沒有留言:
張貼留言