Sysbios的同步和通信主要包括隊列(Queue)、信號量(Semaphore)、郵箱(Mailbox)、事件(Event)、門(Gates)。
隊列-Queue
要點:
1. 基於雙向鏈表實現,可以在任意位置插入或刪除元素,並且隊列元素沒有最大值。
2. 要在隊列中增加結構體元素,這個元素的第一個字段必須是Queue_Elem類型的。
Queue APIs
信號量-Semaphore
要點
1. 信號量主要用於保護關鍵代碼段,以及任務間的同步。
2. 信號量類型主要包括二進制、計數、帶優先級的二進制、帶優先級的計數信號量。
3. 信號量可以關聯事件。
郵箱-Mailbox
要點
1. 郵箱被用於在同一處理器上將buffer從一個任務傳遞到另一個任務。
2. 創建郵箱時,需要指定郵箱內部buffer的個數和每個buffer的大小。郵箱實例中發送和接收的所有buffer的大小必須和這個大小相同。
3. Mailbox_pend()被用於從郵箱讀取一個buffer。如果郵箱是空的,那么Mailbox_pend()會阻塞。Timeout參數用於等待超時,一直等待使用BIOS_WAIT_FOREVER,不等待使用BIOS_NO_WAIT,時間單位為系統時鍾節拍。
4. Mailbox_post()被用於發送一個buffer到郵箱。如果郵箱是滿的,那么Mailbox_post()阻塞。Timeout參數用於等待超時,一直等待使用BIOS_WAIT_FOREVER,不等待使用BIOS_NO_WAIT。
5. 郵箱也可以關聯事件。
工作原理
事件-Event
要點
1. 事件的使用與二進制信號量類似,如create、post、pend、delete等。
2. 事件可以等待多個事件全部發生(andMask),也可等待多個事件中任意一個事件發生(orMask)。
3. 一個事件實例最多可管理sizeof(UINT)個事件。
4. 一次只能有一個任務掛起在一個事件對象上。
Event相關APIs
門-Gates
要點
1. 門用於防止對臨界區代碼的並發訪問。不同的實現的門嘗試鎖定臨界區的方式不同。
2. 所有的門的實現通過"key"的使用來實現嵌套。只有使用最外面的Gate_enter()返回的key才能恢復搶占。
3. 基於搶占的門的實現:
a.GateHwi以禁用和使能中斷作為鎖定機制。這種門保證以獨占形式訪問CPU。當臨界區被任務、Swi 或Hwi 線程共享時可以使用這種門。
b. GateSwi以禁用和使能軟件中斷作為鎖定機制。當臨界區被Swi 或任務線程共享時可以使用這種門。
c. GateTask以禁用和使能任務作為鎖定機制。當臨界區被任務線程共享時可以使用這種門。它不能用於Hwi或Swi線程。
4. 基於信號量的門的實現
a. GateMutex使用二進制信號量作為鎖定機制。每個GateMutex實例有它自己獨有的的信號量。
b. GateMutexPri是為了阻止優先級反轉而實現“優先級繼承”的互斥門(它僅能一次被一個線程使用)。