OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3170|回复: 0

FreeRTOS删除任务导致出错

[复制链接]

1

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2020-5-1
在线时间
17 小时
发表于 2022-12-29 10:34:34 | 显示全部楼层 |阅读模式
10金钱
我在学习FreeRTOS的自己写了一个程序,用来学习任务删除函数;程序里有两个task,一个led_task 用来闪灯,并且打印helloworld,另外一个则是按键检测key_task。当检测到有按键按下的时候,就删除helloWorld打印的任务;具体代码如下(STM32F407,heap_4);
问题在于,如果这两个任务的优先级设定相同时,key_task删除led_task任务后会导致代码卡在heap_4.c 的vPortFree 中的Configassert()中;如果两个任务优先级不同,则不会卡住。求大神指教这是为什么呢?为什么在任务优先级相同的时候会卡住呢?

主程序代码如下:
#define START_TASK_PRIO 1
#define START_STK_SIZE  128
TaskHandle_t StartTask_Handler;
void start_task(void *pvParameters);

#define LED0_TASK_PRIO 2
#define LED0_STK_SIZE 50
TaskHandle_t LED0Task_Handler;
void led0_task(void *p_arg);

#define KEY_TASK_PRIO 2
#define KEY_STK_SIZE 50
TaskHandle_t KEY0Task_Handler;
void key0_task(void *p_arg);

int main(void)
{
    NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );

    uart_init(115200);
   
    LED_Init();                //LED初始化
    KEY_Init();                //按键初始化
   
    xTaskCreate( (TaskFunction_t)  start_task,
                                (const char * )  "start_task",
                                (uint16_t)   START_STK_SIZE,
                                (void*) NULL,
                                ( UBaseType_t )START_TASK_PRIO,
                                (TaskHandle_t*)&StartTask_Handler    );
    vTaskStartScheduler();
}

void start_task(void *pvParameters )
{
    taskENTER_CRITICAL();
   
        xTaskCreate((TaskFunction_t) key0_task,
                (const char * ) "key0_task",
                (uint16_t) KEY_STK_SIZE,
                (void*) NULL,
                (UBaseType_t) KEY_TASK_PRIO ,
                (TaskHandle_t*)&KEY0Task_Handler
    );
   
    xTaskCreate ((TaskFunction_t)  led0_task,
                                (const char * )  "led0_task",
                                (uint16_t)   LED0_STK_SIZE,
                                (void*) NULL,
                                ( UBaseType_t )LED0_TASK_PRIO,
                                (TaskHandle_t*)&LED0Task_Handler    );

    vTaskDelete(StartTask_Handler);
    taskEXIT_CRITICAL();
}

void led0_task(void *p_arg)
{
    while(1)
    {
        LED0 = ~LED0;
        vTaskDelay(1000);
        printf("hello World ");
    }
}

void key0_task(void *p_arg)
{
    u8 keyValue;
    while(1)
    {
        keyValue = KEY_Scan(0);
        if(keyValue == KEY0_PRES)
        {   
                        printf("Delete LE0_TASK!");
            vTaskDelete(LED0Task_Handler);

        }
    vTaskDelay(10);
        LED1 = ~ LED1;
    }
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表