如何用低成本ARM Cortex-M微控制器让家电变得更安全
扫描二维码
随时随地手机看文章
自2007年起,家电厂商的所有新设计必须遵守IEC60335安全标准。为确保家电设备安全可靠,特别是设备故障不能威胁用户的人身安全,这套新标准涉及十分广泛的内容,从机械系统到嵌入电子元器件均有明确规定。
电子部分参照另一个标准,即适用于各种应用领域的IEC60730自动电子控制标准。对于嵌入式系统开发人员,附件H对于嵌入式系统开发人员尤为重要,因为该附件是关于可编程器件。白色家电通常使用多个微控制器:一个微控制器负责管理控制台,另一个管理阀门和电机控制。
根据设备故障导致的危险程度,该标准将软件分为A、B、C三类。如果家电安全不依靠软件,则该家电属于A类,如室内温控器或照明控制器。相反,如果软件用于防止安全隐患,如电子点火燃气灶归为C类。本文不探讨C类。电子控制系统防止不安全操作的家电多数属于B类,如洗衣机,其安全隐患与电控门锁或电机热关断有关。
IEC60730附件H的表格 H.11.12.7 列出了B类和C类软件需测试的微控制器元器件、需检测的故障和接受的安全措施,检测内容包括监视CPU(寄存器和程序计数器)、中断(处理和执行)和时钟频率,检验易失性存储器(RAM) 、非易失性存储器(闪存和 EEPROM)、外部通信以及外设。
这些检测均在微控制器引导过程中甚至在系统执行代码前完成,主要原因是RAM测试具有‘破坏性’,可导致初始化的变量损坏。
在RAM检测中,标准要求B类设备定期做单一位DC故障检测(如嵌入存储器固定故障或耦合故障)。因为多数入门级微控制器的SRAM无校验位,所以该检测必须由软件来完成。March算法通过限定数量的测试来发现这些故障,March C测试最适合B类(使用10N次测试,N为被测试存储地址的数量),但是March X(6N次测试)在某些特定情况也被测试机构接受。测试完成后,RAM存储器内容被清除(因此,又称为‘破坏性测试’)。
复位后执行March测试不会产生特别的问题。除略微降低开机速度外,没有什么实际缺点,因为嵌入式SRAM很小,开机速度降低甚至都不会被注意到。
相反,如果在运行期间重复这个测试,可能会产生很大的问题。首先,测试必须透明:应用无需特定的协议即可处理RAM,好像没有测试一样。实际而言,这增加了下列条件:
· 测试必须是一个中断处理程序(ISR),且给予最高的处理优先级,可禁止应用程序在测试过程中访问数据。
· 必须配备缓存,以便提前备份被检验的RAM内容,最后在应用任务重新运行前恢复RAM内容。显然,也必须定检验证缓存。
其次,应用任务暂停时间不宜过长。该测试通常分为若干个小测试,以限制占用顶层任务的时间。一次测试的地址不得少于3个连续地址(这是耦合故障测试覆盖率的硬性要求),这表示不少于30次连续的March C算法读写操作。
虽然实际应用证明该解决方案效果不错,而且在业界十分流行,但还是存在不少的缺点。
我们先从软件工程角度剖析这些问题。结构化编程的优点略过,只分析相关的局限性问题:
· 封装问题:C模块必须将部分内部变量提高至全局变量,不再接受编译器参照跨模块访问进行的完整校验。
· 低任务隔离度和低模块化:测试对每个安全关键的软件模块强制进行访问测试,使增加新功能变得更加复杂。
如果将数据损坏的机率与读写次数联系在一起,该解决方案的数据损坏风险是比较高的。虽然逆向冗余存储安全关键变量可降低风险,但同时也会扩大存储器B类测试的容量。
从微控制器资源角度看,测试代码占用ROM和RAM空间,以及CPU带宽:除正常处理任务外,如果内核临时无法吸纳测试负荷,就必须在家电运行关键阶段终止测试。
最后,运行时RAM校验会影响实时响应性(可能延迟甚至暂停其它中断处理程序),并可能与低延时或紧急任务要求冲突。测试程序的代码长度无法最小化:耗合故障测试对被测连续存储地址的数量有下限要求。如果软件必须管理地址解扰,使其符合存储器物理布局,则复杂度更高。图1所示是软件如何在运行时处理部分RAM测试。
IEC60730标准另提供一个由硬件校验位组成的解决方案。虽然这是一个标准的DRAM存储器流程,但是很少用于通用微控制器。不过,先进的芯片制程节点使得该方法更具成本效益。
硬件测试解决方案的本质是在每个存储地址增加一个校验位:存储器每写一次,计算一次校验位,并将校验位计算值与数据存储在一起。当读取数据时,同样计算校验值,然后与参考值对比,如图2所示。如果数值不同,无论是数据损坏还是校验位损坏,中断或异常信号线都会置位。处理器内核将使用一个专用安全中断处理程序处理错误,并关闭家电的电源。第二步,内核可能重启应用(热复位)或停止家电运行,同时显示检修代码。
该解决方案的优势十分明显。B类RAM校验变得完全透明:
· 不影响软件开发方法
· 不必开发某一个微控制器厂商专用的测试程序,只需开发一个在任何情况下都会出现的全局故障处理函数
· 无需专用的RAM分区和链接脚本
· 不占用CPU带宽(校验不会增加存储器读操作延迟)
· 最优的实时性能
最后一个优势是该解决方案在启动时无需进行完整的RAM校验,而且在上电复位后,寄偶校验立即激活,因此降低了引导时间。
由于拥有高能效、静音运行、高可靠性的特点,无刷电机被广泛用于家电,但是需要复杂的控制算法和专用的PWM外设,需要特别注意故障防护和安全关机。因此,RAM校验机制可提高可靠性和响应性,不是用软件管理安全关闭功能,而是直接向PWM外设发送校验错误信号,自动触发紧急停机功能,避免系统时钟和软件相关的延迟。图3所示框图描述了一个实用的解决方案。
还必须注意系统的其它关键参数。电源监控系统可以设置电压,如果Vdd 电压降至预设电压值,系统将发出一个中断命令。同样,时钟安全系统检查主时钟运行是否正常,如果出现异常,则发出一个中断命令。此外,当发生硬故障、在NMI处理程序内部出现错误或者在引导过程中发生总线故障时,Cortex内核进入锁保护时态,在芯片级提供一个状态显示信号。这三个事件以及校验值合并,产生一个内部紧急关断信号,信号本身与外部断路(break)输入进行或运算。
该标准还需要一个防失效时钟电路。当晶振失效时,时钟安全系统外设(CSS)可自动将主时钟切换到内部高速振荡器,从而实现部分防失效功能。此外,还需要一个通过对比外部预计频率与内部频率来监视外部时钟的方法。实时时钟定时器可由LSI (内部低速)阻容振荡器驱动,以便精确地测量主系统时钟,发现晶体副谐波引起的50%的变化。在系统级,这可节省50/60Hz电网过零检测电路的成本。
该标准提出一个独立的时隙监视方案,防止CPU在程序计数器故障时失控,这是看门狗定时器的职责,多数微控制器均内置看门狗。但是,标准规定看门狗必须完全独立。因此,意法半导体的32位Cortex-M STM32系列微控制器有两个看门狗:第一个窗口看门狗使用主时钟;第二个看门狗使用独立的内部振荡器,通过闪存内的选项字节启动。这种设计可确保在晶体失效时,无论时钟电路配置如何,都能确保至少有一个看门狗在运行。
最后,微控制器还内置一个32位硬件CRC计算器,可大幅加快闪存内容完整性检查,同时将相关CPU负荷(在运行时占用的时间)降至可忽略不计的水平。该外设甚至可以用DMA控制器驱动。在微控制器运行期间,闪存数据完整性检查可在后台进行。
硬件校验长期以来只用于计算机DRAM模块和高可靠性系统。该方法被引进嵌入式市场的通用微控制器,如基于Cortex-M0的STM32F0x产品,随着系统监控和安全功能数量日益增加,该方案可简化产品认证、安全开发的执行,最重要一点是使家电变得更安全。