搜索
bottom↓
回复: 8

一个任务运行一段时间后就被永久阻塞是什么情况

[复制链接]

出0入0汤圆

发表于 2015-6-1 11:16:15 | 显示全部楼层 |阅读模式
操作系统采用的freeRTOS

中断服务里接收到一个数据后发送到一个队列

任务阻塞接收队列中的数据,然后进行分析

结果目前这个处理过程运行一段时间后,就会出现——中断接收到了一个数据,并且发送到了队列中,可是任务却永久地被阻塞了,无法唤醒。

我已经想了好久,也测试了很多地方,还是莫不清楚是什么导致这个现象的,希望论坛里的朋友们能帮我分析一下。

下面是我中断服务里的代码:

  1. void LptInIRQ_Server(void)
  2. {
  3.         uint8_t cData;
  4.         BaseType_t xHigherPriorityTaskWoken;
  5.        
  6.         xHigherPriorityTaskWoken = pdFALSE;
  7.        
  8.         LPT_IN_BUSY_UP();
  9.        
  10.         cData = LptGetChar();
  11. //        debugStatus = 130;
  12.         xQueueSendFromISR(qReceiptReceive, &cData, &xHigherPriorityTaskWoken);
  13. //        debugStatus = 131;
  14.        
  15.         if (xHigherPriorityTaskWoken == pdTRUE)
  16.         {
  17.                 vPortYield();
  18.         }
  19. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2015-6-1 13:01:28 | 显示全部楼层
没有朋友碰到过这样的问题吗?

出0入0汤圆

发表于 2015-6-1 13:45:10 | 显示全部楼层
数据发送到了消息队列,挂起在这个消息队列的任务应该能被自动唤醒的。
现在任务没有被唤醒,可能情况有:
1.消息队列没有成功建立
2.消息没有成功发送出去
3.任务没有成功启动
4.任务堆栈的大小配置可能有问题
以前用过UCOS的经验,可能不对,见谅见谅!

出0入0汤圆

 楼主| 发表于 2015-6-1 14:36:11 | 显示全部楼层
xuekcd 发表于 2015-6-1 13:45
数据发送到了消息队列,挂起在这个消息队列的任务应该能被自动唤醒的。
现在任务没有被唤醒,可能情况有:
...

在空闲任务中,我打印队列的状态、任务的状态、任务的堆栈

当出现任务永久阻塞的时候,发现队列中已经存在一个数据,而任务还是处于阻塞状态,任务的堆栈还绰绰有余

然后我通过一个全局变量来检测任务运行的情况,发现任务都是被阻塞在了接收队列的地方

出0入0汤圆

发表于 2015-6-12 15:46:19 | 显示全部楼层
本帖最后由 liubaoning1986 于 2015-6-12 15:49 编辑
伍师傅32 发表于 2015-6-1 14:36
在空闲任务中,我打印队列的状态、任务的状态、任务的堆栈

当出现任务永久阻塞的时候,发现队列中已经存 ...


是不是有优先级更高的任务一直处于运行态,把等待队列的任务饿死了呢
FreeRTOS的优先级编号越大,优先级越高,这个和很多常见的地方都不一样,可以检查一下,不要弄错了

出0入0汤圆

 楼主| 发表于 2015-6-12 19:51:33 | 显示全部楼层
liubaoning1986 发表于 2015-6-12 15:46
是不是有优先级更高的任务一直处于运行态,把等待队列的任务饿死了呢
FreeRTOS的优先级编号越大,优先级越 ...

这个任务已经是优先级最高的了,应该还是某个阻塞型API调用可能导致了优先级反转。

freeRTOS好像隔一定的时间会强制挂起其他任务,运行一下空闲任务。

出0入0汤圆

发表于 2015-6-12 22:01:51 | 显示全部楼层
直接跟踪任务调度和消息队列部分,这个有源代码还是好办

出0入0汤圆

 楼主| 发表于 2015-6-14 13:34:49 | 显示全部楼层
usecool 发表于 2015-6-12 22:01
直接跟踪任务调度和消息队列部分,这个有源代码还是好办

我设置了一个全局变量,用于跟踪任务的运行状态,然后在空闲任务中打印出来。

通过这个方法,发现任务从头到尾都运行完成了,可是到了某个时刻,这个任务就会被永久地阻塞了。

你说的跟踪方法具体实现方式是什么呢?

出0入0汤圆

发表于 2015-6-14 14:07:22 | 显示全部楼层
直接跟踪发送出消息后的消息队列状态,然后就是系统对消息队列的处理部分,看有了这个消息后,系统处理的过程,为何没有处理这个消息。
1、任务->等待消息(被系统标记为阻塞状态)
2、中断->发送消息->系统处理消息(这里应该是会把等待这个消息的任务标记为非阻塞状态了,或者在中断返回的消息处理部分)->中断返回->系统处理消息->系统调度

没看过FreeRTOS的代码,你参考下上面的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 07:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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