在调试那些跑着实时操作系统的程序时,光盯着寄存器和函数调用往往是不够的,我们还得弄清楚当前是哪个任务在跑、任务处在什么等待状态、它的优先级是多少,以及栈空间的使用情况。TRACE32的OS Awareness功能要怎么开启,如果任务列表显示不全又该怎么办,处理这些问题的时候,首先要确认操作系统的类型,然后再加载对应的扩展文件。根据TRACE32通用命令的参考说明,OS Awareness是由TASK.CONFIG来配置的,这个命令会载入与内核相关的各种信息;不同的操作系统,它们所支持的资源窗口还有命令也是有所区别的。
一、TRACE32 OS Awareness怎么开启
想要把TRACE32的OS Awareness功能打开,在动手之前,得先正常地连接好目标板,并且把带有调试符号的程序文件加载进去。要是你只是把可执行文件下载到了板子上,却没有加载相应的符号表,那么任务列表一般是没办法被正确解析出来的。
1、确认操作系统的类型
第一步,先要确认目标板上跑的是FreeRTOS、embOS、Linux、OSEK,还是其他别的实时操作系统。TRACE32的安装目录里头,通常会带有对应系统的示例,我们可以到类似“~/demo/<处理器>/kernel/<操作系统>”这样的路径下面,去查看相关的配置文件以及示例脚本。
2、加载程序的符号表
按照平时调试的流程,先把CPU连接上,然后把ELF或者AXF格式的文件加载进来。OS Awareness这个功能想要正常工作,是需要访问到内核符号和内部数据结构的,部分官方的文档里头也明确提到了,在使用的过程中,符号表要保持可以被访问到的状态才行。
3、执行TASK.CONFIG命令
接着,在命令行里面敲入对应的配置命令。拿FreeRTOS的环境来举例,你就可以直接执行“TASK.CONFIG freertos”。如果用的是别的系统,就把freertos这个名字替换成对应的名称就是了。另外,要是你手里有官方的示例脚本,也可以直接用DO命令去运行那个配置脚本。
4、加载系统菜单
有一部分操作系统还会提供专用的菜单文件,这个时候,可以执行类似“MENU.ReProgram<操作系统名称>”这样的命令。以OS21系统为例,官方给出的快速配置流程就是:先加载程序,再执行TASK.CONFIG os21,接着执行MENU.ReProgram os21,然后让目标程序跑起来就可以了。
二、TRACE32任务列表显示不全怎么办
当任务列表显示不全的时候,我们需要先分清楚,遇到的到底是“任务压根就没有显示出来”,还是“任务虽然显示了,但有些信息字段是缺着的”。前一种情况,多半跟内核的链表、任务的运行状态有关;后一种情况,则常常是因为符号表、内存访问或者系统配置不完整导致的。
1、确认任务是不是已经创建好了
有些任务并不是一上电就马上创建的,往往要等到初始化完成之后才会出现。所以,如果目标程序才刚刚停在入口处,任务列表里面自然是什么也看不到的。这个时候,先把程序运行到系统启动完成的那一步,然后再去打开任务窗口。在FreeRTOS的环境里,可以直接使用TASK.TaskList,当你不带任何参数去运行它时,它会显示出全部的任务。
2、检查符号信息完不完整
如果任务列表里的任务名称、状态,或者入口地址这些地方显示的是空的,那么首先就要去看一下,内核的符号到底有没有被加载进来。你可以重新把那个带调试信息的ELF文件加载一次,然后再去执行一遍TASK.CONFIG命令。假如你用的是经过裁剪的发布版本的文件,那里面的很多内核结构早就是无法被识别的了。
3、检查一下系统本身的配置
某些操作系统会要求内核必须保留下来一份任务链表,比方说eCos系统,就需要把线程链表相关的配置给启用起来,OS Awareness功能才能完整地去遍历所有的线程。碰到任务有缺失的情况,应当去查一下对应操作系统的手册,不要总是在TRACE32的窗口里面反复地刷新来刷新去。
4、检查动态显示的条件是否满足
如果你希望目标系统在跑起来的时候,任务信息能够实时地进行刷新,那就得先确认一下调试接口是不是有能力在运行状态下访问内存。部分手册里也提到,On The Fly这种显示方式是依赖于运行时的内存访问的;另外,有些处理器在通过DAP进行访问的时候,也还可能会出现缓存一致性的问题。
三、TRACE32 OS Awareness开启后怎么复核
OS Awareness功能打开以后,不要光是看那个任务窗口能不能弹出来就完事了,最好是按照任务数量、任务状态、任务切换以及脚本能不能复用这么几个方面,来全面地做一次核对。
1、核对任务的数量
我们可以把TRACE32任务列表里看到的任务,跟系统日志、以及RTOS自带的统计接口里显示的任务放到一块儿来对照一下,确认那些关键的核心任务、通信任务,还有监控任务,是不是全部都能在列表里面看到。
2、核对关键任务的状态
去看一看任务所处的运行态、就绪态、等待态,还有分配给它们的优先级,是不是都跟预期的情形相符合。假如有某个任务,在很长一段时间里始终没有在列表里出现过,那也有可能是任务创建失败了,或者是过早地就退出了。
3、把初始化的过程保存成脚本
可以将连接目标板、加载符号、执行TASK.CONFIG,还有加载菜单这一整套的操作,全都写进一个PRACTICE脚本里面去。以后要是换了电脑,或者换了软件版本,依靠这个脚本就能省掉好多手工操作的遗漏。
4、把版本之间的关系记录下来
要把TRACE32的版本、CPU的配置、RTOS的版本、ELF文件,还有配置脚本这些信息都保存好。万一哪一天任务列表突然之间就变了样子,我们最先要核对的,正好就是这些基础的信息。
总结
调试窗口里面少显示了几个任务,乍一看好像也就是个显示上的小毛病,可实际上,它的背后很可能牵扯到符号表、内核配置,还有运行时的内存访问等一系列的问题。TRACE32的OS Awareness到底要怎么开启,当任务列表显示不全的时候又该怎么办,我们可以把排查的顺序固定下来:先加载好调试符号,再执行对应的TASK.CONFIG命令,接着确认目标程序是不是已经把该创建的任务都创建完了,然后再去检查系统的链表和动态内存的访问条件。要是能把这套初始化的过程提前写进脚本里,后续的维护工作自然也就会轻松不少。