vxworks消息队列“丢失”了阻塞的任务。可能是什么原因?

时间:2017-01-05 17:03:42

标签: multithreading message-queue vxworks

我们在Vxworks 5.5和PPC8260上实现了一个非常大的多任务通信系统。系统应该处理大量的以太网流量,并通过RS-232,内存映射I / O等处理一些循环外围控制活动。会发生的是,在某些时刻,我们用于任务间通信的消息队列很少会溢出(I通过日志检查看到它。当我检查负责提供此消息队列的任务的状态(即对它们进行接收)时,它们似乎是READY。当我检查msgQShow队列本身时,它们已满,但没有任何任务被阻止。但是查看任务堆栈跟踪显示一个任务实际上在msgQReceive调用中挂起。特别是在qJobGet内核调用中或类似的东西。

1 个答案:

答案 0 :(得分:0)

消息队列"丢失&#34>极不可能。一个被阻止的任务。

根据您的描述,我们可以假设:

  1. 消息队列已溢出。大概是你通过检查msgQSend的返回值来检测到这一点,msgQSend是用超时值或NO_WAIT调用的。
  2. msgQShow确认Q已满
  3. 应该读取队列的任务处于READY状态。
  4. READY状态是任务在可用时运行的状态。任务保存在队列中(严格地说,每个优先级一个队列),当达到队列的头部时,它们将被安排。

    如果任务持续显示为READY,则表明它们没有获得CPU时间。 msgQ似乎没有空的事实支持。

    您应该使用系统查看器等工具进行诊断。您可能需要提高阅读器任务的优先级。如果您的msgQSend使用NO_WAIT,则可能需要使用超时值