本帖最后由 LIAOYUANGANG 于 2021-8-18 19:24 编辑
STM32F743内集成有ETF单元(嵌入式跟踪FIFO),可以使用jlink进行简配版的指令追踪(和ETB追踪方法类似) 而不必使用昂贵的jtrace进行指令追踪(jtrace可以使用ETM(嵌入式跟踪宏单元)而jlink不行)
本教程使用v7开发板及配套的出厂程序进行演示,配合segger公司的ozone软件进行调试。当然keil也是可以配置使用指令追踪的,但是体验不如ozone好,配置方法在文末有简单描述。
测试环境如图所示。
我使用的是淘宝某D版jlink pro,但是普通jlink也是支持的,jlink pro和普通版的区别主要在于速度。
我没有测试过普通jlink的追踪效果,但是猜测可能会丢数据?
此外,教程中有用到SEEGER Embedded Studio和ozone软件,都是SEGGER官方的免费软件
首先讲解SEEGER Embedded Studio导入keil工程进行编译的过程 对此部分不感兴趣的朋友可以直接跳到后面讲解ozone的地方。
首先解压出厂例程
修改文件名,使得工程路径不要有中文(很重要)
打开SEEGER Embedded Studio for ARM并导入前文的keil工程,这里我使用的版本是V5.60,使用此软件生成便于ozone调试的可执行文件。 当然,ozone也可以直接导入keil生成的axf文件进行调试,这里我主要想讲一下SEEGER导入keil工程的方法
选择工程文件
选择使用ARMCC作为构建工具
然后编译,速度飞起,感觉比keil快一些,31秒编译完成,不知道是不是有什么黑魔法
出了一点小问题,需要修改一下链接脚本的路径,不知道是不是bug
在打开的工程上右击,选择打开工程配置文件
搜索sct
改成如下路径
另外还需要修改一个地方,SEGGER默认使用自己的启动文件进行编译,我们需要改成自己工程中使用的(否则我在调试的时候一运行就进入hardfault了) 把Yes改成No,这里是说把这个文件排除在编译之外
修改好之后保存并再次编译,提示说有个警告,hex不存在,我们把工程配置里的指令删掉就好了
再次编译,没有问题,可以看到空间占用情况
到这一步就可以进行调试了,可以使用SEGGER Embedded Studio进行调试,也可以使用orzone进行调试。
接下来讲解使用ozone进行指令追踪的配置方法
首先用orzone打开刚才编译完成的工程,这里的步骤其实是导入elf文件到ozone中,因此,也可以直接导入keil编译生成的axf文件
导入完成后如图所示,当然,根据每个人使用情况的不同,界面也会有一点区别
前面讲了STM32F743有一个ETF(嵌入式跟踪FIFO),想要在调试期间使用它进行追踪指令,需要在进入调试的时候将ETF相关的寄存器配置好,这里就需要配置相关脚本,让ozone在进入调试时能够初始化好ETF
可以找到SEGGER提供了一个使用ETB方法进行追踪的示例工程
这个工程里面有一个非常重要的脚本文件,用于在进入调试时初始化ETF(SEGGER并没有公开这个脚本的具体内容)
然后,我们需要将这个脚本文件添加进ozone的工程里面
首先保存ozone工程
将刚才提到的脚本.pex文件放到和ozone工程同一目录下
然后编辑ozone工程配置文件
找到BeforeTargetConnect这一行
然后配置jlink设置和指令追踪设置
速率尽可能选能达到的最高速率
trace选trace buffer,这个将会用到ETF的功能
配置好系统时钟
配置完成之后就可以仿真使用指令trace功能了
首先打开trace窗口
此时还未进入仿真,窗口显示无数据
下面我们点击进入仿真
可以看到程序停止在了main函数第一行,同时指令追踪窗口也显示了最近执行到main函数的部分指令(因为ETF缓存有限,无法做到追踪所有指令)
更一般地,可以在下一个函数打一个断点,并清除指令追踪显示的内容,然后全速运行查看期间执行的代码
如果打开了时间线功能,还能看到函数执行关系
以上就是jlink使用ozone进行指令追踪的配置部分的内容了,ozone的调试功能还是很强大的,感兴趣的可以多了解一下
keil进行指令追踪的配置也是类似的
先在仿真设置中配置好ETB追踪方式,然后配置好加载脚本,最后进入仿真打开指令追踪窗口就可以看到追踪到的指令了
|