Other Parts Discussed in Thread: C2000WARE
器件型号: TMS320F28375D
主题: C2000WARE 中讨论的其他器件
大家好!
在该函数中、参数 1 定义为 32 个字节、但在函数调用后、仅引用参数 1 的低 16 个字节。
更改参数 1 和 2 的顺序后、参考寄存器变成了支持 32 个字节的寄存器、并且可以访问正确的值。


为什么初始实参设置导致一个只能引用低 16 个字节的寄存器?
此致、
ITO
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.
Other Parts Discussed in Thread: C2000WARE
器件型号: TMS320F28375D
主题: C2000WARE 中讨论的其他器件
大家好!
在该函数中、参数 1 定义为 32 个字节、但在函数调用后、仅引用参数 1 的低 16 个字节。
更改参数 1 和 2 的顺序后、参考寄存器变成了支持 32 个字节的寄存器、并且可以访问正确的值。


为什么初始实参设置导致一个只能引用低 16 个字节的寄存器?
此致、
ITO
源文件的返回路径 闪存擦除 、 请按照 如何提交编译器测试用例一文中的说明进行操作。
谢谢。此致、
-乔治
您好、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
感谢您提供预处理的文件。 我离开了你的前一篇文章,但删除了附件。
但是、在Flash_Erase最近添加的函数中调用函数时、会出现当前现象setOtaBoot。
我还创建了.pp包含此函数的相应文件、您能查看吗?
审核通过后、我继续发现编译器生成的汇编代码没有问题。 运行代码时、它是否按预期运行? 现在、请忽略 CCS 仅显示函数参数的低 16 位的方式 存储器地址 。
谢谢。此致、
-乔治
您好、George、
总之、汇编器输出正确、运行时行为符合预期。 但是、根据 CCS 中显示的调试信息 (DWARF)、似乎没有引用高 16 位、这是不正确的。
如果此信息正确、则其他因素可能会阻止闪存擦除成功。 函数通常放在 RAM 中、
我们在将它们重定位到闪存以进行调试后测试了该行为、并观察到:
flashErase()。 Fapi_setActiveFlashBank(),执行跳转到 0x3FE493 并停止。 您能否分享您对这种行为的潜在根本原因的看法?
(我们还确认,即使将二进制文件编程到 DSP 并执行,也不会执行闪存擦除。)
此致、
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 中、
我们在将它们重定位到闪存以进行调试后测试了该行为、并观察到:
flashErase()。 Fapi_setActiveFlashBank(),执行跳转到 0x3FE493 并停止。 您能否分享您对这种行为的潜在根本原因的看法?
[/报价]不幸的是、我的专业知识之外还有一个答复。 此主题的责任已由相关专家承担。 请注意、由于美国的假日、回复会延迟。
谢谢。此致、
-乔治
您好 Alex、
感谢你的帮助。
即使调用 Fapi_setActiveFlashBank () 的函数 flashErase () 位于“.TI.ramfunc"部分“部分、
我们观察到相同的行为:执行分支到 0x3FE493、然后停止。
但是、运行参考基础软件时也观察到了相同的现象、
在这种情况下、闪存已成功更新、如下所示(操作之后执行复位)。
(运行基础软件后刷写内容)

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

此致、
ITO
您好:
但是、在运行参考基础软件时也观察到了同样的现象、
在这种情况下、闪存已成功更新、如下所示(在操作之后执行复位)。
您的意思是“基础软件“是指闪存编程示例吗? 当您看到相同的现象时、您是指基本软件也会导致复位? 在屏幕截图中、使用基本示例时、似乎可以对其进行编程/擦除。
执行停止后、RESC(复位原因)和 FMSTAT(闪存模块状态)寄存器的值是多少?
您是否能够提供链接器文件?
此致、
Alex
您好 Alex、
由“base software“您是指闪存编程示例吗? [/报价]是的、是这样。
当您说您观察到同样的现象时、您意味着基础软件也会导致重置?此复位是预期行为、因为复位过程是在闪存操作后执行的。
在执行停止后、RESC(复位原因)和 FMSTAT(闪存模块状态)寄存器的值是多少?
关于 WDRSn、在启动前已将其设置为 1。
与闪存操作之前相比、未观察到寄存器值发生变化。
如果操作中有任何错误、请告知我们。此致、ITO[/quote]
您好 Alex、
您好、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
此外、虽然样品可以成功擦除闪存、
进行少量修改(注释掉某个函数)后、闪存擦除停止工作。
您能否分享一下您的想法、看看此问题是否由存储器地址位置的差异引起?
这些函数通常是不同的 Device_enableAllPeripheralsDevice_init
→请参阅映射文件“pcs_cpu1_boot_peri.map"</s>“
Device_enableAllPeripherals在中注释掉后 Device_init
→请参阅映射文件“pcs_cpu1_boot_ng.map"</s>“
此致、
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