在对多核心芯片进行调试的时候,调试人员不能简单地认为只要连上一个内核再点击运行就可以了;调试人员首先需要明确当前芯片到底是使用的SMP模式、AMP模式,还是混合多核心的办法在运行;如果调试人员把模式选错了,在后续的过程中,就容易碰到某个内核停下来了而另一个内核还在继续跑的现象,或者断点明明被触发了,但是窗口里面显示出来的却不是调试人员想要看的那个目标核心。
一、TRACE32多核调试怎么启动
在多核心调试工作刚开始的时候,作者建议大家应该先把各个核心之间的逻辑关系搞清楚;SMP模式通常是指好几个相同的核心在跑同一个系统,而AMP模式则多见于好几个核心各自运行各自的程序或者系统;调试器对SMP、AMP以及iAMP等多种多核心调试办法都是支持的,如果使用SMP模式,调试人员可以在同一个软件界面里面看到好几个核心,如果是AMP的场景,调试人员通常就需要打开好几个相互同步的软件窗口了。
1、先确定是SMP还是AMP
(1)如果好几个核心都是被同一套操作系统来管理的,比如Cortex-A多核Linux,或者是相同的实时操作系统SMP,那么大家一般可以按照SMP的办法去处理。在这种情况之下,调试人员在一个软件窗口里面就可以把核心的视角切换来切换去,并且运行和停止的操作通常也都是放在一起控制的。
(2)如果不同的核心跑的是不一样的程序,比如让一个Cortex-A去跑Linux,让一个Cortex-R去处理实时性的任务,再让另外一个M核去负责安全方面的监控,这就更像是AMP模式了。在AMP模式里面,每一个核心往往都拥有属于它自己的符号文件、地址空间、启动先后顺序以及断点策略,所以调试人员不能硬生生地去套用单窗口SMP的办法;调试器的AMP模式可以把好几个软件窗口塞进同一个多核调试系统里面,从而把核心或者集群的启动与停止同步起来。
2、SMP多核开启的通用步骤
在SMP的场景下,调试人员通常需要先把目标芯片、调试接口、复位办法以及符号加载的配置都做完,然后才可以把调试启动起来;因为不同的芯片所使用的指令存在差别,所以在实际做项目的时候,大家最好是从软件安装目录里面的对应芯片示例脚本里去修改,尽量不要自己从头手写。
3、AMP多核开启的通用步骤
AMP的场景一般需要调试人员为不一样的核心准备好不一样的调试器窗口;比如给0号核心弄一个窗口,给1号核心也弄一个窗口,让它们各自把各自的ELF文件加载进去,各自把各自的断点设置好,之后再利用InterCom、T32Start或者TargetSystem.NewInstance等功能把这些窗口串联起来;在官方的支持社区里也有人提到过,调试人员可以通过对InterCom参数进行配置来把多个窗口打开,也可以使用TargetSystem.NewInstance或者T32Start来把多窗口启动的事情处理好。
二、TRACE32多核同步停机失败怎么排查
多核心同步停止到底正常不正常,调试人员不能只盯着一个代码窗口看;大家需要把核心的状态、PC地址、断点列表以及当前选中的核心结合在一起同时观察;在调试器里面,“当前被选中的核心”和“真正把断点触发的核心”是两个非常容易让人搞混的概念。
1、看运行和停止是不是在对整个SMP组起作用
在SMP系统里面,运行指令会把所有的核心都启动起来,停止指令也会把所有的核心都停下来;当某一个核心把断点触发的时候,调试器通常会自动把这个触发了断点的核心变成当前选中的核心,不过这种表现并不是所有的处理器架构都能支持的。
2、不要把CORE.select当成是控制单个核心的指令
CORE.select这个指令最主要的作用,其实是把当前窗口的观察视角给切换一下;在官方的SMP培训材料里面也能看到,当前被选中的核心会把默认显示的内容给影响到,如果调试人员想看其他的核心,可以使用/CORE这个选项,就比如Register.view/CORE 1或者List/CORE 1。
3、看断点有没有被提前设置在正确的内核上
在多核心调试的工作中,断点应该被尽量提前设置好;特别是在一个核心去释放另一个核心、引导程序把从核拉起来、或者是主核向应用核进行跳转这些场景里面,如果调试人员等到核心都已经跑过去了才去切换窗口下断点,那就非常容易把入口给错过去。
三、调试器多核同步停止失败如何检查
当同步停止失败的时候,调试人员千万不要只是反复地去点击停止按钮;正确的做法应该是先把调试的模式确认好,再去确认核心是不是真的被调试器给接管了,接着还要去对断点、复位、供电时钟以及多窗口的同步进行检查。
1、检查SMP和AMP模式有没有被选错
如果调试人员本来是希望0号核心和1号核心能够分别去运行、分别去停止、分别去进行单步调试的,但是当前的配置却被设成了SMP,那么这种操作逻辑本身就是相互冲突的;因为SMP更适合用来进行统一的运行和统一的停止;只有AMP才适合对不同的核心分别去控制。
2、检查从核有没有被释放并且进入到可以调试的状态
有一些芯片在启动之后,只有主核是活着的,而从核还被卡在复位、挂起、掉电、时钟关闭或者是安全域隔离的状态里面;在这种时候,调试器虽然也许可以把核心的名字看到,但是却无法真正地去控制它;表现出来的现象就是主核可以被停下来,但是从核却一点反应也没有,或者是从核的寄存器读出来的数据不对劲。
3、检查多窗口同步以及硬件方面的资源
在AMP多窗口的模式下,同步停止的功能需要依赖窗口彼此之间的通信以及硬件自身的调试资源;调试人员需要去检查每一个软件窗口的InterCom名称、端口以及核心编号是不是发生了冲突,同时也要确认没有出现两个窗口同时去抢夺同一个核心的情况。
除此之外,执照和硬件的能力也是需要被注意的;在调试器的SMP培训材料里有写到,SMP调试通常需要调试人员拥有多核调试的授权执照,只有少数架构可以例外;而且多核芯片能够提供的片上断点数量、在运行的时候进行内存访问等能力,也会因为芯片的不同而产生改变。
总结
调试器多核联动怎么开启,以及调试器多核同步停止失败如何检查,这里面的核心关键就是先把SMP和AMP给分清楚;SMP模式适合用一个软件界面去管理相同的多个核心,运行和停止的指令在大多数情况下都会把整个核心组放在一起控制;而AMP模式则更适合用在好几个核心独立运行、符号各自独立、启动也是各自独立的地方,这需要好几个软件窗口相互配合来完成同步;当同步停止失败的时候,调试人员需要重点去检查调试模式有没有被选错、从核有没有被释放掉,以及芯片本身的多核调试资源到底能不能满足使用的要求。