void ErrorCtrl_task(void *pvParameters)
{
while(1)
{
if(ADC <= 500)
{
if(SystemMode == SF_WORK)
{
SystemMode = SF_ERROR;
}
}
vTaskDelay( pdMS_TO_TICKS(5));
}
}
void ButtonCtrl_task(void *pvParameters)
{
while(1)
{
switch(SystemMode)
{
case SF_CLOSE:
if(按鍵按下)
{
SystemMode = SF_WORK;
}
break;
case SF_WORK:
if(按鍵按下)
{
SystemMode = SF_CLOSE;
}
break;
case SF_ERROR:
if(按鍵按下)
{
SystemMode = SF_CLOSE;
}
break;
}
vTaskDelay( pdMS_TO_TICKS(5));
}
}
比如說這樣的一個應(yīng)用,因為我是裸機開發(fā)的以前都是這樣寫,裸機開發(fā)的話程序都是一個固定的循序跑下來,所以我不需要考慮SystemMode這個變量的問題,但是RTOS的話因為有優(yōu)先級的一個調(diào)度,所以存在一種情況,比如當前SystemMode = SF_WORK的情況,然后有按鍵按下,調(diào)度器執(zhí)行完判斷if(按鍵按下)后就開始切換到ErrorCtrl這個任務(wù),這時候ADC也符合<=500的情況,那么SystemMode 會被賦值為SF_ERROR,當執(zhí)行完這個ErrorCtrl任務(wù)后返回ButtonCtrl這個任務(wù)會把SystemMode 這個變量賦值為SF_CLOSE,這個不符合我的設(shè)計要求了,因為當運行完ErrorCtrl這個任務(wù)后如果是裸機開發(fā)就已經(jīng)處于異常模式了不能響應(yīng)按鍵,當然這是一種很極端的情況,所以我想知道這個應(yīng)該要如何處理,是像這樣加一個遞歸鎖嗎?
void ErrorCtrl_task(void *pvParameters)
{
while(1)
{
if(ADC <= 500)
{
xSemaphoreTakeRecursive(TaskSemaphoreHandle,portMAX_DELAY);
if(SystemMode == SF_WORK)
{
SystemMode = SF_ERROR;
}
xSemaphoreGiveRecursive(TaskSemaphoreHandle);
}
vTaskDelay( pdMS_TO_TICKS(5));
}
}
void ButtonCtrl_task(void *pvParameters)
{
while(1)
{
xSemaphoreTakeRecursive(TaskSemaphoreHandle,portMAX_DELAY);
switch(SystemMode)
{
case SF_CLOSE:
if(按鍵按下)
{
SystemMode = SF_WORK;
}
break;
case SF_WORK:
if(按鍵按下)
{
SystemMode = SF_CLOSE;
}
break;
case SF_ERROR:
if(按鍵按下)
{
SystemMode = SF_CLOSE;
}
break;
}
xSemaphoreGiveRecursive(TaskSemaphoreHandle);
vTaskDelay( pdMS_TO_TICKS(5));
}
}
|