互斥訊號量與訊息佇列
//(互斥訊號量)
//(訊息佇列)
互斥訊號量是乙個核心物件(一種資料結構),對於互斥訊號量而言,它的共享資源只能被乙個任務所訪問,
乙個任務想要去訪問共享的資源必須在它被允許執行前去獲得互斥量,並在對資源訪問後釋放互斥量。
訊息佇列是中斷服務程式和/或其他任務所傳送的乙個核心物件,傳送者將其需要傳送的訊息送入訊息佇列之中,而接收者則在訊息佇列中等待訊息的送達,
如果訊息一直沒有送到,那麼接收者將會被一直置於等待與訊息佇列相關的等待列表之中。
我們可以在主函式中建立互斥量和訊息佇列,也可以在開始任務中在任務建立之後建立相應的物件。建立**如下:
/*互斥量建立*/
osmutexcreate
((os_mutex *
)(cpu_char *),
(os_err *
)&err)
;/* 訊息佇列的建立 */
osqcreate
((os_q *
)(cpu_char *),
(os_msg_qty )10,
(os_err *
)&err)
;
對於osmutexcreate(),其第乙個引數是互斥量的位址,即在主函式前宣告的os_mutex物件,
第二個引數是分配給互斥量的名字,可以方便使用者除錯使用,
第三個是存放互斥量建立錯誤標誌的返回值。
osqcreate():第乙個引數是訊息佇列的位址,即os_q物件位址。
第二個引數是分配給訊息佇列的名字,便於除錯。
第三個是訊息佇列允許接收到的訊息量的大小,此值必須大於0。如果傳送方傳送訊息的 速度大於接收
方對訊息的處理速度的話,那麼訊息將會丟失。這種情況可以通過對增大訊息佇列的大小或者增加接收
訊息的任務的優先順序來進行改正。
/* 向訊息佇列傳送訊息並使用共享資源 */
static
void
(void
*p_arg)
}
然後等待互相訊號量,因為互斥訊號量與其他任務共享,如果其他任務不釋放互斥量那麼該任務會永遠的等待互斥鎖
的釋放,第二個引數為(os_tick)0即設定永久等待。
當osmutexpost()返回時,可對共享資源進行操作,此處沒有體現出來。當對資源進行操作結束後需要通過
osmutexpost()釋放互斥鎖,以便其他任務使用資源。
/* 接收訊息佇列訊息並處理訊息 */
static
void
(void
*p_arg)
}
osqpend()函式第乙個引數時訊息佇列物件的位址,
第二個記錄了訊息快取區的大小,
第三個設定為永久等待。
第五個記錄訊息傳送的時間,
第六個時訊息接收錯誤標誌的返回值。
對於接收訊息任務而言,當訊息通過訊息佇列送達時,p_arg會指向傳送過來的訊息,即指向傳送過來的訊息的快取區,而msg_size則指向該緩衝區的大小,此外我們還可以通過ts(無符號32位資料)與os_ts_get()來確定訊息傳送到接收過程所需要的時間,其他ts記錄了訊息傳送的時刻而os_ts_get()則獲取當前的時刻,此時ts_dalta為兩者的差值即接收訊息所需要的時間。注意,由於中斷服務程式與其他高優先順序任務的存在,接收任務並不會裡面接收到訊息。 UCOS學習筆記 訊號量集
實際應用中,任務常常需要與多個事件同步,就需要使用多個訊號量。ucos為實現多個訊號量組合的功能定義了一種特殊的資料結構 訊號量集。一.訊號量集的結構 由兩部分組成,一是訊號量標誌組,存放各個訊號量 二是等待任務鍊錶,存放等待訊號量的的任務。1.訊號量集的標誌組 ucos不是使用事件控制塊的結構描述...
互斥量與訊號量(互斥與同步)
互斥量 mutex 互斥量表現互斥現象的資料結構,也被當作二元訊號燈。乙個互斥基本上是乙個多工敏感的二元訊號,它能用作同步多工的行為,它常用作保護從中斷來的臨界段 並且在共享同步使用的資源。mutex本質上說就是一把鎖,提供對資源的獨佔訪問,所以mutex主要的作用是用於互斥。mutex物件的值,只...
UCOS之訊號量
c os ii 中的訊號量由兩部分組成 乙個是訊號量的計數值,它是乙個 16 位的無符號整數 0 到65,535之間 另乙個是由等待該訊號量的任務組成的等待任務表。使用者要在 os cfg.h中將os sem en開關量常數置成1,這樣 c os ii 才能支援訊號量。當訊號量不為0時,任務即可獲得...