- 主题:再一次修板子的历程
通宵火车,还是硬座,闲的。回看之前总结的两篇修板子的历程:
第一次修板子的历程
又一次修板子的历程
又看到个“将PWM信号1:4扇出”的帖子,似乎是说的时钟分发芯片。于是一首BGM在本青脑海中响起:
那一句话是你离开的玩笑话
搁在我心里 灰尘堆成了塔
你就这样的拨开了它
在信箱前我依旧是那个木偶
线等着你来拉
朗朗饿狗,本青还有一头乌黑亮丽头发的时候。某天,驱动扔过来一块板子:“上电启动正常,但软件重启起不来。”
就像每当发生危机时,美帝总统会问:”最近的航母在哪里?“本青也会问:”看门狗呢?“
“每30s的硬件看门狗复位, 加上每30分钟跟上级设备不通的高层软件复位,过了一个晚上了,都没复位拉起来。你那狗早就变成狗肉下肚了!”
排查过程:此处省略x千字。
根本原因:时钟分发芯片输入输出之间的延迟大,导致CPU读挂在CPLD上的boot失败。
feature 1:板子上软件用的时钟,来源于一片挂CPU上的晶振。CPU再把该时钟从CPU时钟输出管脚输出给一片时钟分发芯片,分别分配给CPLD、FPGA、DSP等。
feature 2:时钟分发芯片的输入端收到第一个时钟脉冲,到输出端输出第一个时钟脉冲,存在一个时间延迟t0,只跟该时钟分发芯片有关。
feature 3:复位释放以后,CPU以外挂晶振为时钟运行,从开始运行读第一行rom code代码,到发出CS去读boot,所需的时间是t1,可以算是固定值。
feature 4:CPLD收到CPU送给的复位以后,将复位信号拉低/高,分别发给boot、FPGA、DSP等,同时用时钟分发芯片给的时钟来完成复位原因、复位次数等状态机的运行,再释放被拉低/高的复位信号,所需时间t2,也能算是固定值。
bug过程:
过程1:软件通过CPU的IO发出复位指令给CPLD,CPLD送回复位给CPU,CPU复位。同时CPU输出的时钟也会关断。复位释放以后,CPU打出CS去读boot,所需的时间t1基本固定。
过程2:异常板子上的时钟分发芯片的输入输出延迟t0,比正常板子的要大了几十倍(从正常的十几微妙级别,成了几百微秒级)。CPLD内部状态机跑完,花费时间t0+t2后,再把CPLD控制的复位释放掉。这些复位就包括boot的复位。
过程3:CPU按t1的时间,打出CS去读boot的内容。但此时t0变大,导致t0+t2变大,CPLD给boot的复位还没释放。CPU读boot失败,死掉。看门狗正常运行,每隔30s后送出的复位,重复过程1到3,还是起不来。软件复位也是外甥打灯笼。
上面“软件重启起不来”的过程说得通了,那“上电启动正常”就说不通了。还得继续排查。
排查过程:此处省略x千字。
原因:启动的时候,因为看门狗送出的看门狗复位+时钟分发芯片的延迟增加的原因,CPLD就没有收到时钟,也就没有把CPLD的上电复位送出。CPU按照t1的时间送出CS去读boot,此时boot仅靠自己电源管脚上并联的电容假装一个很短上电复位,CPLD的复位并没有拉着boot,自然顺利起来了。
解问题:看时钟分发芯片手册,上面只有锁定的时间,且是毫秒级别的,没去法找厂家的岔子。拆下时钟分发芯片寄给厂家,厂家在自己设备上测试不能复现现象。作罢。
解bug:换一颗时钟分发芯片,解决。
--
FROM 116.162.0.*
时钟为啥从CPU绕一圈呀?
直接从晶振+buffer给所有的器件不就行了?
【 在 nlgdczm 的大作中提到: 】
: 通宵火车,还是硬座,闲的。回看之前总结的两篇修板子的历程:
: 第一次修板子的历程
: 又一次修板子的历程
: ...................
--
FROM 120.245.132.*
你不是和媳妇,大姨子一起开车回吗?
不和你一起回家了?
【 在 nlgdczm 的大作中提到: 】
: 通宵火车,还是硬座,闲的。回看之前总结的两篇修板子的历程:
: 第一次修板子的历程
: 又一次修板子的历程
: ...................
--
FROM 180.164.176.*
把那帖子给她们看了,鉴定为阴阳怪气,立马就打退堂鼓了。。。
【 在 oBigeyes 的大作中提到: 】
: 你不是和媳妇,大姨子一起开车回吗?
:
: 不和你一起回家了?
: ...................
--
FROM 183.227.57.*
猜测是一开始是没有这么多器件的,就个CPU直连flash、boot这样的。后面加了FPGA、DSP这种,就加了个CPLD当APB,新加的这些都挂这个上面。时钟分发芯片也跟着算添头,没有放最前面了。就跟魔都的龙阳路地铁站一样,加得乱七八糟的。
坏处不少,但好处目测也有一个:CPU输出时钟默认是晶振的2分频,要靠boot给配成不分频。于是就可以根据挂这个时钟上的CPLD点灯频率的快慢,判断读boot是否成功。
【 在 jiu 的大作中提到: 】
: 时钟为啥从CPU绕一圈呀?
: 直接从晶振+buffer给所有的器件不就行了?
:
--
FROM 183.227.57.*
不是扯吗?时钟给CPLD,啥频率都能分出来。
还有看灯闪烁的快慢来看boot是不是成功的?直接点亮不就行了。
【 在 nlgdczm 的大作中提到: 】
: 猜测是一开始是没有这么多器件的,就个CPU直连flash、boot这样的。后面加了FPGA、DSP这种,就加了个CPLD当APB,新加的这些都挂这个上面。时钟分发芯片也跟着算添头,没有放最前面了。就跟魔都的龙阳路地铁站一样,加得乱七八糟的。
: 坏处不少,但好处目测也有一个:CPU输出时钟默认是晶振的2分频,要靠boot给配成不分频。于是就可以根据挂这个时钟上的CPLD点灯频率的快慢,判断读boot是否成功。
--
修改:jiu FROM 120.245.132.*
FROM 120.245.132.*
但是同一个CPLD分频点灯代码,输入时钟变了,肉眼可见亮灯频率也变了。于是就可以先初步判断一下系统挂在哪个启动步骤。
【 在 jiu 的大作中提到: 】
: 不是扯吗?时钟给CPLD,啥频率都能分出来。
: 还有看灯闪烁的快慢来看boot是不是成功的?直接点亮不就行了。
:
--
FROM 183.227.57.*
帖子太长,没心情看
我只关心为啥要坐硬座
是今年没赚到钱吗
【 在 nlgdczm 的大作中提到: 】
: 通宵火车,还是硬座,闲的。回看之前总结的两篇修板子的历程:
: 第一次修板子的历程
: 又一次修板子的历程
: ...................
--
FROM 180.116.131.*
感觉没找到根本原因
--
FROM 123.115.132.*
替换解决了问题就行
【 在 lanmp 的大作中提到: 】
: 感觉没找到根本原因
--
FROM 180.164.176.*