本帖最后由 GrandLine 于 2022-9-17 19:31 编辑
ClassB介绍 随着对产品稳定性、安全性等诸多性能日趋的关注,在做某些项目时,需要通过一些认证,以此来保证产品安全可靠的运行。在IEC颁布的IEC60730安全标准中将软件分为ABC三类,其中B类软件定义为软件的设计要防止电子设备的不安全操作。本文主要也是针对其中B类软件而实现的ClassB软件功能。
ClassB软件需要检测的故障/错误如下表所示: 一般MCU厂家在针对ClassB软件测试项时只提供上表中的1/3/4/5项,其余项目则是由应用功能结合实际情况进行添加进行自检测。
ClassB软件功能检测主要也就划分为两部分,分别是启动时的自检和运行时的周期自检。其中启动时的自检大多包含看门狗自检、CPU寄存器自检、FLASH完整性自检、RAM功能自检、系统时钟自检和控制流自检;而运行时的周期自检大多包含局部CPU寄存器自检、堆栈边界检测、系统时钟检测、FLASH自检、控制流自检和局部RAM自检(在中断服务程序中进行,就是我们上一章节提到的SysTick中断服务程序)。本文先从ClassB中FLASH自检功能进行实现和验证。
我们知道我们经过编译后的烧录程序最终是存储在MCU内部非易性的FLASH存储空间中的,MCU上电后自动从FLASH起始地址开始取指、译码、执行。而存储在FLASH空间中的程序实际上也是一包数据,保证执行程序的正确性,实际上就是确保存储在FLASH空间中的数据的正确性。对于数据包的完整性,我们结合MCU配备的硬件CRC功能来进行校验,具体的实现方法是在程序编译完生成HEX烧录文件后,在HEX烧录文件的末尾插入刚刚HEX文件中所有数据的CRC计算结果,这样在程序运行时,通过读取存储在FLASH中的程序数据进行CRC运算,将CRC运算结果再与处于末尾处插入的CRC计算结果进行比较,如果两个CRC结果值相等,说明当前FLASH中的程序是完整的,否则FLASH中的程序就有可能已经被破坏了。
LKS32AT085 CRC LKS32AT085芯片自带了硬件CRC计算单元,通过寄存器的配置支持位翻转、输出翻转、数据位宽设置、自定义多项式和配置初始计算值,能够实现众多应用中常见的CRC运算过程。通过硬件CRC的计计算对比软件编码方式实现的CRC计算相比,运算时间会大幅度的提升,随着了运算数据量的增加,硬件CRC的计算时间短的优点尤为明显。对于在ClassB中对存储在FLASH空间中的代码进行CRC运算,其数据会随着应用代码的增加,CRC的算力也会随着增加,在启动自检和运行周期性自检中,能CRC的实现过程也会不一样。在启动自检时,ClassB会对整个应用代码一次性做完整的CRC计算,对计算的结果进行判断比较;而在运行周期性自检时,为了减少ClassB自检程序所占用的时间对应用程序的影响,对于CRC部分会分扇区进行CRC运算,一般一次只计算FLASH中的一个SECTOR或者更小的PAGE,在计算完所有的SECTOR或者PAGE后,再将此时的计算结果进行判断比较。
需要注意的是在实际项目应用中,很多客户为了存储应用配置参数,减少外部硬件存储芯片,将这些配置参数存储在了MCU内部应用程序未占用的FLASH空间,而出现上电自检时FLASH CRC自检正确,但一运行应用程序,在后面的运行自检时,FLASH CRC自检却一直不通过,这时候需要检查一下用于存放配置参数的FLASH空间是否与应用程序空间重叠了,在应用程序和存储配置参数的FLASH区域之间最好留有一定的间隔,确保不会相互干扰到!
实现过程 请按照如下步骤进行配置和操作: 1. 在凌鸥提供的底层驱动库程序startup_lks32mc08x.s中,添加__Check_Sum变量,如下所示:
2. 点击Keil工具栏上的Options for Target…魔术棒按钮,在弹出的窗口中选择Linker选项卡进行配置,使用自定义的分散加载文件,并将刚刚定义的__Check_Sum变量添加到应用程序末尾,具体配置如下所示:
3. 下一步就是在我编译完成应用程序之后对生成烧录HEX文件,调用第三方执行软件运算CRC结果,并将这个结果插入到HEX文件末尾,这个带有CRC校验的HEX文件我们会新建一个文件存储,在Keil中的配置就是在点击魔术棒按钮后弹出的窗口中选择User选项卡,配置如下所示:
4. 在生成新的带有CRC的HEX文件后,我们接着对KEIL工程进行配置,我们需要将KEIL在调试和下载的程序更换为带CRC的HEX文件,点击魔术棒在弹出的窗口中我们分别为Debug和Utilities选项卡进行配置,如下图所示:
5. 然后就是对第三方生成CRC软件进行配置了,我们使用srecord-1.64-win32这个软件,大家可以到官网上进行下载(http://srecord.sourceforge.net),然后直接解压到C盘的SREC文件夹下,如下图所示:
6. 在3步骤时,我们配置了一个crc_gen_keil.bat批处理文件,这个文件就是对调用srecord这个软件来生成带CRC校验结果HEX文件的配置和处理过程,具体的配置可以参考文件配置,如下:
7. 接下来我们就可以在我们代码中添加FLASH CRC的校验程序啦,具体实现如下所示:
8. 然后对我们的工程进行编译,在完成编译后,就会调用crc_gen_keil.bat批处理文件来生成一个带CRC结果的HEX文件,如下图所示:
9. 最后我们点击KEIL的下载程序按钮,将带CRC的HEX文件下载到MCU运行,查看运行结果如下所示:
最后原理HEX文件和带CRC结果的HEX文件直接比较是不直观的,我们需要借助另外一个Hex2Bin的小工具,将HEX文件转换成BIN文件,然后再用Compare软件进行比较,这时比较结果就会很直观了,如下图所示:
附件 生成的HEX和带CRC结果的HEX对比:
ClassB_CompareCRC.zip
(44.73 KB)
|