关键是我需要使用IAR计算一个32位CRC,以便将这个值自动存储到一个已知的内存地址中,但是IAR给出的结果和我使用C函数(使用一些在线计算器检查)计算的结果不匹配。
在接下来的段落中,我将尝试循序渐进地遵循我遵循的所有过程。
我按照以下链接中的建议(我认为至少是这样)配置了IAR链接器:
IAR documentation CRC links
事实上,我已经在Calculate CRC32中配置了它,就像在STM32硬件(v.5.50和更高版本)示例中一样(这是第一部分,因为我有IAR 6.5)。
如我所见,我试图克隆屏幕截图中显示的配置:
CONFIGURATION PICTURE
这是我在C CRC文件中使用的配置:

/* PARAMETERS EXPLANATION
   * 'order' [1..32] is the CRC polynom order, counted without the leading
   * '1' bit.
   * 'polynom' is the CRC polynom without leading '1' bit.
   * 'direct' [0,1] specifies the kind of algorithm: 1=direct, no augmented
   * zero bits.
   * 'crcinit' is the initial CRC value belonging to that algorithm.
   * 'crcxor' is the final XOR value.
   * 'refin' [0,1] specifies if a data byte is reflected before processing
   * (UART) or not.
   * 'refout' [0,1] specifies if the CRC will be reflected before XOR.
   */

  /* Init parameters for CRC 32 algorithm */
  crcParams.order    = 32;
  crcParams.polynom  = 0x4C11DB7;
  crcParams.direct   = true;
  crcParams.crcinit  = 0xffffffff;
  crcParams.crcxor   = 0xffffffff;
  crcParams.refin    = false;
  crcParams.refout   = false;

我怀疑crcxor是否应该是0xFFFFFFFF或0x00000000,但我尝试了两者都没有得到预期的结果。
为了检查C功能是否正常工作,我使用了以下网站:
FIRST CRC32 CALCULATOR
SECOND CRC32 CALCULATOR
我用来计算CRC的C代码是基于这里解释的代码:
CRC C code
这是其中一个网站中使用的配置示例:
c - IAR链接器CRC32计算与在C(以及其他网站)中计算出的结果不匹配-LMLPHP
任何帮助都将不胜感激。
提前谢谢。
最好的重新包装。
伊万

最佳答案

我终于解决了这个问题。我使用了这个CRC32代码来适应我的目的:
https://www.iar.com/support/tech-notes/general/c-source-for-crc32/
在我所有的其他尝试中,我使用了正确的多项式,并尝试了与IAR链接器校验和配置中的其他板一起使用的所有配置,但这些都不起作用。所以我使用的配置是init值0xFFFFFFFF和以下IAR链接器配置:
c - IAR链接器CRC32计算与在C(以及其他网站)中计算出的结果不匹配-LMLPHP
我希望这能有帮助。这是非常罕见的,因为我在实现另一个(我认为是有效的)CRC32实现时遇到了问题。
谨致问候,
伊万

关于c - IAR链接器CRC32计算与在C(以及其他网站)中计算出的结果不匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38346985/

10-11 22:05