2017年11月29日 网络

调试VxWorks信号量-给它们一个名称!

由布莱恩·库尔

Bkuhl

调试信号量交互可能是一个棘手的问题。当由于优先级继承过多而出现死锁或奇怪的延迟时,它绝不仅仅是一个互斥信号量,而是多个任务中多个信号量的意外交互。有些信号量是VxWorks I/O服务的一部分,有些在您的应用程序中。

您的工具告诉您信号量ID是什么,但通常这不足以识别信号量。如果这是其他人的代码,并且他们已经创建了许多信号量,那么您可以花几个小时来尝试识别涉及到哪些代码。

为了增加复杂性,一些信号量只存在几微秒,所以检查日志中的ID并不能帮助您理解它是在哪里创建的。在我担任现场工程师期间,我曾帮助不止一位Wind River客户调试与信号量有关的棘手问题,而我缺少的头发可以证明这一点。

如果可以用唯一的名称标识每个信号量,那不是很好吗?“是的,”你说,“那很好,但我不会重写所有代码来使用不同的API。”

您愿意在现有代码中添加另一个头文件吗?

在最近的版本VxWorks,这里有一个命名信号量的概念,可以使用semOpen()而不是sem创建XCreate()。semOpen()的主要用途是在内存上下文之间共享一个信号量,因此可以在内核和一个RTP或多个RTP中使用相同的信号量。semOpen还可以创建一个私有信号量,该信号量与用sem实例化的信号量具有相同的作用域XCreate ();(只是不要在名字的开头放反斜杠)。

精明的读者会猜到接下来会发生什么?是的,一些带有奇特宏的示例代码。首先是带有新头的修改代码的简单示例semCreateWithOpen.h

semaphore1

当然还有花哨的标题内容:

semaphore2
semaphore3

如果名称存在,这些工具将显示给您,您不需要使用替代API或不同的配置。试试semShow()看看会发生什么?你应该看到如下内容:

semaphore5

现在你知道信号是从哪里来的了吗?

您将需要添加扩展对象库(SEM_OBJ_OPEN)支持,如果您没有配置RTP支持。您将希望在头文件中添加用于计数和读写信号量的类似函数。

您的经验丰富的VxWorks工程师团队是否喜欢更多的调试提示?我想推荐我们的VxWorks应用调试用例这是一种花时间提升技能的好方法。

以前的基于自动需求的测试来自QA系统Cantata与风河工作台
下一个风河帮助欧姆龙解决其工业物联网挑战