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.

[参考译文] 编译器/TMS320VC5502:.cmd文件中的文本部分使用"ALIGN 16"

Guru**** 2526700 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/564743/compiler-tms320vc5502-use-of-align-16-for-text-section-in-cmd-file

部件号:TMS320VC5502

工具/软件:TI C/C++编译器

DSP C5502固件在执行1个逻辑时卡住(其中涉及多个功能)。
如果我们尝试通过在该逻辑中放置一些中断点(GPIO或打印逻辑)来识别问题,问题就会得到解决。
所以我们无法确定它被卡住的确切点。
通过为编写此逻辑的.text部分添加“align 16”也可以解决该问题。
请任何人指导我们对.text部分使用"align16 "时发生了什么情况。 为什么需要它?
这些详细信息写在文档中的何处(哪个SPRU/SPRa)?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对齐16将强制链接程序将该部分与16字节对齐的地址对齐。 即(地址% 16 == 0)。 就CPU而言,C55x的.text部分不一定需要以任何方式对齐。 我不知道为什么固件会有这样的要求。

    您能告诉我们更多有关固件卡住的信息吗? 它是否处于无限循环中? CPU是否崩溃或停止? 发生此故障时会发生什么情况?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    观察到调用1函数后,控件没有返回到调用函数。 因此PC失去链接,程序被卡住。
    Calling和Called函数都位于不同的文本部分。 当我将对齐16添加到这两个字段时,它就正常工作了。
    这两个函数都是用C.编写的库函数

    我在某处读到,如果RET指令位于奇数地址上,由于并行管道执行,它可能会在执行过程中产生问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Saurabh Shah1 说:
    我读到过这样的信息:如果RET指令位于奇数地址上,由于并行管道执行,它可能会在执行过程中产生问题。

    我不熟悉这个问题。 如果未对齐的RET指令可能导致错误执行,则这将是硅片异常,编译器需要处理此问题。  您是在哪里阅读的?

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

    Saurabh Shah1 说:
    当我将ALIGN 16添加到这两个字段时,其工作正常。[/QUOT]

    C55x文本分区根本不需要任何对齐。  即,CPU应该能够正确读取和执行.text部分的指令,而不管是否对齐。  是的,某些构造(如RPTBLOCAL和RPTB)可能会受到指令对齐的影响,但是您不需要对.text部分进行任何对齐就可以获得正确的执行。

    另一方面,对齐可能会影响提取管道的性能。  一些开发人员选择对齐.text部分,以避免由于汇编代码的微小更改而导致时间波动。  即使如此,就CPU而言,程序仍应正确执行。

    检查.stack和.sysstack是否都足够大,并且您没有溢出其中一个或另一个。  您在哪种堆栈模式下执行?  在执行程序的过程中,堆栈模式是否会改变?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    stack和.sysstack足够大,可以容纳函数深度。

    请参阅spraa46a.pdf中的"A.10 TMS320C6000"。 根据TI FAE,C55x系列可能会出现相同的问题。 但我没有找到任何相关的文档。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    A.10部分的大部分内容根本不适用于C55x。 请参阅特定于C55x的A.11节。

    确实,如果您的输入部分由于某种原因而对齐,它们之间可能会有孔,如A.10中所述, 但代码段(严格来说)就CPU而言不需要任何对齐,因此可能没有对齐的.text段,因此对齐间隙不会太多。 即使您已对齐了.text节,对齐间距也不会很大,因此您可以忽略C55x的A.10节。 这在C6000设备上更是一个问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否有任何功能手动编码组件? 检查调用栈中的函数,以及最近调用的任何手动编码汇编函数。

    您在哪种堆栈模式下执行? 在执行程序的过程中,堆栈模式是否会改变?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们在计划中没有手动编码的功能。 但是我们使用的是第三方的库,所以不能评论。

    堆栈模式- 16位快速返回(USE_RETA)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    archaeologist 说:
    我读到,如果RET指令位于奇数地址,由于并行管道执行,它可能会在执行期间产生问题。

    您是否能够回忆起您在何处找到此信息?

    您使用的是哪个版本的编译器?  (与CCS版本不同)。

    您是否将适当的CPU版本标志传递给编译器,以便它可以检查所有已知的硅异常?

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

    archeologist 说:
    您是否记得在哪里找到了此信息?[/QUOT]

    您使用的编译器版本是什么?  (与CCS版本不同)。[/QUOT]

    代码生成工具-   3.2 2.

    archaeologist 说:
    您是否要将适当的CPU版本标志传递给编译器,以便它可以检查所有已知的硅异常?[/QUOT]

    是的。

    自定义目标(-v):5502.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是一个相当老的版本,所以它可能没有所有的硅异常检测检查。

    您应至少升级到修补程序版本3.2 .3。 您应该考虑升级到4.4 .1。

    在调用或返回站点上出现此类问题通常是由堆栈损坏(通常由缓冲区溢出或杂散指针访问引起)或堆栈未正确恢复(通常由手动编码组合中的错误引起)引起的。 由于C55x使用RETA寄存器,您在损坏后不会立即看到症状;您通常不会看到问题,除非您尝试返回到出现问题的功能的祖父母。 但是,我在这条线中没有看到任何东西让我相信这是正在发生的事情。

    除此之外,我没有想法。 我找不到任何相关的硅例外;但是,可能还有一个我不知道的例外。 据我所知,对齐.text (或仅RET)不是CPU所必需的。 如果固件中有一些要求(我完全不熟悉),我不知道从哪里开始查找要求。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我尝试使用编译器版本4.2 .3。 工作正常。