OpenEdv-开源电子网

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

删除一个任务,导致另一个任务也死掉

[复制链接]

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
发表于 2022-8-25 15:47:28 | 显示全部楼层 |阅读模式
10金钱
最近的项目测试,出现了一个奇怪的现象。所用芯片为GD32F4系列的。
问题现象:
当我vTaskDelete((任务A句柄));删除任务时,发现另外一个任务(任务B)被影响挂掉了,因为我在任务B里加了打印。没删除之前,任务B里的打印是一直打印的,当我执行删除任务后,打印突然就停下来了,感觉就是任务B死掉了。有哪位兄弟遇到过这种情况,又是如何解决的。

void taskA(void *parameter)
{
    while(1)
    {
        ......(省略代码)
        notify_result = xTaskNotifyGive(任务B句柄);
        if(notify_result != pdPASS)
        {
            printf("Notify fail\r\n");
        }
        vTaskDelay(1);
    }
}

void taskB(void *parameter)
{
    while(1)
    {
        printf("test.\n");
//       while(0 == ulTaskNotifyTake(pdTRUE, portMAX_DELAY));
        ......(省略代码)
        vTaskDelay(1);
    }
}


最佳答案

查看完整内容[请看2#楼]

是其它因素导致的。我删掉一些打印,情况好转很多
天道酬勤
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
 楼主| 发表于 2022-8-25 15:47:29 | 显示全部楼层
xiaoxiaoren 发表于 2022-9-6 15:52
手上刚好有GD32F4的硬件,根据楼主的说明,写了个简单的测试,代码如下,倒不会出现卡死现象

void tas ...

是其它因素导致的。我删掉一些打印,情况好转很多
天道酬勤
回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2022-8-25 16:28:50 | 显示全部楼层
机器正在搬运工具,正举到半空中,突然机器停电。
回复

使用道具 举报

2

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
372
金钱
372
注册时间
2018-9-14
在线时间
51 小时
发表于 2022-8-29 09:56:43 | 显示全部楼层
taskB中 while(0 == ulTaskNotifyTake(pdTRUE, portMAX_DELAY)); 屏蔽着,delete taskA 也会干扰到taskB?
回复

使用道具 举报

28

主题

113

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1472
金钱
1472
注册时间
2021-8-10
在线时间
271 小时
发表于 2022-8-29 10:59:18 | 显示全部楼层
要不仔细筛查一下,看看b任务是不是有子任务耦合着a任务。
回复

使用道具 举报

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
 楼主| 发表于 2022-8-31 14:35:41 | 显示全部楼层
xiaoxiaoren 发表于 2022-8-29 09:56
taskB中 while(0 == ulTaskNotifyTake(pdTRUE, portMAX_DELAY)); 屏蔽着,delete taskA 也会干扰到taskB?

是的,也会干扰到
天道酬勤
回复

使用道具 举报

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
 楼主| 发表于 2022-8-31 14:37:10 | 显示全部楼层
橘子汁真好喝 发表于 2022-8-29 10:59
要不仔细筛查一下,看看b任务是不是有子任务耦合着a任务。

没有的
天道酬勤
回复

使用道具 举报

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
 楼主| 发表于 2022-8-31 14:47:32 | 显示全部楼层
再具体点的说,我这个taskA就是一个TCP server任务,TCP接收到一组数据,就把它复制到一个buf数组里,接着通知taskB解析buf数组任务去解析这个数组。taskB解析buf数组任务解析出来一个完整的指令后,再用xTaskNotifyGive通知去通知另外一个taskC任务(进一步去判断处理那条解析出来的完整指令)
天道酬勤
回复

使用道具 举报

2

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
372
金钱
372
注册时间
2018-9-14
在线时间
51 小时
发表于 2022-9-5 14:32:00 | 显示全部楼层

有些疑问,1、删除taskA操作在哪里执行? 2、出现这种现象时 taskB中  while(0 == ulTaskNotifyTake(pdTRUE, portMAX_DELAY)); 是屏蔽的?  3、taskB 不打印的时候,其他任务是否还正常执行?还是说进了硬件错误?
回复

使用道具 举报

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
 楼主| 发表于 2022-9-6 09:41:18 | 显示全部楼层
xiaoxiaoren 发表于 2022-9-5 14:32
有些疑问,1、删除taskA操作在哪里执行? 2、出现这种现象时 taskB中  while(0 == ulTaskNotifyTake(pdTR ...

1、删除taskA在taskC中操作
2、为了验证taskB是否正常运行,所以加个打印,并把阻塞等待通知屏蔽掉
3、taskB不打印时,其它任务时正常运行的,我在其他的某个任务里加了看门狗。如果是硬件错误,看门狗时间到会复位软件
天道酬勤
回复

使用道具 举报

2

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
372
金钱
372
注册时间
2018-9-14
在线时间
51 小时
发表于 2022-9-6 15:52:53 | 显示全部楼层
紫气东升 发表于 2022-9-6 09:41
1、删除taskA在taskC中操作
2、为了验证taskB是否正常运行,所以加个打印,并把阻塞等待通知屏蔽掉
3、 ...

手上刚好有GD32F4的硬件,根据楼主的说明,写了个简单的测试,代码如下,倒不会出现卡死现象

void task1_task(void *pvParameters)
{
    int count=0;
    while(1)
    {      
        count++;
        printf(" task1 is run %d \r\n\r\n",count);
        
        notify_result=xTaskNotifyGive(TASK2Task_Handler);
            
        if(notify_result!=pdPASS)
        printf("notify fail\r\n");
        vTaskDelay(10);
    }
}

void  task2_task(void *pvParameters)
{
    uint8_t  count=0;
    while(1)
    {
        count++;
//        while(0==ulTaskNotifyTake(pdTRUE,portMAX_DELAY));

        printf(" task2 run  time = %d!\r\n\r\n",count);
        
        xTaskNotifyGive(TASK3Task_Handler);
        
        vTaskDelay(10);
    }
}


void  task3_task(void *pvParameters)
{
    uint8_t  count=0;
    while(1)
    {
        count++;
        if(count==3)
        {
            printf("delete task1...\r\n\r\n");
            vTaskDelete(TASK1Task_Handler);           
        }         
        
        printf(" task3  run  number = %d!\r\n\r\n",count);

        vTaskDelay(10);
    }
}
回复

使用道具 举报

2

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
372
金钱
372
注册时间
2018-9-14
在线时间
51 小时
发表于 2022-9-6 15:53:49 | 显示全部楼层
紫气东升 发表于 2022-9-6 09:41
1、删除taskA在taskC中操作
2、为了验证taskB是否正常运行,所以加个打印,并把阻塞等待通知屏蔽掉
3、 ...

串口打印如下:

task1 is run 1

task2 run  time = 1!

task3  run  number = 1!

task1 is run 2

task2 run  time = 2!

task3  run  number = 2!

task1 is run 3

task2 run  time = 3!

delete task1...

task3  run  number = 3!

task2 run  time = 4!

task3  run  number = 4!

task2 run  time = 5!

task3  run  number = 5!

task2 run  time = 6!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 20:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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