OpenEdv-开源电子网

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

FreeRTOS,删除任务会报错。报错下文。

[复制链接]

28

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2018-1-11
在线时间
64 小时
发表于 2021-8-7 17:24:31 | 显示全部楼层 |阅读模式
20金钱
Error:..\FreeRTOS\portable\MemMang\heap_4.c,320
Error:..\FreeRTOS\portable\MemMang\heap_4.c,321
Error:..\FreeRTOS\portable\MemMang\heap_4.c,320
Error:..\FreeRTOS\portable\MemMang\heap_4.c,321


我是判断到DHCP成功,创建MQTT任务,网线拔出则删除。如下
void lwip_hotplug_detect_task(void *pdata)
{
        eTaskState taskstate;
        while(1)
        {
                /*读取当前LAN8720的状态 和上次的状态比较 发生变化做处理*/
                lwipdev.hotplugstatus_now = LAN8720_Get_hotplugstatus();

                if(lwipdev.hotplugstatus_now != lwipdev.hotplugstatus_last)                                  //检测到连接状态发生变化
                {
                        lwipdev.hotplugstatus_last = lwipdev.hotplugstatus_now;                            //保存状态
                        if(lwipdev.hotplugstatus_now)                                                //如果已连接或自协商已经完成(网线插入)
                        {
                                printf("lwip_hotplug_detect_task 网线接入\r\n");
                                if(lwipdev.stack_isInit)                                                      //如果已经初始化过
                                {
                                        netif_set_link_up(&lwip_netif);                                                                                       //重新连接
                                        lwipdev.dhcpstatus = DHCP_NONE;                                                               //重新启动DHCP
                                        lwip_netif.ip_addr.addr = 0;                                                                                          //清除IP地址
                                        printf("lwip_hotplug_detect_task 创建DHCP任务 1\r\n");
                                        lwip_comm_dhcp_creat();                                                     //创建dhcp任务
                                }
                                else                                                                        //如果没初始化过
                                {
                                        if(lwip_comm_init()==0)                                                   //初始化
                                        {
                                                printf("lwip_hotplug_detect_task lwip_comm_init\r\n");
                                                lwipdev.dhcpstatus = DHCP_NONE;                                                     //重新启动DHCP
                                                lwip_netif.ip_addr.addr = 0;                                                                                //清除IP地址
                                                printf("lwip_hotplug_detect_task 创建DHCP任务 2\r\n");
                                                lwip_comm_dhcp_creat();                                                 //创建dhcp任务
                                        }
                                }
                        }
                        else                                                                          //如果连接断开
                        {
                                printf("lwip_hotplug_detect_task 网线断开\r\n");
                                taskstate = eTaskGetState(DHCPTask_Handler);                                //获取dhcp任务状态
                                if(taskstate != eDeleted)
                                {
                                        printf("lwip_hotplug_detect_task 删除DHCP任务\r\n");
                                        lwip_comm_dhcp_delete();                                                  //删除dhcp任务
                                }
                                printf("lwip_hotplug_detect_task 删除MQTT任务\r\n");
                                MQTT_task_delete();
                                netif_set_link_down(&lwip_netif);                                                                       //断开网络
                        }
                }
               
                /*DHCP ip成功或者使用静态IP 则创建MQTT任务*/
                if(lwipdev.dhcpstatus == DHCP_DONE)/*||(lwipdev.dhcpstatus == DHCP_FAIL)*/
                {
                                lwipdev.dhcpstatus = DHCP_NONE;
                               
                                printf("lwip_hotplug_detect_task 创建MQTT任务\r\n");
                                MQTT_task_creat();
                }

                vTaskDelay(200);
        }

}

开始,我怀疑是MQTT里面内存申请问题,然后修改还是一样,我直接把MQTT改成了一个打印也会出错。修改如下

//任务优先级
#define MQTT_TASK_PRIO                7
//任务堆栈大小       
#define MQTT_STK_SIZE                 1024  
//任务句柄
TaskHandle_t MQTTTask_Handler;

void MQTT_task(void *pvParameters)
{
        while(1){
                printf("MQTT_task run\r\n");
               
                vTaskDelay(200);
        }
}


void MQTT_task_creat(void)
{
        taskENTER_CRITICAL();           //进入临界区

  xTaskCreate((TaskFunction_t )MQTT_task,            
                (const char*    )"MQTT_task",          
                (uint16_t       )MQTT_STK_SIZE,
                (void*          )NULL,                               
                (UBaseType_t    )MQTT_TASK_PRIO,       
                (TaskHandle_t*  )&MQTTTask_Handler);   
                                               
                                                               
  taskEXIT_CRITICAL();            //退出临界区
}

void MQTT_task_delete(void)
{
        if(MQTTTask_Handler != NULL)
        {
                vTaskDelete(MQTTTask_Handler);
                MQTTTask_Handler = NULL;
        }
}
。。。我把创建MQTT和删除MQTT注释掉,插拔网线都是正常的。我人傻了

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2021-8-8 00:32:51 | 显示全部楼层
回复

使用道具 举报

4

主题

456

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1072
金钱
1072
注册时间
2021-4-26
在线时间
352 小时
发表于 2021-8-9 10:27:41 | 显示全部楼层
帮顶  
回复

使用道具 举报

28

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2018-1-11
在线时间
64 小时
 楼主| 发表于 2021-8-10 17:51:30 | 显示全部楼层
taskstate = eTaskGetState(MQTTTask_Handler);                                //获取dhcp任务状态
if(taskstate != eDeleted)
{
        USER_DEBUG(DEBUG_INFO,("lwip_hotplug_detect_task 删除DHCP任务\r\n"));
        MQTT_task_delete();                                                  //删除dhcp任务
}
加了这一句,就没报错了,百思不得琪姐
回复

使用道具 举报

28

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2018-1-11
在线时间
64 小时
 楼主| 发表于 2021-8-10 17:52:13 | 显示全部楼层
大佬来深度解析一下
回复

使用道具 举报

0

主题

465

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1732
金钱
1732
注册时间
2021-4-11
在线时间
320 小时
发表于 2021-8-23 15:03:12 | 显示全部楼层
帮大佬顶一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 18:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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