这就是我今天所做的......
我调试 HW/SW 交互,并且它通常情况下日志记录(仪器)会更改或隐藏错误。因此,测试是“全速”执行的。我称这些虫子为“蟑螂”,因为它们会避开我能照到它们的任何光线。
所以我必须:
找到导致错误的事务。通过日志记录列出硬件交互(此测试通过,但它说明了流程)。
仪器打印状态变化前后的bug。
我现在要解决的错误当然是最坏的情况,因为硬件已锁定。硬件包括 CPU,所以它就像在一个光线充足的房间里,然后电源出现故障并且一片漆黑。
我对内存有一个特殊的后门视图,但当然这也被锁定了。我尝试重启电源,希望内存能够保持足够长的非易失性以重新启用后门。没有这样的运气。不过这是可能的。
我非常非常仔细地编写了描述此错误的所有步骤(哪些有效,哪些失败等)。将此发送给具有类似硬件的开发人员,以验证它不是我或我的硬件。
我休息了几个小时,让这些信息稳定下来,看看其他地方是否有灯泡亮着。
没有回复,这个bug是我来解决的……
此硬件软件交互是一个循环,它会进行一些设置,然后进入一个轮询循环,该循环在事务完成时读取。应该发生许多事务。哪个交易失败?是第一个吗(表明我可以调试事务而不是硬件中的一些噪音)。它总是第 N 次交易吗?是什么让第 N 个不同于第一个或第 (N-1) 个。 SW 是单线程的,并且构建为可预测的。没有抢占,没有启用中断。
这个软件以前用过,有什么新的吗?所有硬件都是新的。在这种情况下,所有的硅都是新的,因为它是一个 ASIC。甚至嵌入式 CPU 也是新的和定制的,因此 ISA 是新的。
所以我怀疑一切,我是瞎子。我得偷偷靠近这只蟑螂。
我只启用了报告软件轮询硬件完成的次数的日志。通过这种方式,第一个事务快速运行,我知道我在紧密的轮询循环中接触硬件的频率。测试通过。我知道这是第 N 笔交易,我记录了所有交易的最高轮询次数(可能是无意义的数据)。
修改任何内容后,我必须将其放回原处以验证错误仍然存在。毕竟地球自转了,太阳风也没有那么强了;)
查看了所有签到,看到一个承包商更改了一些重要的设置参数,没有任何解释。这些(外包)人员仍在评估中。这无济于事。
发现轮询循环中没有 spinwait。循环超时不好,因为没有它,超时取决于 CPU 速度。添加了spinwait,仍然没有快乐。
限制事务的数量以查看失败的位置,在 1000 之前。
将硬件设置为运行较慢,仍然挂起。
不想让任何人读到这篇文章,但这种谩骂必须等到明天。