|
昨天遇到一个比较棘手的调试问题。一台5416芯片的电压监视仪器,以不到百分之一的概率会在开机后工作不正常。通常这种问题多半是硬件故障导致的,但是为了确定是何处的硬件故障,必须在不正常运转时能够调试程序。
我们知道一般调试DSP程序的时候,都是采用JTAG直接把out文件下载到DSP上,然后设置断点运行。现在的问题是电压监视仪器的程序从flash加载,而且必须开关电源很多次才有可能出现故障。这就必须在DSP工作不正常之后,连接JTAG并启动CCS,并且继续运行CCS启动时中断了的程序。
下面以我调试5416芯片为例,简单介绍一下调试步骤:
- 修改GEL文件。GEL文件是CCS的批处理程序,它可以命令CCS经由JTAG对DSP进行操作。由于缺省情况下启动CCS会RESET DSP,这样就无法对DSP上正在运行的程序进行调试了。连接JTAG,打开硬件电源,启动CCS。在Files树中,最上面一个就是GEL files,里面有对应芯片的GEL文件,我的文件名为c5416.gel。找到C5416_Init函数,把里面的寄存器设置语句都注释掉。例如:GEL_Reset();PMST = PMST_VAL;等等。然后关闭CCS。
- 开关电源N次,一直到问题出现。
- 启动CCS,打开flash中程序对应的工程,选择CCS的File->Load Symbols->Load Symbols Only。找到flash中的程序所对应的out文件。现在不加载out文件,而只是让CCS加载out文件中的符号,便于调试。
- 查看DSP寄存器,若XPC的值不为0,则修改PC寄存器的值,让其高位等于XPC。例如PC=0xABCD,XPC=0x2,则修改PC为0x2ABCD。(PC寄存器本为16位的,它和XPC一起构成完整的程序地址指针,可能是由于CCS的问题,载入符号之后,并没有显示XPC + PC地址的程序,因此设置一次PC寄存器强制其显示)
- 按F5继续运行程序。剩下的调试就和从JTAG加载程序一样了。
经过调试,我发现数据从扩展内存中读出之后出现了错误,因此我要用CCS查看一下扩展内存,于是我在GEL文件中添加了一些GEL_MapAdd。有了对应地址的GEL_MapAdd,CCS才能查看其内容。我发现程序暂停的状态下,每次刷新读取扩展内存中的数据所得到的结果不一样,于是初步确定问题出在扩展内存。为了进一步地确认,我写了个小程序校样扩展内存中的数据,果然发现其工作不正常。
软件调试到此结束,问题转手给硬件担当者。
|