调试引导程序的常见步骤
引导应用程序是一个系统级问题,其受硬件以及软件设置的影响。调试与引导有关的问题时,用户应检查一些常规步骤。本节讨论调试引导应用程序时要注意的常见问题。
1.硬件故障排除步骤
输入时钟和电源时序
- 确保供给电路板正确的电源时序。电源时序规范可在数据手册中找到。
- 检查系统时钟,并确保它正在输出预期频率,且信号在轨至轨之间摆动(应为1.8V信号)。如果您有一个晶振,则它应该以所需频率输出一个方波。如果使用的是晶体,则XTALIN上应具有所需频率的正弦波。XTALOUT应该类似(可能会有些变形)。
- 检查上电复位信号PORZ。整个上电过程中,该信号应保持低电平,并在电源和高频时钟稳定时变为高电平。
- 如果器件具有OBSCLK或CLKOUT,则请确保该管脚的输出与您的软件配置匹配。
引导管脚:
确认器件ROM引导程序从管脚读取的内容的最佳方法是:读取将引导管脚锁存到器件的寄存器:
- 对于AM335x/AM437x:检查Control_status寄存器
- 对于AM57xs:检查CTRL_CORE_BOOTSTRAP寄存器
- 对于C66x/K2X器件:检查DEVSTAT寄存器
- 对于OMAPL13x/C674x器件:检查BOOTCFG寄存器
引导介质连通性
用户可通过运行独立于引导程序的诊断测试程序来测试其引导接口,以确保SOC可正常进行读写操作。processorSDK RTOS为K2G/AMXX器件提供了诊断程序,并为测试TI EVM的关键器件提供了POST程序。
TI技术文档,如技术参考手册(AMXX器件)、Bootloader用户指南(用于C66x/K2X器件)和OMAPLxx/C674x的Bootloader应用指南,列出了默认特性、ROM Bootloader以及每种引导模式的限制和约束。应用程序开发人员在设计系统时需要考虑到这一点,以确保顺利启动。
引导介质和复位管脚上的信号
如果软件和其他硬件故障排除步骤无法帮您定位问题,则可能需要通过示波器或逻辑分析仪来检查时钟以及数据传输,来进一步定位问题。影响启动的另一个常见问题是电源线上的噪声,这可能会导致SOC复位或导致引导内核挂起。可在E2Echina论坛上上传截图,以便TI工程师确认是否有问题。
2.软件故障排除步骤
SBL和应用入口地址
如果您未看到引导程序执行,请查看引导程序的map文件,并确保入口地址与引导镜像中TI或GPHeader中的位置匹配。这可通过查看MLO/_ti.bin/GPheader中的入口地址来完成,并确保其与引导程序的.out/map文件中的Entry地址匹配。
SBL和应用程序内存映射
SBL从器件片上内存执行,因此,如果您的应用程序除DDR外还使用片上内存,则开发人员需要确保应用程序中的代码段与SBL使用的内存段不重叠。否则,这可能导致SBL在应用程序引导过程中挂起并进入中止状态。
如需检查SBL使用的内存区域,请查看map文件。
Flash编程验证
所使用的flash不仅要具有烧写镜像文件的能力,并且还需要验证写入flash的镜像文件是否与您在主机上创建的镜像文件相一致。您可使用TI Flash烧写程序作为参考。
DDR时序和配置/SBL
Processor SDK引导程序的DDR时钟和时序设置只适用于TI评估板。在自制板上运行代码时,可能需要用户更改这些设置以匹配自制板上的DDR时序。我们强烈建议用户创建一个类似于TI提供的GEL脚本,在SBL配置DDR之前先测试一下DDR内存接口。 **Processor SDK Diagnostics**提供了一个mem_test,可用于测试对整个DDR地址空间的读写,以确认SOC EMIF配置。
基于仿真器的引导调试
处理器SDK RTOS引导程序与任何其他应用程序一样,可通过仿真器加载并调试。将仿真器连接到EVM的步骤已在链接至Processor SDK RTOS文档的**硬件设置指南**中进行了描述。
通过仿真器加载bootloader对于调试系统启动非常有用。bootloader可像其他任何应用程序一样通过仿真器加载此.out。如果加载bootloader的debug版本,则可单步调试用于初始化SOC的代码或者也可单步调试从引导介质加载应用程序的部分SBL代码。
注意
SBL是从片上内存运行,因此即使不使用GEL文件,用户也可加载SBL.out,但是使用GEL有时有助于将内核置于清晰状态,因此也可选择使用GEL。
替代方法:
在SBL main中添加自旋锁
某些情况下,RBL可能会加载SBL,但可能有一些问题需要在SBL中调试。这种情况下,您可在SBL中main的开始处添加一个自旋锁循环,并允许第一阶段引导正常完成,然后连接到内核,当您连接到内核时,
内核将处于自旋锁状态。
例如:
volatile int exitSpinLock = 0;
void Debug_spinLock(void)
{
while (exitSpinLock == 0) { }
}
然后,您必须通过修改该 变量来“释放”内核。您可手动通过CCS更改此值,或者也可使用GEL脚本。
使用IO输入来暂停内核,直到收到用户输入为止:
printf("Hit enter to continue:");
getchar();
启动失败时的系统状态
在调试启动相关的问题是,一个比较有用的方法就是排查常见的初始化问题并且需要了解在遇到问题之前启动已经进行到哪一步,用户需要捕获ARM/DSP时钟、程序计数器值、检测到的入口点、pinmux配置并确认DDR初始化和从核的状态。这有助于帮助我们定位最有可能导致引导失败的原因。
Annie Liu:
我们建议您在发布新问题之前先搜索 E2E支持论坛,E2E支持论坛已经拥有数十万个已得到解答的话题。 这通常是解决问题的最快方法。