首页 文章

如何确定任务破坏的原因,VxWorks?

提问于
浏览
3

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

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

应用程序包含第三方堆栈和网关应用程序 . 我们已经实现了一个操作系统抽象层来支持OS依赖 .

底层堆栈有自己的内存管理和控制工具,它将内存块保存在双向链表中 .

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

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

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

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

使用此块结构堆栈可以检查块是否已损坏 .

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

taskSpawn调用了一个主要任务,后来这个任务创建了其他线程 .

这是对应用程序及其VxWorks接口的描述 .

问题是 :

其中一项任务突然被VxWorks摧毁,没有提供有关错误的信息 . 我也有一个jtag调试器,它命中了VxWorks taskDestoy()例程但是调用堆栈不提供PC或r14的任何信息 .

我怀疑代码中的特定例程,其中完成了巨大的xxAlloc但是问题非常偶然,并且没有任何线索我可以将它映射到源代码 .

我认为操作系统检测到异常,并以静默方式执行其处理 .

任何帮助都会很棒

问候

3 回答

  • 0

    它解决了 .

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

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

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

    谢谢你的帮助

  • 0

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

  • 1

    听起来像是在集成后进行调试;这可能是一个很糟糕的工作 . 我建议把问题分成小块 .

    Process

    1)通过检测代码和/或使用VxWorks工具(取决于哪个版本),您可以获得更多洞察力 . 这使您可以更好地了解所发生的情况 . 请务必将所有内容记录到文件中,以便从任务结束点开始及时移回 . 仪表是值得的投资,因为它在更多场合会很方便 . VxWorks中有趣的钩子:Taskhooklib

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

    other possible causes

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

    并且某些版本的VxWorks必须考虑MMU支持 .

相关问题