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.

[参考译文] TMS320F28335:汇编文件数据 SoE 和 FR 大小

Guru**** 2551110 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1400305/tms320f28335-assembly-file-data-soe-and-fr-size

器件型号:TMS320F28335

工具与软件:

您好!

我目前正在现场调试我们的一个装置中的问题。
我们不时会遇到会导致外部复位的意外行为。 (由于关闭时间)

我怀疑我们面临堆栈溢出、但我无法在此单元上使用调试器。

我现在将 .asm 文件与上次工作的固件版本进行比较、我注意到一些函数属性发生了变化。


我想知道 SoE 和 FR 的含义是什么。
(从 caמ 文档中、我看到 FR =帧大小 并且 SOE =进入时保存)
 
但是、我不明白 SOE = 2的含义是什么、以及什么可以将其从0更改为2。
它是否影响与堆栈相关的嵌套中断?  

有人可以详细说明这个主题吗?

此致、
Michael





BTW、  
该代码由 CCS3.3、C2000代码生成工具6.2.4编译

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

    请搜索 C28x 编译器手册 、查看标题为 函数结构和调用约定的子章节。  熟悉这个分章节。  重点介绍标题为 被调用函数如何响应的部分。  它描述了在函数开始时堆栈会发生什么情况。  下一个屏幕截图来自这一小节。

    出于此帖子的目的、此图需要另一个方框。  称为它 SOE 寄存器 .  把它放在两者之间 以前的 RPC 值 本地帧 .  在注释块中、在每个函数之前看到的数字为:

    • 参数:本地参数块
    • Auto:本地帧
    • SOE:SOE 寄存器
    • FR 大小:上述三项的总和

    所有数字代表堆栈上16位字的数量。

    在您的特定情况下、重要的区别是 SOE 从0变为2。  这意味着在函数开头推入2个 SOE 寄存器、并在末尾弹出  这就是的总体变化 FR SIZE 从2到4。

    谢谢。此致、

    -George.

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

    您好、George:

    感谢您的回答、我还有两个问题、

    1.由于 TI F28335采用"字寻址"工作、我是否需要把堆栈大小计算成2倍?
    例如:我的堆栈是0x700 (十进制的1792)。 实际上、以字节为单位的实际大小是 1792/2=896  ?

    2.为了调试目的,我试图通过指针读取堆栈内的值,我想看看堆栈是否继续增长接近它的最大值
    我正在读取堆栈开始和结束位置附近的位置(在开始位置附近读取是为了完整性检查)。
    问题是、我在开始和结束时都可以看到恒定值

    我想知道这些地址是否会以某种方式受到保护。 而且我不能使用此方法进行调试。

    附加了我的代码片段和地图:


    Volatile Int16 * pstack1  =(int16*) 0x00000074C //正在打印至0X750 - 0x14 ==正在查找堆栈的最后20个字
    Volatile Int16 * pstack  =(int16*) 0x000000055 //正在打印至0X050 + 0x5 ==正在查找堆栈的起始位置(完整性检查)

          io_printf ("   \r\n 堆栈=%ul \r\n"、      *pstack);
          io_printf ("   \r\nstack1 =%ul \r\n"、     *pstack1)








    此致、
    Michael


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="420090" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1400305/tms320f28335-assembly-file-data-f28335-and-fr-size/5361222#5361222"]由于 TI soe 采用"字寻址"技术、我是否需要以系数2计算堆栈大小?

    C28x 上的地址对应于一个16位字。  每次在链接器映射文件、调试器等中看到地址、大小计数等时、情况都是如此 在极少数情况下、您可能需要将大小数字转换为8位字节计数。  为此、请乘以2。

    Unknown 说:
    为进行调试目的、我尝试读取栈内的值

    如果可以插入打印调用、则打印局部变量的地址。  使用类似于...的代码

    io_printf ("0x%lx\n"、(long)&local_variable);

    它不会显示 SP 的确切内容。  但它很接近。  请记住、打印调用本身可能会使用大量堆叠。

    谢谢。此致、

    -George.

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

    非常感谢 George!

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

    您好!

    要明确的是:  

    那么、如果我的堆栈大小为0x700、这意味着它是0x700字?
    每个地址对应2个字节?
     0x0000001到0x00000002之间是否有2个字节的区别?  

    谢谢!
    Michael

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="420090" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1400305/tms320f28335-assembly-file-data-soe -和-fr-size/5372742#5372742"]如果我的堆栈大小为0x700、这意味着它是0x700字?

    有。  当我想特别清除时、我说0x700 16位字。

    Unknown 说:
    每个地址对应于2个字节?

    我想您是指8位字节。  有。

    [报价 userid="420090" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1400305/tms320f28335-assembly-file-data-soe 和-fr-size/5372742#5372742"] 0x0000001和0x00000002之间有两个字节的区别?  [报价]

    区别在于2个8位字节。

    谢谢。此致、

    -George.

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

    再次感谢 George

    希望最后一个问题。 在 C28x 编译器手册 的哪一章中、我可以了解在触发中断时如何将数据保存到堆栈? (尤其是嵌套中断)


    例如:
    如果我有3个 具有时间顺序 优先级的中断 INT1、INT2和 INT3 (INT1最高优先级等)
    堆栈在发生嵌套中断时的行为是怎样的?

    非常感谢您的支持、
    Michael

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

    编译器手册未描述发生中断时栈会发生什么情况。  有关这些详细信息、请搜索 C28x CPU 手册 中标题为  CPU 中断和复位的章节。  如果这没有回答您的问题、那么我建议您创建新主题。  或者、如果您愿意、也可以让我将此线程的责任更改为 C28x CPU 专家。

    谢谢。此致、

    -George.

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

    非常感谢您的支持、

    我将打开新话题。

    此致、

    Michael