UCOSIII 訊號同步

2021-08-03 04:59:30 字數 2501 閱讀 5480

ucos使用的同步機制有:訊號量semaphores、郵箱mailbox、互斥量mutex、訊息佇列queque、標記flag。相較freertos多了標記flag和郵箱mailbox。

建立呼叫ossemcreate(int16u cnt)函式。對cnt賦予不同的值,所起到的作用不同。使用時,每呼叫ossempend()一次cnt--,呼叫ossempost()一次cnt++。該任務在處理訊號量時,cnt=0,就可以執行。

初始化設定ossemcreate(1),那麼在乙個任務中呼叫ossempend,cnt--,cnt==0,任務執行,其他任務再呼叫ossempend,cnt!=0,只能繼續等待ossempost,cnt++,然後cnt==0。

同理,初始化定義ossemcreate(n)。然後在n個任務分別都執行了ossempost(semp)且還沒有執行ossempost的情況下,cnt==0成立,這個任務才能執行。所以初始化定義ossemcreate(0)就是反過來用了。

對公共資源互斥訪問,最好定義semp=ossemcreate(1),在任務中呼叫ossempend(semp,0,&err)請求此訊號量,然後再呼叫ossempost(semp)釋放該訊號量。

互斥量與臨界區的作用非常相似,但互斥量是可以命名的,也就是說它可以跨越程序使用。所以建立互斥量需要的資源更多,所以如果只為了在程序內部是用的話使 用臨界區會帶來速度上的優勢並能夠減少資源佔用量。因為互斥量是跨程序的互斥量一旦被建立,就可以通過名字開啟它。

createmutex()   建立乙個互斥量

openmutex()     開啟乙個互斥量

releasemutex()  釋放互斥量

waitformultipleobjects() 等待互斥量物件

互斥量(mutex),訊號燈(semaphore),事件(event)都可以被跨越程序使用來進行同步資料操作,而其他的物件與資料同步操作無關,但 對於程序和執行緒來講,如果程序和執行緒在執行狀態則為無訊號狀態,在退出後為有訊號狀態。所以可以使用waitforsingleobject來等待程序和 執行緒退出。

通過互斥量可以指定資源被獨佔的方式使用,但如果有下面一種情況通過互斥量就無法處理,比如現在一位使用者購買了乙份三個併發訪問許可的資料庫系統,可以根 據使用者購買的訪問許可數量來決定有多少個執行緒/程序能同時進行資料庫操作,這時候如果利用互斥量就沒有辦法完成這個要求,訊號燈物件可以說是一種資源計數 器。

事件物件也可以通過通知操作的方式來保持執行緒的同步。並且可以實現不同程序中的執行緒同步操作。

createevent() 建立乙個訊號量

openevent() 開啟乙個事件

setevent() 回置事件

waitforsingleobject()   等待乙個事件

waitformultipleobjects()等待多個事件 

os_flag_grp event_flag;

osflagcreate((os_flag_grp *)&event_flag,

(cpu_char *)"event flag",

(os_flags)0x00,

(os_err *)&err);  

/*建立事件標誌組*/

osflagpend((os_flag_grp*)&event_flag,

(os_flags )flag_bit(0)|flag_bit(1),

(os_tick     )0,

(os_opt     )os_opt_pend_flag_set_all+os_opt_pend_flag_consume,

(cpu_ts*     )0,

(os_err*     )&err);

//osflagpend(wflag,(os_flags)3,os_flag_wait_set_all,0,&err);

osflagpost((os_flag_grp*)&event_flag,

(os_flags   )flag_bit(1),

(os_opt   )os_opt_post_flag_set,

(os_err*     )&err);

//osflagpost(wflag,(os_flags)2,os_flag_set,&err);

資料存放,存放單個資料或者傳遞指向乙個資料的指標來傳遞多個資料。可以是任何型別資料,在傳遞時,先將資料用

(void*)進行型別變化,變為void*這種萬用型別,而在接收郵箱資料時,再還原為本身的資料型別。

單個資料:

傳送端:osmboxpost(mbox,(void*)key_value);

接收端:(int8u)data= (int8u)osmboxpend(mbox,0,&err);

傳遞指標:

傳送端:osmboxpost(mbox,(void*)senddata);

接收端:ptr = (int8u*) osmboxpend(mbox,0,&err);

郵箱中不能傳遞0,因為把乙個0值放入郵箱變成了void *0,會被郵箱解釋為null。執行一次osmboxpend後郵箱清空,pevent -> oseventptr = (void *)0;  

LTE 同步訊號

同步訊號包括 1 主同步訊號 2 輔同步訊號 1 主同步訊號 用於小區組內偵測,符號timing對準,頻率同步 2 輔同步訊號 用於小區組偵測,幀timing對準,cp長度偵測 共有504個唯一的小區標識,物理層小區標誌分成168個唯一的物理層小區標識組,每乙個小組 包含3個唯一標識。這個分組中每乙...

SSI同步序列訊號

網上搜到的資訊說,ssi主要用於主晶元和感測器通訊,而其與uart的區別就是,主晶元會發出同步時鐘,控制從裝置,而uart不需要時鐘同步。下面ssi的定義摘自 synchronous serial inte ce ssi介面 差分rs422模式,最新的差分負相是正相滯後180 由主裝置傳送時鐘訊號,...

LTE學習 同步訊號

sss和pss同步訊號內容固定,重 送,不承載任何上層資訊,是ue在進行小區搜尋的時候第乙個要找的資訊。ue進行忙檢測搜尋同步訊號,目前只支援normal cp的格式。以時隙為基本單位。pss primary synchronization signal 主同步資訊 在頻域上佔系統頻寬中間的6個rb...