我正在开发一个固件项目,我必须对其进行crc16检查以确保闪存完整性. crc使用IAR Xlink链接器计算并保存在闪存结束时.再次,crc在运行时从代码计算,并与闪存中的存储值进行比较,以检查完
crc使用IAR Xlink链接器计算并保存在闪存结束时.再次,crc在运行时从代码计算,并与闪存中的存储值进行比较,以检查完整性.但是,我们只能计算闪存代码段的crc.每当我们对代码进行一些更改时,它的大小可能会改变.我可以自动完成我现在手动执行的这个过程吗?
来自.xcl链接器文件:
// --------------------------------------------------------- // CRC16 Essentials: -H for fill,-J for checksum calculation // --------------------------------------------------------- -HFF -J2,crc16,,,CHECKSUM2,2=(CODE)5C00-FF7F;(CODE)10000-0x20A13
这里我需要更改第二个代码段的结束值,即0x20A13.
我从.map文件中获取此值,即我的代码驻留在闪存内的内存范围.
这是我做的第一个改变.
在这里,我需要从代码中进行第二次更改:
sum = fast_crc16(sum, 0x5C00, 0xFF7F-0x5C00+1); sum = fast_crc16(sum, 0x10000,0x20A13-0x10000+1); //Check the crc16 values if(sum != __checksum) { // Action to be taken if checksum doesn't match }
请帮助自动化这个过程!!
您可以尝试在IAR中使用__segment_begin和__segment_size或__segment_end内在函数,这些内容在“C/C++编译器参考指南”中进行了解释,您可以从IAR EW430的“帮助”菜单中进行操作.手册说他们使用链接器文件中定义的段,并且互联网上的很多人似乎都在使用它,但是我尝试了编译器错误(IAR EW430 5.40.7).如果以某种方式破坏了您可能想要将其报告给IAR并获得修复(假设您有支持合同).您可以像这样使用它们:
sum = fast_crc16(sum, __segment_begin("CODE"), __segment_size("CODE"));
我不知道拆分段会发生什么.但是为什么要从校验和计算中排除重置向量?您可以从CODE的开头到结尾并包含重置向量.
我想你可以像这样构建你的代码:
sum = fast_crc16(sum, __segment_begin("CODE"), (char *)__segment_begin("INTVEC") - (char *)__segment_begin("CODE") + 1); sum = fast_crc16(sum, 0x10000, (char *)__segment_end("CODE") - 0x10000);
此外,您可能已经或可能没有注意到__checksum变量在任何适合的位置都被放入内存中.我发现它潜伏在我的DATA16_ID段之后,它正好位于我的校验和代码范围的中间,我不知道如何自动跳过内存部分以进行校验和计算.我所做的是通过为前两个字节定义一个段并将其放入那里,将__checksum强制为flash中的前两个字节.
编辑:错过了第一个更改.如果您手动调整IAR链接器校验和例程的范围,那么为了能够使用编译器中的段内在函数,您需要定义一个自定义段,该段使用链接器中代码的结尾.
我不知道是否有任何方法可以实现自动化.您可能需要将代码编译两次(ugh)一次,使得段无限制以获取代码的结尾,然后使用脚本提取代码的结尾,然后更新链接描述文件.您可以在预构建命令行事件上运行初始构建,并使用不受限制的链接器文件构建IAR项目.但这看起来很难看.