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.

[参考译文] TMS320F28379D:如果将 trgm.g.c.obj 放入 ti.ramfuncs 或 BINIT、printf 将停止工作

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1199328/tms320f28379d-printf-stop-working-if-trgmsg-c-obj-is-put-into-ti-ramfuncs-or-binit

器件型号:TMS320F28379D
主题中讨论的其他器件:TMDSCNCD28379D

你(们)好

我正在尝试让 printf 使用 C I/O 向 CCS 发送调试消息(在本例中为 put())。

开箱即用也可以正常工作、但为了避免它保留我的两个硬件断点之一、我希望按照 使用 printf 的提示将其移动到 ram

如果我做一个简单的

`.text:CIO:{ rts*.lib (.text)}> RAMLS`

它在调试中仍然可以正常工作、但该程序只能从调试器运行、因为它依靠调试器用 CIO 代码填充分配的 RAM 部分。

因此我想将其添加到 ti.ramfuns 段中,以便通过调用 device_init()将代码复制到 ram 中。

但是、我在控制台中没有更多的输出。

我不知道为什么会这样。

-我已经验证了代码实际上是复制到 RAM 中的。

我也将主程序的函数放入了 ramfuncs 中,只是为了验证我是否可以在那里执行代码。

-我可以在调试器的内存视图中看到值被写入到_CIOBUF_

-我已经在映射文件中验证了 C$$IO$$和 C$EXIT 确实被放置在 RAM 中。

我随附的演示项目、请注意 CIO_inRAM.cmd 文件中的两条注释行

在打包版本中、printf 不起作用、其外观如下所示:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
// Make sure the CIO relevant part is put into memory, to not block one of the two HW breakpoints.
//.text:cio : { rts*.lib<trgmsg.c.obj exit.c.obj>(.text) } > RAMLS
//.TI.ramfunc : {}
.TI.ramfunc : { -l rts*.lib<trgmsg.c.obj exit.c.obj>(.text) }
LOAD = FLASH,
RUN = RAMLS,
LOAD_START(RamfuncsLoadStart),
LOAD_SIZE(RamfuncsLoadSize),
LOAD_END(RamfuncsLoadEnd),
RUN_START(RamfuncsRunStart),
RUN_SIZE(RamfuncsRunSize),
RUN_END(RamfuncsRunEnd),
ALIGN(8)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

如果您将其更改为

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
// Make sure the CIO relevant part is put into memory, to not block one of the two HW breakpoints.
.text:cio : { rts*.lib<trgmsg.c.obj exit.c.obj>(.text) } > RAMLS
.TI.ramfunc : {}
//.TI.ramfunc : { -l rts*.lib<trgmsg.c.obj exit.c.obj>(.text) }
LOAD = FLASH,
RUN = RAMLS,
LOAD_START(RamfuncsLoadStart),
LOAD_SIZE(RamfuncsLoadSize),
LOAD_END(RamfuncsLoadEnd),
RUN_START(RamfuncsRunStart),
RUN_SIZE(RamfuncsRunSize),
RUN_END(RamfuncsRunEnd),
ALIGN(8)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

它停止工作、具有上述限制。

我正在使用 TMDSCNCD28379D 控制板套件、并尝试使用 XDS110和 XDS200。 调试器。

我没有尝试过内置 XDS110V2、因为在最终必须运行的定制板上既不存在这种情况、也不存在可用的 UART。

Code Composer Studio 版本:12.2.0.00009

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

    我现在已经意识到、错误是我在复制时覆盖中断符号。

    我尝试使用 BINIT 表尽早将其放入

    Fullscreen
    1
    2
    3
    4
    .text:cio : { rts*.lib<trgmsg.c.obj exit.c.obj>(.text) }
    LOAD = FLASH,
    RUN = RAMLS,
    TABLE(BINIT)
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    但我仍然覆盖 estop0符号、如何纠正?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="172948" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1199328/tms320f28379d-printf-stop-working-if-trgmsg-c-obj-is-put-into-ti-ramfuncs/4521616 #4521616"]如何正确执行此操作?

    不支持。  这一限制没有记录,因为我认为没有人认识到。  事件的顺序为:

    1. CCS 在 C$$IO$$地址设置断点
    2. CCS 启动程序运行
    3. 从闪存复制到 RAM 会发生、这会覆盖 C$IO$$地址处的断点

    遗憾的是、无法中断或修改此序列。

    谢谢、此致、

    乔治

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

    所以" 使用 printf 的技巧"。 文档建议将其放入 RAM 中、但没有人真正尝试过它???

    是否无法保留/恢复这些断点?

    我可以在执行复制之前查看它们是否处于饱和状态、并避免覆盖它们。 但我假设调试器存储的原始值被 estop 操作码替换、在本例中为零或 ITRAP。

    是否无法访问此断点存储器、更新存储的值或仅删除并重新插入该断点存储器。无论是从脚本控制台还是在 GEL 文件中、都是自动触发还是通过菜单条目进行的?

    您要将其归档为错误吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="172948" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1199328/tms320f28379d-printf-stop-working-if-trgmsg-c-obj-is-put-into-ti-ramfuncs-or-binit/4522333 #452233"]因此请参阅" 使用 printf 的提示"。 文档建议将其放入 RAM 中、但没有人真正尝试过它????

    没有人尝试将 trgmsg.c.obj 中的函数分配给闪存进行加载、并分配 RAM 进行运行。  该文章中的建议假定这些函数以典型的方式分配、这意味着加载和运行的地址相同。

    [报价 userid="172948" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1199328/tms320f28379d-printf-stop-working-if-trgmsg-c-obj-is-put-into-ti-ramfuncs-or-binit/4522333 #452233"]是否无法访问此断点内存、更新存储的值或仅删除并重新插入该断点内存。无论是从脚本控制台还是在 GEL 文件中、都是自动触发还是通过菜单项进行的?

    没有人尝试过这样的东西。  我怀疑其中任何一个想法都是切实可行的。

    只需将这些函数分配给 RAM 即可。  例如...

    Fullscreen
    1
    2
    3
    4
    .text:cio :
    {
    rts*.lib<trgmsg.c.obj exit.c.obj>(.text)
    } > RAMLS
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    请注意、这会将已初始化的段.text:CIO 分配到 RAM。  它在您使用 CCS 加载程序时起作用。  如果没有 CCS 加载、这样的系统就无法以某种方式开始运行。  这并不重要、因为您还需要依靠 CCS 来处理 C$IO$$断点。

    谢谢、此致、

    乔治