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.

[参考译文] TMS320F28375D:为什么在函数中将参数 1 定义为 32 个字节后仅引用低 16 个字节?

Guru**** 2791275 points

Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1591224/tms320f28375d-why-was-only-the-lower-16-bytes-referenced-after-defining-argument-1-as-32-bytes-in-a-function

器件型号: TMS320F28375D
主题: C2000WARE 中讨论的其他器件

大家好!

在该函数中、参数 1 定义为 32 个字节、但在函数调用后、仅引用参数 1 的低 16 个字节。
更改参数 1 和 2 的顺序后、参考寄存器变成了支持 32 个字节的寄存器、并且可以访问正确的值。

image.png

image.png

为什么初始实参设置导致一个只能引用低 16 个字节的寄存器?

此致、

ITO

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

    源文件的返回路径 闪存擦除 、 请按照 如何提交编译器测试用例一文中的说明进行操作。

    谢谢。此致、

    -乔治

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

    您好、George、

    感谢您的答复。

    很抱歉耽误了回复。
    我将通过私人消息共享编译器信息(构建版本和构建日志)。
    如果内容中缺少任何内容、请告知我。

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

    您好、George、

    我通过私人消息发送了一个.pp 文件。

    此致、

    ITO

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

    感谢您的测试用例。  我在编译器生成的汇编指令中没有看到任何问题。  运行代码时、它是否按照您期望的方式运行?   

    我确实看到编译器为 CCS 生成的 Dwarf 调试信息中有一个问题、该问题会显示在变量的 CCS 显示中  地址、  同时对整个系统的执行没有影响。  您同意吗?

    谢谢。此致、

    -乔治

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

    您好、George、

    感谢您的答复。

    已成功验证这些参数、未出现任何问题。
    但是、Flash_Erase在最近添加的函数中调用函数时、会出现电流现象setOtaBoot
    我还创建了.pp包含此函数的相应文件、您能回顾一下吗?

    result = Flash_Erase(OTA_BOOT_ADDR, Bzero_16KSector_u32length);
    根据上述参数顺序、OTA_BOOT_ADDR无法访问的高 16 字节。 
    result = Flash_Erase(Bzero_16KSector_u32length, OTA_BOOT_ADDR);
    →如果反转参数顺序、则可以访问 32 个字节。 

    此致、

    ITO

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我还创建了.pp包含此函数的相应文件、您能查看吗?

    不幸的是,论坛的私人消息部分今天不起作用。  我无法下载 .pp 添加到工程。  我将在星期一上重试。

    谢谢。此致、

    -乔治

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

    长话短说、我下载了 .pp 文件。  它不包含对函数的调用 Flash_Erase 。  我想您发送了错误的文件。

    下次、请在附加文件之前将其压缩。

    谢谢。此致、

    -乔治

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

    您好、George、

    由于某种原因、我无法访问您的私人邮件、因此我将在此处发送 zip 文件。 下载后、您能否删除此回复?

    board.falsh.c 是有问题的代码。

    最好的摄政

    ITO

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

    感谢您提供预处理的文件。  我离开了你的前一篇文章,但删除了附件。

    但是、在Flash_Erase最近添加的函数中调用函数时、会出现当前现象setOtaBoot
    我还创建了.pp包含此函数的相应文件、您能查看吗?

    审核通过后、我继续发现编译器生成的汇编代码没有问题。  运行代码时、它是否按预期运行?  现在、请忽略 CCS 仅显示函数参数的低 16 位的方式 存储器地址

    谢谢。此致、

    -乔治

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

    您好、George、

    感谢你的帮助。

    关于发生问题的函数参数:由于它引用了闪存区域中的一个地址、
    需要 32‑位寻址。 如果仅使用低 16 位、它最终将引用与预期地址不同的地址。

    您能否从汇编代码以外的角度分享您的想法?

    此致、

    ITO

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

    伊图 — 桑,

    请注意,由于当地的假日季节,许多人目前都不在办公室。 因此、响应将被延迟。

    谢谢你

    Ki

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

    您好、George、

    总之、汇编器输出正确、运行时行为符合预期。 但是、根据 CCS 中显示的调试信息 (DWARF)、似乎没有引用高 16 位、这是不正确的。

    如果此信息正确、则其他因素可能会阻止闪存擦除成功。 函数通常放在 RAM 中、
    我们在将它们重定位到闪存以进行调试后测试了该行为、并观察到:

    1. 我们确认正常执行流程至flashErase()
    2. 调用时Fapi_setActiveFlashBank(),执行跳转到 0x3FE493 并停止。

    您能否分享您对这种行为的潜在根本原因的看法?

    (我们还确认,即使将二进制文件编程到 DSP 并执行,也不会执行闪存擦除。)

    此致、

    ITO

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

    嗨、ki-san、

    没问题。 我期待明年再次与您合作。
    此致、
    ITO
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    总之、汇编器输出正确、运行时行为符合预期。 但是、根据 CCS 中显示的调试信息 (DWARF)、似乎(不正确)没有引用高 16 位。

    更准确的说法是 CCS 不显示由编译器生成的汇编指令正确计算的高 16 位。

    如果此信息正确

    好了。

    [引述 userid=“584182" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1591224/tms320f28375d-why-was-only-the-lower-16-bytes-referenced-after-defining-argument-1-as-32-bytes-in-a-function/6170850

    则其他因素可能会阻止闪存擦除成功。 函数通常放在 RAM 中、
    我们在将它们重定位到闪存以进行调试后测试了该行为、并观察到:

    1. 我们确认正常执行流程至flashErase()
    2. 调用时Fapi_setActiveFlashBank(),执行跳转到 0x3FE493 并停止。

    您能否分享您对这种行为的潜在根本原因的看法?

    [/报价]

    不幸的是、我的专业知识之外还有一个答复。  此主题的责任已由相关专家承担。  请注意、由于美国的假日、回复会延迟。

    谢谢。此致、

    -乔治

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

    您好:

    调用时Fapi_setActiveFlashBank()、执行跳转到 0x3FE493 并停止。

    闪存 API 函数必须从 RAM 运行。 这是因为闪存控制器无法同时读取和写入闪存存储体。 从 RAM 运行时、该函数是否成功执行?

    此致、

    Alex

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

    您好 Alex、

    感谢你的帮助。

    即使调用 Fapi_setActiveFlashBank () 的函数 flashErase () 位于“.TI.ramfunc"部分“部分、
    我们观察到相同的行为:执行分支到 0x3FE493、然后停止。

    但是、运行参考基础软件时也观察到了相同的现象、
    在这种情况下、闪存已成功更新、如下所示(操作之后执行复位)。
    (运行基础软件后刷写内容)

    在当前软件中、不会发生闪存更新。
    因此、我们怀疑在闪存擦除操作期间触发了复位。
    (运行当前软件后刷写内容)

    此致、

    ITO

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

    您好:

    但是、在运行参考基础软件时也观察到了同样的现象、
    在这种情况下、闪存已成功更新、如下所示(在操作之后执行复位)。

    您的意思是“基础软件“是指闪存编程示例吗? 当您看到相同的现象时、您是指基本软件也会导致复位? 在屏幕截图中、使用基本示例时、似乎可以对其进行编程/擦除。

    执行停止后、RESC(复位原因)和 FMSTAT(闪存模块状态)寄存器的值是多少?

    您是否能够提供链接器文件?

    此致、

    Alex

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

    您好 Alex、

    由“base software“您是指闪存编程示例吗? [/报价]

    是的、是这样。

    当您说您观察到同样的现象时、您意味着基础软件也会导致重置?

    此复位是预期行为、因为复位过程是在闪存操作后执行的。

    在执行停止后、RESC(复位原因)和 FMSTAT(闪存模块状态)寄存器的值是多少?

    关于 WDRSn、在启动前已将其设置为 1。
    与闪存操作之前相比、未观察到寄存器值发生变化。
    如果操作中有任何错误、请告知我们。
    此致、
    ITO
    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Alex、

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

    您好、Ito、

    根据您的映射文件、包装程序函数放在 RAM 中似乎并不是实际的闪存 API 库。 您能否尝试修改.TI.ramfunc 定义以显式将整个库放入.TI.ramfunc 中? 示例如下:

    #ifdef __TI_COMPILER_VERSION__
        #if __TI_COMPILER_VERSION__ >= 15009000
            GROUP
            {
                .TI.ramfunc
                { -l F021_API_F2837xD_FPU32.lib}
             
            } LOAD = FLASHD,
              RUN  = RAMLS03, 
              LOAD_START(_RamfuncsLoadStart),
              LOAD_SIZE(_RamfuncsLoadSize),
              LOAD_END(_RamfuncsLoadEnd),
              RUN_START(_RamfuncsRunStart),
              RUN_SIZE(_RamfuncsRunSize),
              RUN_END(_RamfuncsRunEnd),
              PAGE = 0    
        #else
            GROUP
            {
                ramfuncs
                { -l F021_API_F2837xD_FPU32.lib}
             
            } LOAD = FLASHD,
              RUN  = RAMLS03, 
              LOAD_START(_RamfuncsLoadStart),
              LOAD_SIZE(_RamfuncsLoadSize),
              LOAD_END(_RamfuncsLoadEnd),
              RUN_START(_RamfuncsRunStart),
              RUN_SIZE(_RamfuncsRunSize),
              RUN_END(_RamfuncsRunEnd),
              PAGE = 0    
        #endif
    #endif

    此致、

    Alex

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

    您好 Alex、

    我会将其放在.TI.ramfunc该部分中。

    我还有一个问题。
    在闪存编程示例中、库函数未显式放入 RAM 中。
    您知道为什么样品即使不放置也能正常工作吗?
    请参阅随附的链接器命令文件“2837xD_flash_lnk_cpu1_BOOT"。“。

    e2e.ti.com/.../2837xD_5F00_FLASH_5F00_lnk_5F00_cpu1_5F00_boot.txt

    此外、虽然样品可以成功擦除闪存、
    进行少量修改(注释掉某个函数)后、闪存擦除停止工作。
    您能否分享一下您的想法、看看此问题是否由存储器地址位置的差异引起?

    此致、

    ITO

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

    您好、Ito、

    您知道为什么即使不进行此类放置、示例也能正常工作吗?

    您是指闪存编程示例吗? 此示例使用 SDK 中的自定义链接器文件将闪存 API 正确放入 RAM 中。 您可以在 c2000ware/device_support/f2837xd/examples/dual/flash_programming/cpu01/flash_programming_cpu1_flash.cmd 中找到它。

    您能否谈谈此问题是否可能由内存地址放置的差异引起?

    注释掉 Device_enableAllPeripherals 调用不会对存储器放置产生影响。 省略此调用可能会跳过一些所需的配置。

    此致、

    Alex

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

    您好 Alex、

    通过将整个 API 库放置在.TI.ramfunc 段中、我们已经开始看到解决方案的迹象。

    我们当前正在闪存操作函数“setOtaBoot"之前“之前执行 memcpy、并且我们正在验证将所有所需函数存储在 RAM 中的过程。

    您能否告知我们是否可以将整个 API 库放入.TI.ramfunc 段中?

    e2e.ti.com/.../2837xD_5F00_FLASH_5F00_lnk_5F00_cpu1_5F00_repro.txte2e.ti.com/.../pcs_5F00_cpu1_5F00_repro.map.txt

    此致、

    ITO

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

    您好、Ito、

    是的、这是可能的。 您可以在 C2000Ware SDK 中参阅此链接器文件: c2000ware/device_support/f2837xd/examples/dual/flash_programming/cpu1/flash_programming_cpu1_flash.cmd。

    此致、

    Alex