工具/软件:Code Composer Studio
我们将更新在增强型产品6713B 上运行的旧应用程序。 该应用程序过去已成功使用、我们已将其迁移到新的电路板并添加了新功能。 我在使用 Blackhawk USB560M 运行时看到一些寄存器和存储器损坏。 主机系统运行的是 Windows XP SP2 (32位)和 CCS v3.3。 DSP/BIOS 版本为5.32.04。 代码环境是 Rational Rhapsody 生成的 C++。 TI 编译器版本为6.1.8
我们在最新一轮代码更改方面遇到了一些问题。 在不对硬件进行任何中间测试的情况下添加大量更改并不是一个好主意。 最明显的误差是我修复的零指针解除引用。 但是、在更正后、我在调试器中看到了三个单独的错误实例。 由于我正在调试并从 JTAG 加载应用程序,所有常量数据和程序代码都被加载到 SRAM (以及堆)而不是闪存中。
我不确定我是否遇到堆栈或堆损坏,因此我尝试调整(向上和向下)线程堆栈大小、系统堆栈大小和系统堆大小。 其中一些可能有所帮助。 我尝试添加校验堆栈,但没有发现任何问题。 但是、根据过去的经验、如果堆栈太小、可能会导致堆栈损坏、而不会看到 KV 中的堆栈使用量增加。
1) 从一个函数传递到另一个函数的参数已损坏。 两个函数都是"用户生成的"、就像我们在编写它们时所写的那样、并且具有完整的源代码。 在此示例中、调用一个具有多个参数的函数:两个固定长度数组(例如 array1[NUM_SAMESSAGE])、多个双精度数、枚举值和枚举固定长度的枚举数组。 第一个参数是双精度数组、第二个参数是双精度数组。 单步执行时,第二个双精度参数将是正确的,直到我步入函数,此时它将损坏(从15.0变为~0 [一个非常小的数字,如10^-300])。 ‘,我将该参数设置为“const double &”旁路引用,而不是双精度型,这似乎很有帮助。
2) 对常量结构数组的访问无效。 在本例中、我们有 const DataStruct[NUM]、检索 DataStruct[0].Element 不起作用。 特别是通过命名空间访问它(即使我是“使用”命名空间)似乎有所帮助。 除非这是偶然的、因为我在此期间仍在调整堆栈大小。 使用内存浏览器检查实际内存位置显示了正确的数据。 在地址上添加一个读取观察点不会导致任何暂停。
3) 对_divd 的库调用会导致分频值损坏。 在这种情况下、我的代码尝试计算倒数(1.0 /声速)并将其存储为乘法器、而不是具有多分频(慢速)。 声速可能会有所不同、但通常约为340.0。 但是、计算该倒数有时会产生无限结果。 对于这个、我单步执行汇编输出、同时观察寄存器。 最初、被除数在 A5:A4中、而除数在 A7:A6中。 根据 ABI、参数2需要位于 B5:B4中。 反汇编代码如下所示
调用_divd
NOP 3.
MOV A7、B5
MOV A6、B4
单步执行显示正确的寄存器输出、直到分支发生、然后 B5值损坏、结果损坏。 我不确定这是芯片问题、调试器问题还是堆栈/中断问题。 可能会发生中断并保存寄存器、但堆栈损坏会导致错误的恢复?
有什么想法或可能采取的故障排除步骤?