电子说
电路板板回板后,如果串口能够正常打印,则我们很多调试手段都可以运用,能够运用串口打印,或者调试工具能够快速的进行问题定位。
最痛苦的就是嵌入式系统,我们的知识体系比较单一,团队中缺少软硬兼修的人。如果回板的电路板虽然不冒烟,但是无法明确是软件问题,还是硬件问题的时候,就需要我们通过一系列操作进行问题定位,然后逐步歼灭问题,最终达到串口能够正常打印的地步。
早期在X86系统中,为了帮助定位问题,会选择这样的80卡,用一个PCI外设来显示故障部件的位置,缩短调试的时间和过程。
但是最痛苦的事情是,80卡也不亮。
所以我们需要逐步排除硬件问题,捋清楚硬件启动的过程:
1、时钟问题。
一般表现在时钟配置异常,晶振的选型频率范围有问题,超出芯片主频工作范围。
还有晶体不起振,我们碰过有同事归一化电容,把晶振的负载电容容量选型选的容值过于大了。
也碰过晶振的走线太长,导致处理器接收端的信号质量不好,导致无法正常启动。
2、电源问题。
电源完整性的质量差,纹波过大,尤其开关电源供电时;或者供电输出不稳定;或者系统供电能力不足而引起电源波动等。例如有一些设计错误,电压错误、电流能力不足、电源之间的相互干扰等等。我们需要仔细排查电源本身的问题。
3、上电时序的问题
电源之间的先后关系,我们设计电路板的时候,需要捋清楚每个电源上电的先后时序要求,很多芯片都会有相关的要求:处理器、FPGA、DSP等等一般都会有时序要求。
容易忽略的一个点是:不光是电源时序有要求,有些芯片的时钟稳定、电源稳定、复位信号之间有先后关系,或者还有时间间隔的要求。
我们需要全方位排查时钟、电源、复位信号之间的时序要求。特别是一些共用电源的芯片,很可能由于时序要求,我们要分别供电,或者需要通过MOSFET控制上电时机。
4、BOOT脚配置问题。
对于ARM芯片往往都有些BOOT配置脚。经常遇到有人因为BOOT脚的焊接或接触不良导致各类奇怪问题。这种情况多表现在芯片功能时好时坏,或者部分芯片正常,部分芯片异常。
我们不管是ARM也好、X86也好、DSP也好,以及MIPS、现在RISC-V都存在启动路径的问题。有TF启动、U盘启动、硬盘启动、光盘启动等等。
我们需要知道要么像X86那样,有BIOS来配置启动路径,或者像有的ARM通过上下拉电阻来配置启动路径。
最近在玩英伟达的Jetson,最不爽的一件事就是:不同的启动路径,使用的系统镜像不同。如果我们忽略,会导致系统无法启动。
5、启动文件问题。
经常因为选错了启动文件,导致程序无法正常运行,或者说调试时好好的,脱机运行就不行。这点在做不同系列芯片间移植时最容易碰到。
有些处理器的启动配置文件很复杂,没问题的时候容易被大家忽略,一些处理器的基础配置在配置文件里面。如果配置文件错误,会导致处理器启动异常。
6、地址空间错误
我们从软件的视角,有时候很容易忽略启动地址。地址空间有时经常会把软件人绕晕。硬件的人想搞清楚,也费尽。
对于X86系统的地址空间更复杂,内存空间分四个模式,还有IO地址空间。
案例:某一个多核PowerPC的处理器串口没有打印
1、现象、问题描述
单板回板后,单板启动失败,串口没有打印。这是一个典型的单板调试过程。故记录作为回板调试参考。
2、关键过程、根本原因分析
单板回板后,串口没有打印。处理器为多核PPC,小系统通过CPLD对Local Bus进行解复位。下图为P4080小系统框图, P4080小系统P4080, DDR3 SDRAM,CPLD,Flash构成。P4080通过SRIO接口实现对DSP的加载和控制,通过SGMII接口和FPGA交互媒体控制报文。
问题一:单板启动到什么程度。
分析一:配置字没读完,刚读32bit,处理器就挂住了,没有继续读取RCW(配置字)。
结论一:在读取RCW的阶段就挂死了。
措施一:查看和核对RCW。
问题二:RCW有什么错误,它的错误为什么会导致处理器挂死。
分析二:单板的RCW与DEMO板的RCW,除了内容不同(硬件环境,设计需求不同),同时RCW的长度也不同。
Demo板的RCW
aa55 aa55 010e 01004c50 0000 0000 0000
5050 5050 0000 cccc 58400000 c03c2000
fe80 0000 0100 0000 0000 0000 0000 0000
0000 0000 00df 07fd a000 0000 0000 0000
0000 0000 0000 0000 0813 8040 ff3041a4
我们单板烧入的RCW没有红色的字。
结论二:RCW不单单是根据硬件设计,对各个数据进行填写,同时,CPU有校验功能,在RCW的头和尾都有校验数据。这些配置字的生成,供应商提供了一个工具,按照处理器的的设计,直接进行选择,然后可以直接生成完整的RCW。而我们之前的RCW校验失败,所以启动失败。
我们的设计方法直接借鉴公司大规模使用的单核PowerPC 8321的设计方法:1、阅读器件资料,理解配置字的含义;2、列出配置字的内容;3、整理成16进制发给软件工程师。
由于多核PPC的RCW变得复杂,且有校验码,所以P4080等多核PowerPC的RCW可以通过工具生成,工具如下:
措施二:利用工具生成RCW,烧入Flash。
问题三:RCW的数据正确了之后,仍然没有打印。
分析三:配置字已经跑过了,又挂在Bootrom。
看了一下波形,配置字跑完,又跑了40字节。
先怀疑配置字问题,我觉得没有问题,依据是原来跑步起来,现在跑起来了。
我跟陈陆安又核对了一次配置字。并且发现,处理器版本选择V1.0、V2.0对于我们的单板来说,生成的配置字是一样的。
BOOTROM的启动挂死的比较前端,估计应该没有读到BOOTROM。查看Flash烧片文件,第一条指令与RCW之间预留了若干位,其中填0,软件多填了一行0.
发现软件的起始地址不对。
下图为我们需要的数据存储在Flash的位置,RCW的存放位置为MPI Flash能够读取的最低地址。而BOOTROM的启动地址是FFFF,FFFC。配置字的启动地址:CS0的最低地址。
如下图所示:
但是实际上我们是下面这样弄的:
结论三:由于BootRom和RCW没有存储到CPU默认读取的地址,所以导致Bootrom没有被读到,所以启动失败。
措施四:于是我们考虑在Flash里面加载现有代码两个地方,
通过设置JTAG的起始地址,实现加载。
JTAG加载起始地址:127Mbytes,但是Flash的位宽为16bit,所以JTAG加载的起始地址:
127M = 127* 1024 *1024 = 0x7F00000。
0x7F00000 /2 = 3F80000
最终的交付版本,是通过CPLD地址重定向实现的RCW和BootRom存储在连续地址。
问题四:串口可以打印,但是BOOTROM下的打印正常,但是进入VxWorks之后,打印乱码。
分析四:虽然打印了一堆乱码,但是键盘可以输入。根据判断,单板已经正常工作了,但是当时怀疑是内存问题导致的数据错误,导致打印乱码。
分析四:通过仿真器,对内存进行批量读写操作,说明内存的数据是正确的,排除了内存的问题。
底软的开发人员怀疑的VxWorks下的中断错误,导致串口乱码。当时给出三条否定意见的依据:
中断服务程序很大不可能插入到前4k中,所以无法实现
为什么Demo可用,而我们单板不可用?
中断问题,只会造成发送速率慢,而不会造成乱码
通过查代码发现:
Demo板通过CS3读取了数据,用于配置处理器的大量寄存器。
Demo板的所有CS都是连接到FPGA的
Demo板子上面,FPGA的CS3如同我们CPLD寄存器。
里面有大量单板硬件信息。例如:
FLASH的映射方式
单板CPU主频。
后续,我们重点关注了这个:“单板CPU主频。”
启动时,BootRom是直接操作UART的,对UART初始化一次。进入Vxworks之后,又对UART初始化一次。所以有可能把UART寄存器改了。
通过CS3读出的处理器主频,直接写定。SYStemCLK是从CS3中读取的,波特率是通过SYSTEMCLK分频得出的。
1、 示波器测试UART的波特率:上电时为115200,后来乱码之后为8k左右。
修改了SYSTEMCLK之后(由于我们的单板没有CS3,所以原先从CS读取SYSTEMCLK,导致了错误),出现VxWorks界面。串口打印正常。
结论四:通过固定处理器的SYSTEMCLK,实现VxWorks下的正常打印。
3、结论、解决方案及效果
单板在回板后,有大量的问题:
配置字校验数据缺失;
BootRom的存储地址问题;
VxWorks加载过程中修改了处理器主频,导致串口乱码。
4、经验总结、预防措施和规范建议
这不是一个什么高级的案例,但是每个使用新处理器的单板返还,都会有一段曲折的路走。
单板在返还后,如何不走这段弯路?
a、 每一个操作,都需要有依据,例如BootRom的存储位置等,这些不明确的话,肯定会引入问题。
b、 不要直接套用已有的经验,例如RCW在单核PowerPC和多核PowerPC的开发模式发生了变化,需要与供应商充分沟通。
c、 硬件,软件不要划分界限,要相互渗透,在串口还没有打印前的问题,需要所有开发人员都非常清楚,而不是相互推诿,相互依赖。
d、 问题定位,下一步的猜想,需要心思缜密,不是每个猜想都要去验证。为了更好的项目进度进展,需要经过逻辑判断,否定一些错误的猜测和假象。但是这需要严密的逻辑思维,否则适得其反。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !