0

我在我的系统中看到了一些不寻常的东西。我的应用程序任务之一“xxxx”正在“等待”信号量。它的优先级是94,下面是tt。

This task is pending:
(de009e8)   329220 vxTaskEntry +5c: yyyy()
....
(de003a8)  1453384 aaaaaa +3fc: fdprintf()
(de00328)   37ea54 fdprintf +60: fioFormatV()
(de00100)   37f0ac fioFormatV +4f0: fioFormatV()
(de000e8)   37fb44 fioFormatV +f88: write()
(de000c8)   383218 write +50: iosWrite()
(de00050)   385218 iosWrite +d0: tyWrite()
(de00028)   394d80 tyWrite +60: semTake()
(de00008)   3de698 semTake +90: semBTake()

Sem Id: 0xf7dfa40  BINARY EMPTY Owner: 0x7a42e78 (yyyy)
Pended Tasks:   xxxx @ 94

但是任务 yyyy 的 tt 如下所示。这里最重要的一点是,这个任务处于“READY”状态。此任务的优先级为 100。

<This task is ready>
(7a42e18)   329220 vxTaskEntry +5c: gggg()
....
(7a42cd8)   37e590 printf +84: fioFormatV()
(7a42ab0)   37fab8 fioFormatV +efc: fioFormatV()
(7a42a98)   37fb44 fioFormatV +f88: write()
(7a42a78)   383218 write +50: iosWrite()
(7a42a00)   385218 iosWrite +d0: devConsCreate()
(7a429e8)   127a18 devConsCreate +f8: write()
(7a429c8)   383218 write +50: iosWrite()
(7a42950)   385218 iosWrite +d0: tyWrite()
(7a42928)   394d80 tyWrite +60: semTake()
(7a42908)   3de698 semTake +90: semBTake()

当'yyyy'本身处于就绪状态时,任务'xxxx'如何为'yyyy'拥有的信号量挂起semBtake()

4

2 回答 2

0

由于您有两个任务采用相同的信号量,我假设您正在使用信号量来保护使用共享资源的代码的关键部分。这个假设可能不正确,如果是这样,请告诉我们。

您可能正在处理无限的优先级反转。任务 yyyy 已获取信号量,任务 xxxx 处于挂起状态并在信号量上等待。任务 yyyy 未在处理器上执行,因为系统中有更高优先级的任务在 94 和 100 之间(无限优先级反转)或什至高于 94(正常的更高优先级任务干扰),它正在使用 CPU 并且不允许任务 yyyy执行完成。

如果这一切都是真的,您可能需要考虑用互斥体替换您的二进制信号量,并具有优先级继承。一旦任务 XXX 开始在互斥体上挂起,这将导致任务 YYYY 的优先级暂时提升到 94 以匹配任务 XXXX。因此,当任务 XXXX 请求互斥锁时,阻止执行优先级 94 到 100 之间的任何任务。

如果优先级高于 94 的任务没有放弃处理器,您将需要查看整个系统以及该任务是如何实现的,并确定是否需要更改某些内容,以便它允许其他优先级较低的任务有时间执行中央处理器。

于 2013-12-13T20:27:08.287 回答
0

仅仅因为任务已准备好运行,并不意味着它实际上正在运行......在这种情况下:

  1. yyyy任务先拿到信号量
  2. 任务 yyyy 可能被其他具有更高优先级的东西抢占(例如 shell 或任务 xxxx)
  3. 任务 xxxx 尝试获取信号量但由于 yyyy 已经拥有它而被阻止
  4. 最终任务 yyyy 将实际运行得更远,直到它释放信号量
  5. 当信号量被任务 yyyy 释放时,xxxx 任务将立即变得畅通并运行...
于 2013-05-07T19:04:16.263 回答