应对高级嵌入式处理器系统调试挑战
时间:2023-09-29 10:35来源: 作者: 点击: 次 FPGA最大的优点在于其灵活性,可激发设计人员创造出无数不同的设计。然而,设计通常最后才加以考虑――如果还加以考虑的话,因此器通常要适应的要求。
好消息是一家在领域耕耘近30年的公司推出了一款器,它对于解决所有您能想象得到的问题,甚至包括那些您都不愿意去听到的问题具有丰富的经验。在本文中,我们将通过一些例子说明Lauterbach公司的TRACE32调试器所具有的功能,这些功能将节省您的时间,甚至保全您的项目。
面向灵活平台的灵活调试
谈到灵活设计,我们想到了客户推出的一套十分有趣的。该在VirtexTM-5 LX50T器件上集成两个Xilinx®MicroBlazeTM核和一个内部block RAM存储器块。这种设计的特殊之处在于每个MicroBlaze只有一个与block RAM模块相连的I-side接口以实现指令提取。Block RAM的另一个存储端口被连接到PCI Express接口上,以便在运行时远程改变应用代码和启动。在此面临的在于如何在调试器无法读写的存储器区域进行调试,因为在存储器区域MicroBlaze处理器本身无法进行加载/存储操作。
我们利用TRACE32的内部“虚拟存储器”来解决这个问题,这个调试器内部的仿真存储器具有无限的地址空间(64位),可以按照需要分配存储容量。我们将目标程序加载到这个虚拟存储器中,并且通过配置调试器的内部地址转换机制将无法读取的目标存储器映射到虚拟存储器上。这使得甚至可在汇编级上进行程序诊断。
但是这里面临着另外一个:为了实现程序的按步执行,特别是语言行以及条件分支,人们通常使用软件断点。由于无法通过MicroBlaze处理器访问Block RAM,显然无法做到这一点。我们的解决方案是提供“map.break”指令,强制调试器在给定的地址范围内使用硬件断点。映射指令还可使您指定存储器的数据宽度,更改大小头特性,或者完全禁止调试器访问某些具有关键外设寄存器的地址范围。
小而有用的功能
Lauterbach在JTAG调试器和仿真器方面的经验充分体现在TRACE32调试器的功能以及其他诸多微小和意想不到的细节中。考虑到Lauterbach完全利用自身工具开发所有软件,这一点并不奇怪。而日常出现的问题通常会激发人们设计出最有用的功能。
您是否曾经需要在调试阶段关掉烦人的计时器中断处理器,或者在无需重启的情况下改变条件分支?是否曾经需要修补循环以观察处理器核是否正确执行外部存储器给出的指令?内置的汇编器正可实现这些功能。
另一个调试中常见的情况是:是否经常在某个程序行走得太远而不得不重新开始?寄存器恢复功能可以取消最后的操作。
TRACE32通过不间断地每秒10次的存储器重读来显示存储器的内容,甚至在处理器停止的时候也不停止重读。为什么它要这么做呢?可能在一秒钟内,您的系统中不间断运行的MicroBlaze处理器就造成了数据破坏,所以您希望能够监测这一点。也可能在某些时候不稳定的存储器造成了屏幕闪烁。又或者是您的JTAG接口在20MHz时并不那么稳定。这些都是您期望知道的。另一方面,TRACE32确保它只会在需要的时候访问存储器。
谈及外设,我们还应该提到外设寄存器文件。这些文件指定了存储器映射的寄存器的位置、宽度,甚至按位编码,并且将它们分组成寄存器树。这样,可以很容易地访问外设寄存器以进行检查及修改:您点击一下即可关掉DMA控制器,而无需仔细阅读目标手册以找到正确位。调试器给出了标准外设的规格说明,但是您可以使用简单的文本编辑器修改这些文件以满足您的要求。对于Xilinx工具链,插件选项可以生成这些文件,并将其作为Xilinx构建过程的一部分。