调试VxWorks信号量-给它们一个名称!
由布莱恩·库尔
调试信号量交互可能是一个棘手的问题。当由于优先级继承过多而出现死锁或奇怪的延迟时,它绝不仅仅是一个互斥信号量,而是多个任务中多个信号量的意外交互。有些信号量是VxWorks I/O服务的一部分,有些在您的应用程序中。
您的工具告诉您信号量ID是什么,但通常这不足以识别信号量。如果这是其他人的代码,并且他们已经创建了许多信号量,那么您可以花几个小时来尝试识别涉及到哪些代码。
为了增加复杂性,一些信号量只存在几微秒,所以检查日志中的ID并不能帮助您理解它是在哪里创建的。在我担任现场工程师期间,我曾帮助不止一位Wind River客户调试与信号量有关的棘手问题,而我缺少的头发可以证明这一点。
如果可以用唯一的名称标识每个信号量,那不是很好吗?“是的,”你说,“那很好,但我不会重写所有代码来使用不同的API。”
您愿意在现有代码中添加另一个头文件吗?
在最近的版本VxWorks,这里有一个命名信号量的概念,可以使用semOpen()而不是sem创建XCreate()。semOpen()的主要用途是在内存上下文之间共享一个信号量,因此可以在内核和一个RTP或多个RTP中使用相同的信号量。semOpen还可以创建一个私有信号量,该信号量与用sem实例化的信号量具有相同的作用域XCreate ();(只是不要在名字的开头放反斜杠)。
精明的读者会猜到接下来会发生什么?是的,一些带有奇特宏的示例代码。首先是带有新头的修改代码的简单示例semCreateWithOpen.h.
当然还有花哨的标题内容:
如果名称存在,这些工具将显示给您,您不需要使用替代API或不同的配置。试试semShow()看看会发生什么?你应该看到如下内容:
现在你知道信号是从哪里来的了吗?
您将需要添加扩展对象库(SEM_OBJ_OPEN)支持,如果您没有配置RTP支持。您将希望在头文件中添加用于计数和读写信号量的类似函数。
您的经验丰富的VxWorks工程师团队是否喜欢更多的调试提示?我想推荐我们的VxWorks应用调试用例这是一种花时间提升技能的好方法。