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...