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:C28x 编译器/优化器适配错误:如果结构跨越页边界、则出现页错误

Guru**** 2482195 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/712078/compiler-tms320f28377s-c28x-compiler-optimizer-adressing-error-page-error-if-structure-crosses-page-boundary

器件型号:TMS320F28377S

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

您好!

我花了半天时间才发现以下问题:我尝试使用内联函数-O2集来初始化跨越 AMODE = 0页的结构。 结构从0x809c 开始、我要设置的元素为0x80c0 =页203、偏移量0。 编译器设置0x8080 =页202、偏移量0 (红色5.0)。

我希望 CCS 屏幕截图能为您提供足够的其他信息。

A

#pragma DATA_ALIGN (pctf、0x40);
/*位置控制器作为传递函数*/
tdf2tf     pctf;

提供了权变措施。

这是已知问题吗? 如果有请求、我认为我可以为您构建测试用例。

谢谢、

弗兰克

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

    虽然我不确定、但这似乎是编译器中的一个问题。  为了了解这种情况的发生、我需要一个测试用例、让我重现这种情况。  对于源文件 Duc_cla_init.c、请按照文章 How to Submit a Compiler Test Case中的说明提交测试用例。

    谢谢、此致、

    乔治

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

    您好 George (再次)、

    我希望您已收到通过邮件请求的 pp 文件。

    生成的 asm 文件中包含以下有趣的行:

    885       MOVW     DP,#_pctf+34         ;[CPU_U]

    897
       .dwpsn   文件"...\tdf2tfi.h"、第159行、第5列、is_stmt、ISA 0
           MOVL     @_pctf+34、acc.
    939
       .dwpsn   文件"...\tdf2tfi.h"、行160、列5、is_stmt、ISA 0
           MOVL     @_pctf+36、XAR6       ;[CPU_]|160|

    我(不)很幸运地发现了不太可能发生的情况、页面边框位于结构成员 ymin 和 ymax 之间。 此处再次显示生成 C 函数:

    静态内联
    无效
    tdf2tf_init_limits (struct tdf2tf * tf、float32_t ymin、float32_t ymax)


       tf->ymin = ymin;
       tf->ymax = ymax;

    编译器会在同一页中识别这两个页面、但实际上它们不是。

    如果您需要更多信息、请告诉我。

    谢谢、此致、

    弗兰克

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

    您的分析看起来正确。  遗憾的是、您忘记为我提供编译器构建选项。  请从 CCS 中的"Console"视图中复制并粘贴。

    谢谢、此致、

    乔治

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

    尊敬的乔治:

    可以在我的第一个帖子的屏幕截图中看到原始构建选项、我已相应地调整了控制台视图。

    抱歉、我没有为.pp -文件发布它们。 其中包括:

    ****为项目 Duc_firmware 构建配置 debug_ram ****

    "C:\\ti\\ccsv7\\utils\\bin\\gmake"-k Duc_cla_init.obj
    '生成文件:./Duc_cla_init.c'
    '调用:C2000编译器'
    "c:/ti/ccsv7/tools/compiler/ti-cgt-c2000_16.9.1.LTS/bin/cl2000 /workspace/firmware/duc/device_support/f2837xs/headers/include "-v28 -ml -mt --vcu_support=vcu2 -cla_support=cla1 -float_support=fpu32 -tmu_support=tmu0 -O2 -include_path="C:/ti/ccsv7/tools/compiler/ti-cgt-c2000_16.9.1.LTS/include /workspace/firmware/duc/driverlib/f2837xs/driverlib/inc -include_path="J:/workspace/firmware/duc/device_support/f2837xs/common/include -include_path="J:cn_support=tmu_suppress-proc-predic_sensort_intr-come"-proc-suppress-c_guide-compress-proc-ine_ine_guide-compress-ine_ine_ine_pensort_guide-ine_ine_ine_ine_guide-come"-c_sep-ine_ine_ine_ine_guide-ine_ine_guide-ine_ine_ine_ine_guide_  
    ".\tdf2tfi.h"、第122行(第25列):建议#2614-D:(性能)使用--fp_mode=relaxed 为 FP 除法启用 TMU 硬件支持。
    '完成的构建:./Duc_cla_init.c'
    '

    ****构建完成****

    除了 pp 选项之外、我没有看到任何差异。

    好的、您同意我到目前为止的分析。

    谢谢、此致、

    弗兰克

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

    感谢您发送测试案例。  我可以复制有问题的汇编代码。  现在、我更好地理解了所有内容、我可以看到这是一个已知问题。  您可以 在我的签名中使用下面的 SDOWP 链接查找 SDSCM00050582。  权变措施是定义.c 文件中 CLA 和 C28x 之间共享的所有数据、而不是.CLA 文件

    这一问题在相当一段时间前就报告过。  我不知道为什么没有解决这个问题。  我将对此进行研究。

    谢谢、此致、

    乔治

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

    尊敬的乔治:


    我访问了您建议的 SDSCM00050582页面。 遗憾的是、只有少数信息、即链接
    e2e.ti.com/.../355250.aspx
    损坏。

    我假设我必须执行类似的操作

    #pragma DATA_SECTION (pctf、             ".bss_cla");
    struct xxxx     pctf;

    在(例如) cla_data.c 文件中并使用 extern ... cla 文件中的 pctf 等。 我这样做了、结构(和向量)现在与页边界对齐、浪费了一些内存、这里是.map-file 中的条目:

    00008058    201 (00008040)    _cc_test_Ampl
    00008080    202 (00008080)    _pctf
    000080c0    203 (000080c0)    _cctf
    00008100    204 (00008100)    _MAF_STACD


    汇编器代码未更改、程序执行正确(与我的#pragma DATA_ALIGN (pctf、0x40)一样;建议)。
    当然、我进行了额外的检查:我在结构中插入了一个填充、这样成员 ymin 和 ymax 再次被放置在不同的页面中、实际上、编译器会插入一个额外的

           MOVW     DP,#_pctf+64         ;[cpu_u]


    其他一些问题:

    由于我根据请求设置了 Duc_cla_init.c 的预处理器选项、因此在项目视图中用一个小键对其进行了标记。 这意味着什么以及如何清除它("恢复默认选项"没有)?

    其他编译器版本也会受到影响吗? (不、我不热衷于编译器更新、只是很好地知道。)

    我再次访问了 F28377 TRM spruhx5e 和编译器手册 spru514p、没有任何关于此问题的提示、至少不是在一个突出的地方。 将来的版本是否会有?

    谢谢、此致

    弗兰克

    PS:我必须钦佩 TI 对其软件的乐观看法:在 SDSCM00050582中、严重性被归类为"输入"。 请考虑用户视图:他在程序中的任何位置添加/更改某些数据。 这可能会跨页边框移动其他数据、并且在软件以前运行良好的部分中的完全其他位置没有任何警告、错误会上升(在我的情况下、控制器仍然工作、但只在一个方向上工作)。 一种最难找到的错误 IMHO。
    TI 认为什么是"重大"?

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

    [引用 user="fmdhr">我假设我必须执行类似的操作

    #pragma DATA_SECTION (pctf、             ".bss_cla");
    struct xxxx     pctf;

    在(例如) cla_data.c 文件中并使用 extern ... cla 文件中的 pctf 等。[/quot]

    没错。   但是、请注意、pragma DATA_SECTION 是可选的。

    fmdhr 说:
    现在,结构(和向量)与页边界对齐,浪费了一些内存[/quot]

    要更好地理解这一点、请参阅 解释的 C2000 MCU 编译器中的数据分块一文

    [引用 user="fmdhr"]由于我根据请求设置了 Duc_cla_init.c 的预处理器选项、因此在项目视图中用一个小键进行标记。 这意味着什么以及如何清除它("恢复默认选项"没有)?

    请参阅 有关 CCS 工程管理和编译的文章中的"特定于文件的选项"部分

    [引用 user="fmdhr">其他编译器版本是否也会受到影响? (不、我不热衷于编译器更新、只是很好地知道。)

    是的。  所有 C28x 编译器都有此限制。

    [引用 user="fmdhr">请考虑用户视图:他在程序中的任何位置添加/更改某些数据。 这可能会跨页边框移动其他数据、并且在软件以前运行良好的部分中的完全其他位置没有任何警告、错误会上升(在我的情况下、控制器仍然工作、但只在一个方向上工作)。 一种最难找到的错误 IMHO。

    您可以得到有效的点。  我与编译器开发团队提出了类似的观点。

    谢谢、此致、

    乔治

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

    乔治

    感谢您的深入细致的帮助。 只需一句话:

    [引用用户="George mock"]

    [/报价]

    不,我不这么认为。 由于我希望这个控制器由 CPU 初始化、但是要由 CLA 执行的示例步骤、所以我必须将数据放置在.bss_cla 中、而不是.bss (默认段)中。 除了段放置的 GNU 样式版本之外、我没有其他方法可以这么做。

    谢谢、此致、

    弗兰克