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.

[参考译文] TMS320F28377S:返回地址0x0000的函数和堆栈指针被移动到链接器中指定的不同位置

Guru**** 2463330 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/738593/tms320f28377s-functions-returning-to-adress-0x0000-and-stack-pointer-being-moved-to-a-different-location-than-specified-in-the-linker

器件型号:TMS320F28377S

您好!

在我的 main()函数上添加了一个 for ()循环后,程序 sud延迟 开始被捕获在 ITRAP0中。 但是、它不是被添加到新的行中、而是被执行的第一个设置函数所捕获。 查看反汇编、这发生在 LRETR 指令之后。 查看 ITRAP0之前的 RPC 寄存器、寄存器值始终为0x0000、这意味着它没有恢复程序计数器。 经过一些挖掘后、我注意到正在发生的情况是、程序正在进入多个函数、但只能"返回"一次、因为在此之后、RPC 寄存器将始终导致0x0000和 ITRAP0。 由于 LRETR 指令应从堆栈中检索值、因此我转到那里、发现堆栈上没有写入任何值。 查看堆栈指针、它没有指向链接器中指定的地址(RAMM1、从0x0400开始)、而是指向指定值以外的值、包括 DMA 寄存器中间的地址。  

此代码从另一个正常工作的程序中更改、堆栈位于正确的地址中。 添加或删除代码行(例如将 for ()循环扩展为直接执行)只会更改栈的新地址。

堆栈指针正确启动,但在进入 main()之后,在第一个安装函数之前,我找到了这些修改堆栈指针的汇编指令

MOVL * SP++、XAR1
MOVL * SP++、XAR2
MOVZ AR2、@SP
SubB XAR2、#6
ADD @SP、 第670号 

为"#670"是指在我添加或删除代码行时发生变化的数字(多个变量属性)。 在我用来启动此操作的函数代码中,在进入 main()之后但在执行第一个设置函数之前执行的唯一指令是 ADDB SP,#4。

什么可能导致堆栈以这种方式运行? 在 RAM 中分配扇区(与堆栈不在同一位置)是否会导致此行为?

感谢你的任何帮助

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

    它听起来像是您的程序中有一个非法中断。 要调试该问题、请查看此 wikipage 以了解更多信息: processors.wiki.ti.com/.../Interrupt_FAQ_for_C2000

    关于 RAM 扇区、请尝试增大可用于 RAM 和堆栈的存储器大小。 有关详细信息、请参阅此 wikipage:
    processors.wiki.ti.com/.../C28x_Compiler_-_Understanding_Linking

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

    大家好、我确认了 ITRAP 是无效指令(程序计数器中的值0x0000)的结果。 我通过使用#data_section 将一些大型矢量变量分配给与栈不同的 RAM 部分来解决这个问题。 可能需要增加堆栈大小、但由于这些变量用于测试和调试、因此使用与堆栈不同的段不会成为问题。 感谢你的帮助。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴听到您能够修复它。 感谢您的关注。