1、 创建key任务和led任务
void m_create_task_suspended(void)
{
xTaskCreate(key_task, "key_task", configMINIMAL_STACK_SIZE + 200, NULL, 2, &key_task_handle);
xTaskCreate(led_task, "led_task", configMINIMAL_STACK_SIZE + 200, NULL, 2, &led_task_handle);
}
2、 编写key任务入口函数和led任务入口函数
#ifndef TAG_BLE
#define LOG_BLE(...)
#endif
static TaskHandle_t key_task_handle;
static TaskHandle_t led_task_handle;
static void key_task (void * pvParameter)
{
uint8_t button1_sta=0;
eTaskState task_state_temp;
char*p_task_state_string[6]= {"eRunning",
"eReady",
"eBlocked",
"eSuspended",
"eDeleted",
"eInvalid",
};
while (true)
{
if (READ_BUTTON1_P11() == BUTTON_PUSH)
{
if (button1_sta==0)
{
button1_sta = 1;
task_state_temp = eTaskGetState(led_task_handle);
LOG_BLE("current led task sta is %s\n",p_task_state_string[task_state_temp]);
switch(task_state_temp)
{
case eReady:
case eBlocked:
LOG_BLE("Suspended led task\n");
vTaskSuspend(led_task_handle);
break;
case eSuspended:
LOG_BLE("Resume led task\n");
vTaskResume(led_task_handle);
break;
default:
LOG_BLE("Do nothing\n");
break;
}
}
} else
{
button1_sta = 0;
}
vTaskDelay(20);
}
}
static void led_task (void * pvParameter)
{
while(1)
{
TOGGLE_LED13();
TOGGLE_LED14();
TOGGLE_LED15();
TOGGLE_LED16();
LOG_BLE("led task runing\n");
vTaskDelay(1000);
}
}
3、 实验显现
led任务1秒间隔闪烁和打印"led task runing\n"
当key任务以20ms查询按键状态。
当判断到有按键按下时:
①如果led任务阻塞或就绪时,就将led任务挂起。led任务暂定运行。
②如果led任务挂起时,就将led任务恢复。led任务恢复运行。