一个任务运行一段时间后就被永久阻塞是什么情况
操作系统采用的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();
}
} 没有朋友碰到过这样的问题吗? 数据发送到了消息队列,挂起在这个消息队列的任务应该能被自动唤醒的。
现在任务没有被唤醒,可能情况有:
1.消息队列没有成功建立
2.消息没有成功发送出去
3.任务没有成功启动
4.任务堆栈的大小配置可能有问题
{:loveliness:}以前用过UCOS的经验,可能不对,见谅见谅! xuekcd 发表于 2015-6-1 13:45
数据发送到了消息队列,挂起在这个消息队列的任务应该能被自动唤醒的。
现在任务没有被唤醒,可能情况有:
...
在空闲任务中,我打印队列的状态、任务的状态、任务的堆栈
当出现任务永久阻塞的时候,发现队列中已经存在一个数据,而任务还是处于阻塞状态,任务的堆栈还绰绰有余
然后我通过一个全局变量来检测任务运行的情况,发现任务都是被阻塞在了接收队列的地方 本帖最后由 liubaoning1986 于 2015-6-12 15:49 编辑
伍师傅32 发表于 2015-6-1 14:36
在空闲任务中,我打印队列的状态、任务的状态、任务的堆栈
当出现任务永久阻塞的时候,发现队列中已经存 ...
是不是有优先级更高的任务一直处于运行态,把等待队列的任务饿死了呢
FreeRTOS的优先级编号越大,优先级越高,这个和很多常见的地方都不一样,可以检查一下,不要弄错了 liubaoning1986 发表于 2015-6-12 15:46
是不是有优先级更高的任务一直处于运行态,把等待队列的任务饿死了呢
FreeRTOS的优先级编号越大,优先级越 ...
这个任务已经是优先级最高的了,应该还是某个阻塞型API调用可能导致了优先级反转。
freeRTOS好像隔一定的时间会强制挂起其他任务,运行一下空闲任务。 直接跟踪任务调度和消息队列部分,这个有源代码还是好办 usecool 发表于 2015-6-12 22:01
直接跟踪任务调度和消息队列部分,这个有源代码还是好办
我设置了一个全局变量,用于跟踪任务的运行状态,然后在空闲任务中打印出来。
通过这个方法,发现任务从头到尾都运行完成了,可是到了某个时刻,这个任务就会被永久地阻塞了。
你说的跟踪方法具体实现方式是什么呢? 直接跟踪发送出消息后的消息队列状态,然后就是系统对消息队列的处理部分,看有了这个消息后,系统处理的过程,为何没有处理这个消息。
1、任务->等待消息(被系统标记为阻塞状态)
2、中断->发送消息->系统处理消息(这里应该是会把等待这个消息的任务标记为非阻塞状态了,或者在中断返回的消息处理部分)->中断返回->系统处理消息->系统调度
没看过FreeRTOS的代码,你参考下上面的。
页:
[1]