gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:07:45 24 4
gpt4 key购买 nike

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

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
}

请帮助自动化这个过程!!

最佳答案

您可以尝试使用 __segment_begin__segment_size__segment_end IAR 中的内在函数,在“C/C++ 编译器引用指南”中进行了解释,您可以从 IAR EW430 的“帮助”菜单中获取这些内容。手册说他们使用链接器文件中定义的段,互联网上的很多人似乎都在使用它,但我尝试并遇到了编译器错误(IAR EW430 5.40.7)。如果它以某种方式损坏,您可能希望将其报告给 IAR 并获得修复(假设您有支持契约(Contract))。

您可以像这样使用它们:

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 链接器校验和例程的范围,那么为了能够使用编译器中的段内在函数,您需要定义一个自定义段,该段使用链接器中代码的结尾。

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

关于linker - 在 IAR Embedded Workbench 中自动配置链接器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12087997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com