起因还是我开发环境的问题,而我又固执地要用纯GNU工具来搞(CCS慢且有问题,IAR曾经申请license都没用成功,不想折腾了),所以进展一再受阻。尽管在我通过CCS获得了 gdb_agent_console 所需要的 "board data file",可以脱离CCS直接支持 GDB 调试,而且能在 xp 系统下运行 gdb_agent_console 了,仍然存在问题。
在我装 win7 的 laptop 上,运行 gdb_agent_console 并用 gdb 连接它之后,在调试过程中(单步执行)可能会出现和板子连接的故障,需要CC1352复位,就没法继续调试了。于是我试在 xp 的电脑上用 TI Emupack 里面的 gdb_agent_console 来支持调试(缺的文件从CCS那里复制过来),是可以运行的,没有连接板子的故障。
CC13x2 的 SDK 代码是预先编译好,以二进制库形式被工程引用。我在用 GDB 进行跟踪的时候就遇到源文件找不到的错误,不能显示当前执行指令对应到C代码的什么地方(只有行号和文件名,也可以自己查),可能是TI编译库的环境下路径和我调试环境不同造成的,这个问题对 GDB 调试来说只是有些不方便罢了。
我之前用 GDB 调试发现了 SDK 版本不合适所以程序自锁,更换 SDK 解决问题之后,再继续跟踪执行过程,发现在执行到 main() 之前,会执行到 0x10000000 地址以后的代码——明显并非烧写的程序,应该是 ROM 中的程序了,虽然 CC1352 datasheet 没有说 ROM 地址范围。我想找找从哪里调用了 ROM 中的代码,重来一次调试,下断点,就遇到了问题。
不能设置断点?在 gdb_agent_console 这变的出错信息是:
看来调试器出了问题。我在网上搜索,没有找到解答。
不能用 GDB 下断点,每次都从头开始单步调试就很烦琐了。然后我又发现了,不仅是 GDB 的 b 命令不能用,单条语句执行的 n 命令、跳出函数的 finish 命令都不能用——想想也是可能,这些背后还是得靠断点功能吧。只有单条指令执行的 si 命令可以用,这也是我一开始就用的。
只能用单步执行指令调试,这样效率太低了,于是卡壳很久……
后来,我想想,会不会是软件的问题呢?我又在 win7 电脑上运行 gdb_agent_console 测试下 GDB 断点功能。尽管 "Unable to set/clear requested breakpoint" 信息还出现,后面 "Exception trying to set hwbp ..." 信息没有了,GDB也确实可以单条C语句执行!
我注意到 Emulation package 的版本是不一样的。于是我把那边 ccs_base 里相关的目录 copy 到 xp 电脑上,运行同样的 gdb_agent_console, 却照样是问题。莫非 XP 和 win7 差异?
我那 win7 的电脑也可以运行 xp, 于是我切换了系统,在 xp 下安装上 XDS110 的驱动之后,执行 CCS 目录里面的 gdb_agent_console,用 GDB 调试一下,的确不能用断点。这要么是 CCS 安装时在系统里还加了东西,要么是 emupack 对 XP 的支持就存在问题……
或许只能忍忍,用 win7 电脑来运行 gdb_agent_console, 用网络连接调试了。
提示信息里的 ctools 是个啥?我在 ccs_base\emulation\analysis\bin 目录下找到了名称含有 ctools 字样的 DLL, 干脆挪走,看程序报什么样的错。结果呢,居然 gdb_agent_console 正常启动,GDB 还能连上。关键的,b 命令居然成功了。我注意到,原来 gdb_agent_console 有一行提示信息
现在变成了
于是,把 ctools 功能给阻止掉,它就用驱动程序提供的硬件断点,好歹能使断点了。
此内容由EEWORLD论坛网友cruelfox原创,如需转载或用于商业用途需征得作者同意并注明出处
辛苦啦,不错的分享。