FreeRTOS我也是近期才开始学习在使用任务删除的时候遇见这样的问题:按键按下之后只闪烁绿光。我想这应该是删除了任务一是正确的现象。但是后面复位之后按下按键之后红绿交替闪烁。按说不对阿。那不是没删除吗?代码如下。
void LED_Task1(void *argument)
{
for(;;)
{
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_7,GPIO_PIN_RESET);
vTaskDelay(1000);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_7,GPIO_PIN_SET);
vTaskDelay(1000);
}
/* USER CODE END LED_Task1 */
}
void LED_Task2(void *argument)
{
for(;;)
{
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_8,GPIO_PIN_SET);
vTaskDelay(1000);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_8,GPIO_PIN_RESET);
vTaskDelay(1000);
if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_10)==0)
{
vTaskDelete(LED1Handle);
LED1Handle==NULL;
}
}
}
然后我就注释掉绿灯闪烁的步骤。
然后就进行将任务二只作为删除任务。
void LED_Task1(void *argument)
{
for(;;)
{
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_7,GPIO_PIN_RESET);
vTaskDelay(1000);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_7,GPIO_PIN_SET);
vTaskDelay(1000);
}
void LED_Task2(void *argument)
{
for(;;)
{
// HAL_GPIO_WritePin(GPIOE,GPIO_PIN_8,GPIO_PIN_SET);
// vTaskDelay(1000);
// HAL_GPIO_WritePin(GPIOE,GPIO_PIN_8,GPIO_PIN_RESET);
// vTaskDelay(1000);
if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_10)==0)
{
vTaskDelete(LED1Handle);
LED1Handle==NULL;
}
}
}
然后进行烧录之后发现在红灯闪烁的时候,如果你在亮灯的时候删除任务的话灯会一直亮,但是如果你在灯灭的时候按下的话它会一直处于暗的情况。
我们可以使用示波器直观的感受一下。这个是灯灭的时候(因为这个灯是共阳极接法所以是高电平)
示波器测试闪烁的状态
灯灭的时候是这样的,它们会一直在两种状态之间切换,这是正常闪烁的状态。
但是当我们按下按键之后你不难发现任务删除之后它只处于其中的一种状态要么高要么低。
由此可知,我们删除任务的时候删除的是任务本身,而不是删除的执行的内容,删除了这个任务之后它所处于的特殊状态不会因此而改变。