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.

[参考译文] MSP430FR5994:发生有效 CALLA 时的存储器违例

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1527293/msp430fr5994-memory-violation-upon-a-valid-calla

器件型号:MSP430FR5994

工具/软件:

您好:

我有(有...) 与 DSPLIB 完美配合的项目(使用 LEA 进行 FFT 计算)。

我决定将 DSPLIB 移动到静态库工程并链接到该工程。

现在、在执行期间、在不同的位置进入现在链接到我的应用程序的 DSPLIB 代码中、会生成存储器违例。  

这是对不受执行保护的段的违规。

我始终可以跟踪导致违规的确切行。  它是发生违例的受保护段 (0x10000-0x16000) 之外的对有效地址 (0x39xxx) 的调用。

奇怪的是,违反不是每次在同一个 Calla 触发,但总是在一个 Calla。  始终。

每次、在违规发生之前、反汇编窗口中显示的调用地址都是完全合法且有效的。  它实际上非常接近 PC、因为这是从库中的某个位置调用到库中的其他位置。

在 NMI 中、我有一些代码会检查栈、在发生执行违例时检索被调用地址和预期返回地址。 此代码在一段时间内运行良好、因此我倾向于信任检索到的数据。  被调用地址为 0x10000、这是所违反受保护段的确切起始位置。  所以、这肯定是一个真正的违规行为。  但是、返回地址绝对无效、超出了有效的存储器范围。

搜索二进制文件,我可以找到一整堆 Calla,完全有效,显然产生违规.  但是、0x10000 没有调用。  因此它应该是以 0x10000 结尾的间接调用...  但跟踪代码始终会将有效 CALLA 显示为 NMI 之前执行的最后一条指令。  始终。

这是怎么回事????

它很可能与与一个库的链接有关,但我真的无法解释或修复它。

此致、

Frederic

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

    由于这个问题在你与 DSPLIB 混为一谈后,这是你的第一个线索. 您会执行 CPU 不喜欢的操作。

    执行到达 0x10000 的另一种方法是使用未初始化的中断矢量。 它将告知 CPU ISR 由 0xfffe 启动。  

    堆栈帧的实际转储可能比您的代码解释它更有用。 这可能会被意想不到的事情抛出。

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

    嗯、Schultz 先生、您说得对。  是未初始化的矢量。  恭喜!!

    由于我将 DSPLIB 转换为静态库、因此不再将 LEA ISR 内置在代码中。  

    我通过在代码中添加 LEA ISR 来修复该问题、该 ISR 调用 DSPLIB 中的 LEA ISR(确保在静态库构建的特定情况下将 DSPLIB 中的 ISR 转换为正常函数)。

    它是有效的!

    非常感谢您!