在上一期內(nèi)容中我們簡單的介紹了任務(wù)通知的幾個函數(shù)以及簡單的使用了任務(wù)通知來實現(xiàn)兩個信號之間的通信。
本期我們將利用任務(wù)通知來模擬三種方式的任務(wù)間通信。
信號量
在我們介紹信號量的文章中介紹過,信號分為二進制信號量和計數(shù)信號量。
接著我們使用任務(wù)通知來模擬這兩項功能。
二進制信號量可以看作長度為1的隊列,我們不關(guān)心其值為多少,只關(guān)心它的狀態(tài)。
在直達(dá)任務(wù)通知中我們可以用xTaskNotifyGive來模擬二進制信號量的釋放以及ulTaskNotifyTake()來模擬二進制信號量的讀取。
在ulTaskNotifyTake()中需要注意的是,我們需要設(shè)置一個參數(shù)用來確定我們模擬的是二進制信號量還是計數(shù)信號量。
代碼測試
void Mid_Task(void * pvParameters)//參數(shù)為 void * pvParameters
{
while(1)
{
if(KEY_Scan(0)==1)
{
printf("Key_Pressrn");
xTaskNotifyGive(High_Handler);//傳入任務(wù)函數(shù)句柄,模擬信號量釋放
}
}
vTaskDelay(10);
}
void High_Task(void * pvParameters)
{
BaseType_t err;
while(1)
{
err = ulTaskNotifyTake(pdFALSE,10);//讀取后清零,模擬二進制信號量
if(err == pdTRUE)
{
printf("Recieve Message!rn");
}
vTaskDelay(10);
}
}
模擬二進制信號量成功。
之后,我們將接收的函數(shù)中的pdFALSE修改為pdTRUE,這樣子我們就可以模擬我們的計數(shù)信號量了。
這里就不作演示了,但是要注意的是,只用這樣子的模擬二進制信號量也要注意優(yōu)先級反轉(zhuǎn)問題,關(guān)于優(yōu)先級反轉(zhuǎn)的問題可以參考公眾號中的關(guān)于二進制信號量的文章。
事件組
合理的運用RTOS中的事件組可以很好的處理許多事件,在事件組的介紹中我們說過,我們常用的事件組可以做到24位事件位。而在直達(dá)任務(wù)通知中,我們也同樣可以指定某些位的改變來實現(xiàn)事件組的效果。
我們可以修改xTaskNotify中的eAction來將通知值作為事件組,修改特定位來實現(xiàn)事件位的效果。
代碼測試
void Mid_Task(void * pvParameters)//參數(shù)為 void * pvParameters
{
int i = 0;
while(1)
{
if(KEY_Scan(0)==1)
{
printf("Key_Press keynumber : 1rn");
xTaskNotify( (TaskHandle_t) High_Handler,//目標(biāo)任務(wù)句柄
(uint32_t) 0x04,//第二位 00000100
(eNotifyAction) eSetBits);//位設(shè)置模式,模擬事件組
}
if(KEY_Scan(0)==2)
{
printf("Key_Press keynumber : 2rn");
xTaskNotify( (TaskHandle_t) High_Handler,//目標(biāo)任務(wù)句柄
(uint32_t) 0x08,//第三位 00001000
(eNotifyAction) eSetBits);//位設(shè)置模式,模擬事件組
}
}
vTaskDelay(10);
}
void High_Task(void * pvParameters)
{
BaseType_t err;
uint32_t number;//存放通知值
uint32_t Value; //模擬事件組
while(1)
{
err = xTaskNotifyWait( (uint32_t) 0x0000,//不清理
(uint32_t) 0xffff,//清理當(dāng)前
(uint32_t*) &number,//接收任務(wù)值
(TickType_t) 10 );//等待事件
Value = Value | number ; //獲得事件位
if((Value&(0x08+0x04)) == (0x08+0x04))
{
printf("KEY1 and KEY2 have Pressedrn");
Value = 0;//事件組清零
}
vTaskDelay(10);
}
}
-
二進制
+關(guān)注
關(guān)注
2文章
772瀏覽量
41534 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4256瀏覽量
62223 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
483瀏覽量
61849 -
信號量
+關(guān)注
關(guān)注
0文章
53瀏覽量
8296
發(fā)布評論請先 登錄
相關(guān)推薦
評論