3

我有一个在 ARM uC 上运行的 VxWorks 应用程序。

首先让我总结一下应用程序;

应用程序由第 3 方堆栈和网关应用程序组成。我们已经实现了一个操作系统抽象层来支持操作系统的独立性。

底层堆栈有自己的内存管理和控制设施,它将内存块保存在一个双向链表中。

例如 ; 我们不直接执行 malloc/new , free/delege 。相反,我们调用 OSA 层的例程,它从 OS 获取内存并将其放入列表中,然后将此内存返回给应用程序。(例程:XXAlloc,XXFree,XXReAlloc)

当释放内存时,我们再次使用 XXFree。

事实上,这个块是一个结构,它有

- 魔术数字指示内存块的开始和结束 - 用户请求分配的大小 - 由于对齐问题而实际分配的大小 前一个和下一个指针 - 指向返回给应用程序的内存块的指针。显示应用程序中调用 xxAlloc 的位置的链接寄存器。

使用这种块结构堆栈可以检查块是否损坏。

我们还有从 Linux 移植的 pthread 库,我们用它来创建/终止线程(目前有 22 个线程) -同步对象(事件、互斥体..)

taskSpawn 调用了主任务,后来该任务创建了其他线程。

这是对应用程序及其 VxWorks 界面的描述。

问题是 :

其中一项任务突然被 VxWorks 破坏,没有提供有关问题所在的信息。我也有一个 jtag 调试器,它会命中 VxWorks taskDestoy() 例程,但调用堆栈既不提供 PC 也不提供任何信息 r14。

我怀疑代码中的特定例程,其中完成了巨大的 xxAlloc 但问题非常零星地发生,不知道我可以将它映射到源代码。

我认为操作系统会检测到异常并静默执行其处理。

任何帮助都会很棒

问候

4

3 回答 3

1

它解决了。

我做了一个孤立的测试。使用 malloc 分配 20MB,使用 0x55 分配 memset 并停止我的应用程序的线程。

我写了另一个线程来检查我的 20MB 是否写入了 0x55 以外的任何数据。

问什么!!属于 CPU 中其他组件的其他一些线程(其他人开发它们)写入我分配的空间。

谢谢4你的帮助

于 2009-08-15T21:16:03.953 回答
0

如果您的任务退出,则调用 taskDestroy()。如果您怀疑巨大的 xxAlloc,请确认内存耗尽时分配代码没有调用 exit()。我以前在第三方 OSAL 中被这种行为所困扰。

于 2009-07-27T22:54:55.580 回答
0

听起来您在集成后正在调试;这可能是一份糟糕的工作。我建议将问题分解成更小的部分。

过程

1)您可以通过检测代码和/或使用 VxWorks 检测(取决于哪个版本)来获得更多洞察力。这使您可以更清楚地了解发生的情况。确保将所有内容记录到文件中,这样您就可以从任务结束的时间点回到过去。仪器仪表是一项有价值的投资,因为它将在更多场合派上用场。VxWorks 中有趣的钩子:Taskhooklib

2)内存分配/释放是非常基本的功能。这将是我在定义明确的多线程环境中进行彻底(单元)测试的第一个候选者。如果你已经这样做了并且没有发现错误,我会首先开始看看为什么 tas 已经结束了。

其他可能的原因

当工作完成时,任务也会结束。所以它可能是由一个不那么无休止的循环引起的返回。特别是如果它总是相同的任务,这将是我的猜测。

并且某些版本的 VxWorks 具有 MMU 支持,必须加以考虑。

于 2009-08-06T08:03:30.480 回答