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.
你(们)好
我正在尝试让 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 不起作用、其外观如下所示:
// 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)
如果您将其更改为
// 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)
它停止工作、具有上述限制。
我正在使用 TMDSCNCD28379D 控制板套件、并尝试使用 XDS110和 XDS200。 调试器。
我没有尝试过内置 XDS110V2、因为在最终必须运行的定制板上既不存在这种情况、也不存在可用的 UART。
Code Composer Studio 版本:12.2.0.00009
我现在已经意识到、错误是我在复制时覆盖中断符号。
我尝试使用 BINIT 表尽早将其放入
.text:cio : { rts*.lib<trgmsg.c.obj exit.c.obj>(.text) } LOAD = FLASH, RUN = RAMLS, TABLE(BINIT)
但我仍然覆盖 estop0符号、如何纠正?
不支持。 这一限制没有记录,因为我认为没有人认识到。 事件的顺序为:
遗憾的是、无法中断或修改此序列。
谢谢、此致、
乔治
所以" 使用 printf 的技巧"。 文档建议将其放入 RAM 中、但没有人真正尝试过它???
是否无法保留/恢复这些断点?
我可以在执行复制之前查看它们是否处于饱和状态、并避免覆盖它们。 但我假设调试器存储的原始值被 estop 操作码替换、在本例中为零或 ITRAP。
是否无法访问此断点存储器、更新存储的值或仅删除并重新插入该断点存储器。无论是从脚本控制台还是在 GEL 文件中、都是自动触发还是通过菜单条目进行的?
您要将其归档为错误吗?
没有人尝试将 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 即可。 例如...
.text:cio : { rts*.lib<trgmsg.c.obj exit.c.obj>(.text) } > RAMLS
请注意、这会将已初始化的段.text:CIO 分配到 RAM。 它在您使用 CCS 加载程序时起作用。 如果没有 CCS 加载、这样的系统就无法以某种方式开始运行。 这并不重要、因为您还需要依靠 CCS 来处理 C$IO$$断点。
谢谢、此致、
乔治