OpenEdv-开源电子网

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

vTaskList为什么显示已经删除的任务处于运行态呢?

[复制链接]

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2020-11-5
在线时间
20 小时
发表于 2021-1-28 21:49:33 | 显示全部楼层 |阅读模式
1金钱
  1. void start_task(void* pvParameters)
  2. {
  3.        
  4.                 xTaskCreate((TaskFunction_t) TASK1_task,  //创建任务1
  5.                                                                 (char*         )  "TASK1_task",
  6.                                                                 (uint16_t      ) TASK1_STACK_SIZE,
  7.                                                                 (void*         ) NULL ,
  8.                                                                 (UBaseType_t   ) TASK1_TASK_PRIO,
  9.                                                                 (TaskHandle_t* ) &TASK1_Handler );

  10.                 xTaskCreate((TaskFunction_t) TASK2_task, //创建任务2
  11.                                                                 (char*         )  "TASK2_task",
  12.                                                                 (uint16_t      ) TASK2_STACK_SIZE,
  13.                                                                 (void*         ) NULL ,
  14.                                                                 (UBaseType_t   ) TASK2_TASK_PRIO,
  15.                                                                 (TaskHandle_t* ) &TASK2_Handler );
  16.                                                                
  17.                 <b>vTaskDelete(NULL);   //删除start_task任务
  18. </b>}
  19. void TASK1_task(void* pvParameters)
  20. {
  21.         for(;;)
  22.             {
  23.                 delay_ms(1000);
  24.              }

  25. }

  26. void TASK2_task(void* pvParameters)
  27. {
  28.         char List[100];
  29.         vTaskList(List);
  30.         printf("%s",List);

  31.       for(;;)
  32.             {   
  33.                 delay_ms(1000);
  34.             }
  35.    
  36. }

  37. 串口信息:
  38. TASK2_task         R    3     438      5
  39. start_task            R    1     86       1
  40. IDLE                   R    0     120     2
  41. TASK1_task         B    2     104     4
  42. Tmr Svc              S    31     236    3



  43. Q:
  44. 1.已经将start_task任务删除了,但是通过vtasklist()打印出来显示start_task还是运行态呢?
  45. 2.而且为什么TASK1_Task是阻塞态呢?
  46. 3.当我把Task1_task中的delay_ms删除后变为空循环,Task2_task中的串口就打印不出来了?(任务堆栈大小足够)
  47. (刚刚学习两天,谢谢大神们的耐心讲解)



复制代码



最佳答案

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

缺少很重要的一个信息就是延时函数的实现 所以根据结果和上面的程序内容可以反推这个结果的原因 在delay_ms延时函数中使用的api函数 那么这个整个逻辑就是 系统开始运行,然后运行start_task 在start_task中先创建TASK1_task,然后TASK1_task抢占start_task任务开始运行(这时候TASK2_task还没出生呢) TASK1_task运行延时函数中的api函数释放了cpu后(其实也就是TASK1_task阻塞态的原因)start_task继续运行开始创建TASK2_task ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

113

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2538
金钱
2538
注册时间
2019-10-18
在线时间
403 小时
发表于 2021-1-28 21:49:34 | 显示全部楼层
本帖最后由 decai 于 2021-1-29 19:16 编辑

缺少很重要的一个信息就是延时函数的实现
所以根据结果和上面的程序内容可以反推这个结果的原因
在delay_ms延时函数中使用的api函数

那么这个整个逻辑就是
系统开始运行,然后运行start_task
在start_task中先创建TASK1_task,然后TASK1_task抢占start_task任务开始运行(这时候TASK2_task还没出生呢)
TASK1_task运行延时函数中的api函数释放了cpu后(其实也就是TASK1_task阻塞态的原因)start_task继续运行开始创建TASK2_task
TASK2_task创建后也马上抢占了start_task的cpu使用权(所以下面的删除自己的语句还没执行.依然处在运行态)
TASK2_task开始运行.开始语句就是vTaskList(List);.那么开始输出任务信息(当前的时刻的任务信息)
回头看上面start_task运行态.还在等cpu来删除自己的语句执行
TASK1_task阻塞态.还在等待延时的结束
TASK2_task运行态.正在运行打印呢不是


理完了逻辑
至于最后删除TASK1_task的延时就不打印也就很好理解了
TASK1_task无法释放cpu了
那么抢了start_task的cpu后就霸着不放了那么start_task就创建不了TASK2_task
那么还怎么运行TASK2_task,怎么打印信息


打字真累..........



回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2020-11-5
在线时间
20 小时
 楼主| 发表于 2021-1-31 21:15:46 | 显示全部楼层
decai 发表于 2021-1-28 21:49
缺少很重要的一个信息就是延时函数的实现
所以根据结果和上面的程序内容可以反推这个结果的原因
在delay_ ...

谢谢大佬的耐心讲解。我在start_task函数中加入了临界区保护,打印后start_task已经删除了。Task1_task处于阻塞态我还是不大理解?当把Task1_task中的delay_ms删除了后任务中空循环会一直占用CPU吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 16:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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