定制網(wǎng)站制作公司怎么樣營銷軟文范例大全300字
一、分類
FreeRTOS的線程間通信分為這幾大類
由于我還在學習中,目前顯從信號開始記錄學習
二、逐塊講解
1、信號(osSignalWait? osSignalSet)
FreeRTOS從V8.2.0版本開始提供任務通知這個功能,每個任務多有一個32位的通知值,任務通知比二進制信號量方式解除阻塞任務速率提升45%,并且無需創(chuàng)建隊列更加省內(nèi)存。
osSignalSet和osSignalWait是CMSIS中的任務通知,在文檔cmsis_os.c中定義;
這兩個函數(shù)接口為我們正常使用中用到的
int32_t osSignalSet (osThreadId thread_id, int32_t signal)這個就是發(fā)送信號函數(shù)原型
thread_id:是任務句柄,任務通知的目的地任務;
signal:任務通知值,一個事件用一個的值表示,過查看源碼可知0~0x80000000(不包括0x80000000)之間的數(shù)都可以用來當作信號,0x80000000之所以不能作為信號,是因為 0x80000000 被用來代表信號錯誤
返回值:成功就返回上一次發(fā)送的信號,失敗就返回 0x80000000
osEvent osSignalWait (int32_t signals, uint32_t millisec)這個就是接收信號函數(shù)原型
signals:就是發(fā)送函數(shù)裝在的信號值
millisec:超時設(shè)置
0: 不管有沒有成功收到信號都立即返回
osWaitForever:沒有收到信號就一直休眠(阻塞)著,直到收到信號為止,不會往下執(zhí)行。
其它值,比如 100:如果沒有收到信號時休眠阻塞 100ms,然后計時到100ms后,就執(zhí)行判斷有無接到通知,有則執(zhí)行,無則返回超時返回,以此類推,在睡眠100ms,在判斷.........
返回值:返回類型為 osEvent 這個結(jié)構(gòu)體類型
上面的API函數(shù)接口,我們講解完了,下面我們進行實際應用舉例
eg:
void query_task(void const * argument)
{
????static u8 t = 0;
? ? while(1)
? ? {
?????if(t>250)
????????osSignalSet (dgthy_tasktTaskHandle, 0x01);??//發(fā)送通知
?? ? }
}void dgthy_taskt(void const * argument)
{
????static u8 t = 0;
????osEvent ret;?//創(chuàng)建信號???
?? ?while(1)
? ? {?
????? ? ret = osSignalWait(0x01, 1000);
????? ? if(ret.status == osEventSignal)//如果接收到通知
??? ? ??{???????
????????? ? if(ret.value.signals & 0x01)//接收的通知是否為0x01
??????? ? ??{
??????????? ? ??printf("這里可以放上你想執(zhí)行的函數(shù)\n");
??????? ? ??}
??? ? ??}
? ? ? ? else
? ? ? ? {
????????? ? printf("超時\n");
? ? ? ? }
? ? ? ? osDelay(100);//這個睡眠時間看你自己任務需求
? ? }
}
以上就是實際應用的舉例
當然如果你有多個信號并發(fā),但是等待接收函數(shù)只有一個
osSignalSet (query_tasktTaskHandle, F_SentScrin);
osSignalSet (query_tasktTaskHandle, UART1_RX_EVENT);
osSignalSet (query_tasktTaskHandle, UART2_RX_EVENT);
..............................
ret = osSignalWait(F_SentScrin|UART1_RX_EVENT|UART2_RX_EVENT|f_Rest|flag_FONT|flag_whilet|wgFlag|in1_Flag, 1000);
?? ??? ?if(ret.status == osEventSignal)//如果接收到通知
?? ??? ?{? ? ? ?
?? ??? ??? ?if(ret.value.signals & F_SentScrin)//接收的通知為F_SentScrin
?? ??? ??? ?{
?? ??? ??? ??? ?//處理顯示接收數(shù)據(jù)
?? ??? ??? ?}
?? ??? ??? ?if(ret.value.signals & flag_FONT)//接收的通知為flag_FONT
?? ??? ??? ?{
? ? ? ? ? ? ? ?//擦除外部flash
?? ??? ??? ?}?????????????................
????????}
? ?發(fā)送可以多個信號,接收你就可以向上面距離裝載異或上多個值,最終在函數(shù)執(zhí)行判斷就可以。
任務通知的使用限制條件:
1.只能有一個任務接收通知事件。
2.接收通知的任務可以因為等待通知而進入阻塞狀態(tài),但是發(fā)送通知的任務即便不能立即完成通知發(fā)送也不能進入阻塞狀態(tài)。
通知的發(fā)送可以從多個任務或者多個中斷中發(fā)出,但是等待任務通知函數(shù)只能有一個。這個地方可能有的人會理解錯誤,以為只能有一個等待任務通知,其實這里說的是一個任務中只能有一個等待任務通知函數(shù),其他任務中還可以有等待任務通知函數(shù);
到這里,信號功能作用就到此。
詳細可參考這兩篇大佬文章:
CMSIS中的FreeRTOS第一篇——任務通知:osSignalSet和osSignalWait_Amos_Lee1987的博客-CSDN博客
【FreeRTOS】FreeRTOS學習筆記(12)— FreeRTOS的線程間通信(CMSIS_API)_51CTO博客_freertos進程間通信
?