伍师傅32 发表于 2015-6-1 11:16:15

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

操作系统采用的freeRTOS

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

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

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

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

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

void LptInIRQ_Server(void)
{
        uint8_t cData;
        BaseType_t xHigherPriorityTaskWoken;
       
        xHigherPriorityTaskWoken = pdFALSE;
       
        LPT_IN_BUSY_UP();
       
        cData = LptGetChar();
//        debugStatus = 130;
        xQueueSendFromISR(qReceiptReceive, &cData, &xHigherPriorityTaskWoken);
//        debugStatus = 131;
       
        if (xHigherPriorityTaskWoken == pdTRUE)
        {
                vPortYield();
        }
}

伍师傅32 发表于 2015-6-1 13:01:28

没有朋友碰到过这样的问题吗?

xuekcd 发表于 2015-6-1 13:45:10

数据发送到了消息队列,挂起在这个消息队列的任务应该能被自动唤醒的。
现在任务没有被唤醒,可能情况有:
1.消息队列没有成功建立
2.消息没有成功发送出去
3.任务没有成功启动
4.任务堆栈的大小配置可能有问题
{:loveliness:}以前用过UCOS的经验,可能不对,见谅见谅!

伍师傅32 发表于 2015-6-1 14:36:11

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

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

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

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

liubaoning1986 发表于 2015-6-12 15:46:19

本帖最后由 liubaoning1986 于 2015-6-12 15:49 编辑

伍师傅32 发表于 2015-6-1 14:36
在空闲任务中,我打印队列的状态、任务的状态、任务的堆栈

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

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

伍师傅32 发表于 2015-6-12 19:51:33

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

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

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

usecool 发表于 2015-6-12 22:01:51

直接跟踪任务调度和消息队列部分,这个有源代码还是好办

伍师傅32 发表于 2015-6-14 13:34:49

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

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

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

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

usecool 发表于 2015-6-14 14:07:22

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

没看过FreeRTOS的代码,你参考下上面的。
页: [1]
查看完整版本: 一个任务运行一段时间后就被永久阻塞是什么情况