This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/SM320C6713B-EP:损坏问题

Guru**** 665180 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/627066/ccs-sm320c6713b-ep-corruption-issues

器件型号:SM320C6713B-EP

工具/软件: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值损坏、结果损坏。 我不确定这是芯片问题、调试器问题还是堆栈/中断问题。 可能会发生中断并保存寄存器、但堆栈损坏会导致错误的恢复?

 

有什么想法或可能采取的故障排除步骤?

 

 

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    BID、

    这些板(旧板和新板)是在内部设计的、还是由其他公司或合同制造商设计的? 您是否掌握了所有设计信息?

    从旧板变为新板有什么变化? 您是否还有一些可以测试某些代码的旧电路板?

    堆栈溢出可能会表现为非常奇怪的操作、并且很难跟踪、但通常很容易判断发生这种情况的方法是从填充了0x0BADC0DE 等内容的堆栈开始、并在故障停止后查看堆栈顶部。 不是所有任务堆栈都很容易实现、因此在调试期间可能有一种方法可以消除其中的一些变量?

    您在#3中看到的是、单步执行和寄存器损坏似乎不可能发生。 我认为、启用的主动中断会单步进入、而不是执行并返回、而不会让您知道发生了这种情况。 但为了消除这种情况、在开始单步进入_divd 之前、您可以在 CSR 中禁用全局中断启用 GIE、然后在代码上启动单步执行。

    我在 CPU 和指令集参考指南中看不到调用、因此我假设您正在显示来自汇编文件的代码并执行源代码步进。 是这样吗? 请打开或显示反汇编器窗口的内容、以确认正在执行的仿真器内容。

    这些故障的一致性如何? 您是否报告了您观察到的三种不同的一次性故障、或者每次执行相同操作时是否会发生这些相同的故障?

    这是器件故障问题或编译器问题的可能性很低。 但是、由于您有一个新的电路板、时钟和电源上的噪声可能会出现问题、应该加以观察。 噪声很少与一致的故障相关、但可能与随机或概率故障相关。

    根据故障一致性以及电路板的范围变化和代码变化、尝试在旧电路板上运行一些代码加载会有所帮助。 另一个很好的测试是返回到您在旧板上运行的代码并在新板上运行。

    我不熟悉 Rational Rhapsody、但听起来它是一个源代码生成实用程序、您可以将其生成的源代码馈送到 TI 编译器中。 这显然不是造成这一问题的原因的一个可疑点。

    当您有机会解释更多内容时、我们可以尝试深入挖掘。 尽管我没有 C6713板、但我们可能有人确实可以尝试代码、但最有可能所有有用的调试都将出现在您的板上。

    此致、
    RandyP
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想到了几件事。 我最近遇到了6713的奇怪问题、这是因为总线时钟的设置对于我的 PCB 来说太快了。 我认为它从60MHz 减慢到50MHz、问题就消失了。 但这是在 DDR 存储器上、而不是在 SRAM 上。

    另一个6713问题是尝试使用 JTAG 将代码加载到外部 SRAM 中。 在使用外部芯片之前、必须在6713上设置外部 SRAM 运行参数、JTAG 加载过程不知道这样做。 我能够加载到内部 SRAM 并在那里调试我的代码。

    希望这对您有所帮助、

    劳埃德

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您回复@RandyP。  您提出了一些好的问题、并提出了一些好的问题。

    BID、

    这些板(旧板和新板)是在内部设计的、还是由其他公司或合同制造商设计的? 您是否掌握了所有设计信息? [/报价]

    这两个都是由向我们提供原始代码库的同一分包商设计的。  我们仍然保持通信、并且仍在交换设计信息、因为此合同阶段仍处于活动状态。


    [引述]
    从旧板变为新板有什么变化? 您是否还有一些可以测试某些代码的旧电路板?

    [/报价]
    将旧的 Stellaris 微处理器替换为 Tiva 微处理器并更改 FPGA 桥接芯片中的固件。  FPGA 充当 MCU 和 DSP 之间的桥接器(双端口共享 RAM)、尝试使用2007技术(项目最旧阶段开始时)执行 DaVinci 在同一封装中的 DSP 和 MCU 之后所做的操作。  FPGA 还处理 DSP 的闪存、SRAM 和 NVRAM (FRAM)接口。  因此、是的、这里的任何更改都可能产生重大影响。  我们认为、大多数 FPGA 更改都是为了消除传统中断。


    [引用]堆栈溢出可能会显示为非常奇怪的操作、并且很难跟踪、但通常可以很容易地看出这是由填充了0x0BADC0DE 等内容的堆栈开始并在故障停止后查看堆栈顶部而发生的。 不是很容易处理所有任务堆栈、因此在调试过程中可能有一种方法可以消除其中的一些变量?[/quot]

    现在(我猜是使用 TSK_checkstacks)、系统堆栈填充为0x00C0FFEE、TSK (线程)堆栈填充为0xBEBEBE。  通过调试器检查内存空间似乎并不表示内存损坏。

    [引用]您在#3中看到的、单步执行和寄存器损坏似乎不可能发生。 我认为、启用的主动中断会单步进入、而不是执行并返回、而不会让您知道发生了这种情况。 但为了消除这种情况、在开始单步进入_divd 之前、您可以在 CSR 中禁用全局中断启用 GIE、然后在代码上启动单步执行。

    我尝试使用 uint32_t retval =_disable_interrupts ();_restore_interrupts (retval);

    它似乎可以处理第一个事件、但其他错误在代码中稍后发生。  我尝试换行代码的整个计算部分(多个过程调用)、但这没有帮助。  仍然检查其他方法、包括具有#pragma FUNC_INTERRUPT_THRESHOLD 的函数是否已恢复中断。


    [引用]我在 CPU 和指令集参考指南中看不到调用、因此我假设您正在显示来自汇编文件的代码并执行源代码步进。 是这样吗? 请打开或显示反汇编器窗口的内容以确认正在执行的仿真器内容。  

    我在写这篇文章时没有遇到反汇编。  我认为编译器(-k)使用伪运算"调用"、但实际上是一个 B.S2用于过程调用(程序计数器保存在寄存器 B3中)、这就是它在调试器反汇编中的表现方式。

    [报价]这些故障的一致性如何? 您是否报告了您观察到的三种不同的一次性故障、或者每次执行相同操作时是否会发生这些相同的故障?


    根据故障一致性以及电路板的范围变化和代码变化、尝试在旧电路板上运行一些代码加载会有所帮助。 另一个很好的测试是返回到您在旧板上运行的代码并在新板上运行。
    [/报价]

    如果它们不在代码的一个部分中发生、则在另一个部分中发生。  似乎一致的是、在某个地方会出现错误。  我确实想尝试在新电路板上加载旧代码以及在旧电路板上加载新代码。  问题在于、某些固件地址在电路板版本之间发生了变化、某些区域可能会导致损坏。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Lloyd Slonim"]

    我想到了几件事。 我最近遇到了6713的奇怪问题、这是因为总线时钟的设置对于我的 PCB 来说太快了。 我认为它从60MHz 减慢到50MHz、问题就消失了。 但这是在 DDR 存储器上、而不是在 SRAM 上。

    另一个6713问题是尝试使用 JTAG 将代码加载到外部 SRAM 中。 在使用外部芯片之前、必须在6713上设置外部 SRAM 运行参数、JTAG 加载过程不知道这样做。 我能够加载到内部 SRAM 并在那里调试我的代码。

    希望这对您有所帮助、

    劳埃德

    [/报价]

    感谢 Lloyd、 我们将探讨 SRAM 时序的可能性。