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));
}
}
比如说这样的一个应用,因为我是裸机开发的以前都是这样写,裸机开发的话程序都是一个固定的循序跑下来,所以我不需要考虑SystemMode这个变量的问题,但是RTOS的话因为有优先级的一个调度,所以存在一种情况,比如当前SystemMode = SF_WORK的情况,然后有按键按下,调度器执行完判断if(按键按下)后就开始切换到ErrorCtrl这个任务,这时候ADC也符合<=500的情况,那么SystemMode 会被赋值为SF_ERROR,当执行完这个ErrorCtrl任务后返回ButtonCtrl这个任务会把SystemMode 这个变量赋值为SF_CLOSE,这个不符合我的设计要求了,因为当运行完ErrorCtrl这个任务后如果是裸机开发就已经处于异常模式了不能响应按键,当然这是一种很极端的情况,所以我想知道这个应该要如何处理,是像这样加一个递归锁吗?
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));
}
}
|