在IAR Embedded Workbench中自动化链接器配置

时间:2012-08-23 08:48:51

标签: linker embedded msp430 iar crc16

我正在开发一个固件项目,我必须对其进行crc16检查以确保闪存完整性。

使用IAR Xlink链接器计算crc,并将其保留在闪存结束时。再次,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
   }

请帮助自动完成此过程!!

2 个答案:

答案 0 :(得分:2)

您可以尝试在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到闪存中的前两个字节。

编辑:错过了第一次更改。如果您手动调整IAR链接器校验和例程的范围,那么为了能够使用编译器中的段内部函数,您需要定义一个自定义段,该段使用链接器中代码的结尾。

我不知道是否有任何方法可以实现自动化。您可能需要将代码编译两次(ugh)一次,使得段无限制以获取代码的结尾,然后使用脚本提取代码的结尾,然后更新链接描述文件。您可以在预构建命令行事件上运行初始构建,并使用不受限制的链接器文件构建IAR项目。但这看起来很难看。

答案 1 :(得分:2)

也许您也可以更改解决方案,以便为应用程序保留的完整闪存构建crc,而不仅仅是用于已使用的部分。

然后你永远不需要更改链接器文件或c代码,甚至引导加载程序也可以在不知道应用程序实际大小的情况下计算crc。