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.

[参考译文] TMS320F28386D:堆栈溢出

Guru**** 2451970 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1234140/tms320f28386d-stack-overflow

器件型号:TMS320F28386D

当使用 TI 的示例时:erad_ex3_stack_overflow_detect

文件中的所有表格   

 RAMM1.       : origin = 0x000400, length = 0x0003F8   /*片上 RAM 块 M1 */

.stack        :> RAMM1.

长度为 0x0003F8 (1016 *2= 2032字节)    

我假设 addr_params.address 应是2032-10=2022。

但正如下面的调试窗口显示的、该值为2030。

另一个问题是、当首次进入 RTOSISR 中断时。

获取上述调试信息、 addr_params.addres =2030 (3F7)

堆栈的起始地址为 0x000400。

因此、我想当 SP 大于0x400+0x3F7时、它将进入 RTOSISR 中断。

我想当  首次进入 RTOSISR 中断时、SP 值应为0X7F7+0x06=0X7FD。 而不是0x806。

一定是与我的理解不符的事情。

HOEP TI 专家可以为您提供帮助

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

    第二个问题。

    堆栈流分解是否从 SP 开始为0x40A?

    然后添加  addr_params.addres =2030 (3F7)

    0x40A+0X3F7 = 0X801。

    当 SP 大于0x801时。 它将进入  RTOSISR 中断。

    然后0x801+0x06 = 0x807  

    但仍具有0x01间隙。

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

    您好!

    ISR 还需要一些堆栈。  编译器在 ISR 开始时插入寄存器保存指令(保存的寄存器总数将取决于函数实现和优化级别)。 实际上、当 SP 在 ISR 内部时、它将递增至几个字。  您可以检查汇编代码、以了解保存了多少个寄存器以及正在使用多少堆栈存储器。  

    此致、

    Veena

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

    您可以帮助解答上述第一个问题吗?

    DDR_params.addres 的值=2030 (3F7)

    我假设 addr_params.address 应是2032-10=2022。

    但正如下面的调试窗口显示的、该值为2030。

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

    在上面的描述中、我已经添加了 ISR 堆栈、它是6。

    第二个问题。

    堆栈流分解是否从 SP 开始为0x40A?

    然后添加  addr_params.addres =2030 (3F7)

    0x40A+0X3F7 = 0X801。

    当 SP 大于0x801时。 它将进入  RTOSISR 中断。

    然后0x801+0x06 = 0x807  

    但仍具有0x01间隙

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

    我不明白你为什么提到0x40A?

    ADDR_params.address =(uint32_t)&_TI_STACK_END - threshold;-> 0x7F8 - 10 = 0x7EE。

    C28x CPU 会自动保存一组寄存器。 从 TMS320C28x CPU 和指令集参考指南:  

    此外、编译器还在 ISR 代码中保存了一组寄存器

    此致、

    Veena

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

    该图片显示了当在 addr_params.address =(uint32_t)&_TI_STACK_END - threshold 运行时; SP 值为 0x40A

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

    堆栈从0x400到0x7F8。

    我们将阈值设置为0x7EE。

    这意味着当 SP 的值大于0X7EE 时。 它将进入  RTOSISR 中断。 我对吗?

    正如 bebug 窗口显示、当进入 RTOSISR 中断时、SP 的值为0x806。

    显示 RTOSISR 堆栈大小的堆栈使用 CCS 窗口 为6。 这不可信吗? 无法将其用作堆栈大小的计算?

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

    在我之前的回复中提到过、C28x CPU 会自动将一组寄存器保存到堆栈中。 这不包括在编译器插入的堆栈使用中、即6。

    此致、

    Veena

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

    感谢您的耐心等待。  

    请帮助确认以下要点吗?

    堆栈从0x400到0x7F8。

    我们将阈值设置为0x7EE。

    这意味着当 SP 的值大于0X7EE 时。 它将进入  RTOSISR 中断。  我对吗?