2013-04-27 42 views
0

我在系统中看到不寻常的东西。我的一个应用程序任务'xxxx'是信号量的“等待中”。它的优先级是94,下面是tt。vxworks异常调度观察

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()什么时候?

回答

0

仅仅因为一个任务是准备运行,但这并不意味着它实际运行......在这种情况下:

  1. YYYY的任务得到了旗语第一
  2. 任务YYYY可能得到通过抢占别的东西具有较高优先级(如外壳或任务XXXX例如)
  3. 任务XXXX试图获得信号,但被阻止,因为YYYY已经拥有它
  4. 最终任务YYYY实际上会进一步运行,直到它释放的信号
  5. 当的信号灯任务YYYY在XXXX任务会立即变得畅通和运行发布...
0

既然你有两个任务采取同样的旗语我假设你正在使用的旗语保护的关键部分您的代码使用共享资源。这个假设可能不正确,如果是的话请告诉我们。

您可能正在处理无限优先级反转。任务yyyy采取了信号量,任务xxxx正在等待并等待信号量。任务yyyy没有在处理器上执行,因为系统中有一个较高优先级的任务,在94和100之间(无限优先级反转),或者甚至高于使用CPU的94(正常的较高优先级任务干扰),并且不允许任务yyyy执行完成。

如果这是全部的话,你可能需要考虑用一个互斥体来替代你的二进制信号量,并且具有优先级继承。这将导致任务YYYY优先级临时升级到94,以匹配任务XXXX,一旦任务XXX已经开始等待互斥量。因此,在任务XXXX请求互斥体时阻止优先级94和100之间的任何任务执行。

如果优先级94以上的任务没有放弃处理器,则需要查看整个系统以及该任务的实现方式,并确定是否需要更改某些内容以便允许其他较低优先级的任务在CPU上执行的时间。