Sysbios——同步和通信


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是為了阻止優先級反轉而實現“優先級繼承”的互斥門(它僅能一次被一個線程使用)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM