|
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));
}
}
比如說(shuō)這樣的一個(gè)應(yīng)用,因?yàn)槲沂锹銠C(jī)開(kāi)發(fā)的以前都是這樣寫(xiě),裸機(jī)開(kāi)發(fā)的話(huà)程序都是一個(gè)固定的循序跑下來(lái),所以我不需要考慮SystemMode這個(gè)變量的問(wèn)題,但是RTOS的話(huà)因?yàn)橛袃?yōu)先級(jí)的一個(gè)調(diào)度,所以存在一種情況,比如當(dāng)前SystemMode = SF_WORK的情況,然后有按鍵按下,調(diào)度器執(zhí)行完判斷if(按鍵按下)后就開(kāi)始切換到ErrorCtrl這個(gè)任務(wù),這時(shí)候ADC也符合<=500的情況,那么SystemMode 會(huì)被賦值為SF_ERROR,當(dāng)執(zhí)行完這個(gè)ErrorCtrl任務(wù)后返回ButtonCtrl這個(gè)任務(wù)會(huì)把SystemMode 這個(gè)變量賦值為SF_CLOSE,這個(gè)不符合我的設(shè)計(jì)要求了,因?yàn)楫?dāng)運(yùn)行完ErrorCtrl這個(gè)任務(wù)后如果是裸機(jī)開(kāi)發(fā)就已經(jīng)處于異常模式了不能響應(yīng)按鍵,當(dāng)然這是一種很極端的情況,所以我想知道這個(gè)應(yīng)該要如何處理,是像這樣加一個(gè)遞歸鎖嗎?
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));
}
}
|
|