※ Event Control Block實現waitingQ
※
Semaphore
Mutual Exclusion
Message Mainbox
Message Queue
以上這幾種機制皆會使用到waitingQ
※ ECB的資料結構和readyQ差不多
※ ECB的演算法和function設計來和readyQ之間做一些互動
※
OSXxxCreate
OSXxxDel
OSXxxPend -> wait lock,等到為止
OSXxxAccept -> 等不到就走(non-blocking)
OSXxxPost -> unlock signal
OSXxxQuery -> 把整個ECB複製一份,memcpy加上critical section。
※
1. Block System call & Nonblocking System call
ex.
kmalloc
vmalloc
2. Asynchronous System call(A I/O)
用thread可達到同樣效果,但context switch的overhead太大
※ ECB
1. 只有task可以做等待的動作,ISR不能。
2. ISR可以把task從waitingQ中拉到readyQ
3. task什麼事都可以做,ISR不能做wait的動作
4. 可以多個task去wait同一個resource
5. 所有的function都沒有處理同步的問題,所以呼叫的人要自己處理
※ ECB資料結構
1. .OSEnentType ECB的種類0.1.2....
2. .OSEventGrp 實現waitingQ,剛開始都填0
3. .OSEventCnt 取決於1
4. .OSEventPtr 取決於1
5. waitingQ,剛開始都填0
※ ECB Functions
1. OS_EventWaitListInit() 給ECB初始值
2. OS_EventTaskRdy() 呼叫signal或post時會使用到,
把task從waitingQ搬到readyQ,一定是搬最高優先權的task
3. OS_EventTaskWait()
把某個task放到waitingQ裡面
4. OS_EventTO() to = timeout
設定最多等多久,時間到了就直接設為ready
沒有留言:
張貼留言