首页 文章

由崩溃的TASK锁定的VxWorks Mutual排除信号量

提问于
浏览
0

我在基于C的应用程序中面临一个问题,其中一个VxWorks TASK(比如Task1)由于某些未知原因而崩溃 . 崩溃的任务锁定了互斥信号量(比如semA) . 现在下一个TASK2正在等待semA以获得解锁 . 由于semA被崩溃的TASK锁定,TASK2将无限等待以获取semA . 这破坏了应用程序功能 .

我们无法在TASK2中提供锁定semA的超时,因为semA正在保护通过套接字发送数据的发送路由 . 提供超时将导致消息通信失败 .

谷歌搜索后,我发现LINUX的ROBUST互斥锁存在这样的问题,但我们的平台是VxWorks(版本5.5.1) . 那么有人可以告诉我在VxWorks中处理这个问题的方法吗?

我尝试了下面提到的解决方案,但不确定这样做有多安全 .

1)TASK2将等待特定时间的semA 2)如果失败检查已锁定semA 3的先前任务的状态,如果TASK1状态为SUSPENDED,则TASK 2将在semA上调用semDelete而不是重新创建它 . 4)如果TASK1未处于SUSPENDED状态,则继续等待 grab semA .

我已将此代码作为原型进行测试,并且工作正常 . 我不确定在重新生成信号量的情况下实施此类解决方案有多好,以及可能带来的风险是什么 .

请让我知道您的意见 .

谢谢

3 回答

  • 0

    我认为您的原型解决方案不会比使代码(Task1)因未知原因崩溃而具有风险 .

    如果我要处理你的问题,我会首先努力找出为什么Task1崩溃 . 如果我无法找出根本原因,那么我会去实施您提出的解决方案 . 也就是说,我会在一段时间后查询Task2的状态,然后重新创建信号量 .

  • 1

    我必须说,即使你实现了重新创建信号量的工作,你仍然会有一个消耗资源的崩溃任务 . 如果此问题仍然存在,那么最终整个系统将停止工作 . 最后,解决此问题的正确和唯一方法是修复task1中的崩溃 . 您应该能够将堆栈跟踪到崩溃的位置并进行修复 .

  • 0

    我先回答前面的答案:找出Task1崩溃的原因比实现变通方法更好 .

    你可以发布崩溃的Task1的VxWorks写的消息吗?

    如果任务崩溃没有充分理由,我尝试的第一件事就是增加它的堆栈大小(让我们说它加倍) . 如果任务运行正常,则堆栈大小太小 . 还尝试增加最近修改过的任务的堆栈大小!

    如果它是一个堆栈问题,它不是必须的Task1,这是责备...

相关问题