在物联网中,调试跨越了硬件-软件的界限

在物联网中,调试跨越了硬件-软件的界限

不要忽略默认的MCU设置

调试是嵌入式设计的重要组成部分;它必须跨越硬件/软件的界限。在系统级别上,嵌入式设计的功能越来越多地由固件定义,因此避免错误需要具有特定学科的工程师在项目的设计阶段密切合作。这也意味着,当一个bug不可避免地出现时,要抵制指责他人的冲动。

也许正是软件定义硬件的本质使得现代嵌入式设计成为一个如此有趣的职业。每一个新的微控制器(MCU)似乎都提供了更高的集成度和更先进的功能,但它完全没有意义,直到它被编程。虽然这种级别的集成和配置显然是一个启用因素,并在产品设计方面带来了巨大的进步,但它偶尔会给工程师带来不可预见的问题。

嵌入式组件(如MCUs)所提供的功能级别和可配置特性也在不断增加,而且这些组件提供了许多在每个设计中都不需要的特性。这些额外的函数可能会被忽略,很少会引起问题。

正如大多数工程师所理解的那样,这些功能通常由可以通过软件修改的寄存器控制。因此,它们在上电时将有一个默认设置,如果保持不变,将继续在这些默认设置下运行。在许多情况下,这可能不会造成问题,但如果这些特性仍然未被使用,或者没有经过测试,就有可能以某种无法预见的方式感受到它们的影响。系统中可能会出现漏洞,这些漏洞可能是由完全合理的功能所引起的,而这些功能可能被忽略了。

即使在理想的情况下,查找故障也可能是困难的、耗时的和昂贵的。通常情况下,故障将通过其影响来识别,这将提供足够的证据,使工程师能够追踪原因。这一原因是否与硬件或软件相关将在很大程度上是无关的,但或许仍有争议;重要的是发现并纠正了它。

如果一个错误的原因是一个没有正确初始化的低级特性,那么找到它就会变得更加困难。要理解硬件平台的初始状态如何影响整个设计,需要对整个系统有更高的认识,跟踪这些难以捉摸的条件确实会消耗资源。

例如,考虑MCU上的SPI总线访问串行闪存,这是许多嵌入式系统中使用的一个相对简单的特性。如果在存储值中检测到错误,这将表明内存而不是MCU发生了故障。这是一个客户的经验,当连续读取状态寄存器的闪存显示它正在检测读/写错误。可以理解的是,我们假设内存设备发生了故障,如果在状态寄存器读取之间引入一个短延迟,那么检测到的故障数量似乎会减少,这一理论得到了证实。此外,一个动力循环似乎暂时消除了故障。

工程师认为这些症状表明串行内存失败,即使它仍然在指定的周期限制内,只完成了大约60k的写周期。当串行闪存设备返回Adesto进行进一步测试时,即使执行了超过300k的写周期,也没有发现故障。

为了找到真正的故障,Adesto工程师对客户的应用进行了调查,并对SPI信号进行了分析。存储设备的故障被证明是系统噪声问题,而且可以很容易地纠正。虽然部分原因是由于MCU和闪存之间的PCB轨迹阻抗不匹配,但噪声并不完全是由于PCB设计差或信号完整性问题。

即使它看起来是PCB或电路设计的问题,噪音实际上是SPI信号的过调和过调,由信号的过度驱动强度造成的。超调量足以破坏闪存设备的充电泵,并导致读写错误。在某些情况下,SPI信号的超调和欠调也可以解释为信号过渡,这也会导致读或写错误。

跟踪图像显示SPI线上出现的超调和欠调

一个可能的解决方案是在信号轨迹上放一个RC电路,以减缓过渡。然而,它被发现的设计是基于一个相对较新的MCU,它允许在固件中修改I/O引脚的驱动强度。降低信号的驱动强度足以消除SPI信号线上的过冲和欠冲,有效地消除系统级噪声的来源。

这里最重要的一点并不是闪存设备真的在尽力对付大量的系统噪声,而是MCU上的可配置特性可能引入的影响,很容易被解释为设计的单独部分的故障。在这个例子中,故障通过一种稳健的设计方法检测出来,并通过Adesto工程师的勤奋解决。

也许真正的教训是,硬件故障可以很容易地通过软件修复。在一个组件中出现的故障可以追溯到在另一个组件中出现的错误配置。硬件和软件工程师之间的工作关系,以及客户和供应商之间的工作关系,应该足够牢固,能够承受使用最新技术进行设计所带来的挑战。即使默认设置是有帮助的,它们也应该被验证。对这些设置进行优化可以显著改善系统的性能和可靠性。

阅读完整的案例研究,”数字接口中的系统级噪声如何导致串行闪存中的假错误”,在Embedded.com上。

本文由高级营销总监Paul Hill和EMEA应用程序经理Gordon MacNee撰写亚博国际官网平台网址