2016-07-13 6 views
0

Дело в том, что мне нужно вычислить 32-битный CRC с использованием IAR, чтобы автоматически сохранить это значение в известном адресе памяти но результат, предоставленный IAR и тот, который я вычисляю с использованием функции C (проверенный с использованием некоторых онлайн-калькуляторов), не соответствует. В следующих параграфах я попытаюсь пойти шаг за шагом, следуя за всем процессом, который я выполнил.Расчет IAR linker CRC32 не совпадает с расчетом, рассчитанным в C (и в других сетях)

Я настроил линкер IAR, как это рекомендуется (мне так кажется, по крайней мере) в следующей ссылке: IAR documentation CRC links Дело в том, что я настроил его как в Рассчитать 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

код C Я использую для вычисления CRC базируется в одном объяснил здесь: CRC C code

Это пример конфигурации, используемой на одном из сайтов: CRC CONFIGURATION BASED ON THE STM32 EXAMPLE

Любая помощь будет по достоинству оценена.

Заранее спасибо.

Лучшие ребра.

Иван

+0

Я также пытался реализовать код C, данный IAR в следующей ссылке https://www.iar.com/support/tech-notes/general/c -source-for-crc32/ Но это тоже не работает. – Fulgor3

+0

Их [небольшое руководство по отладке CRC] (https://www.iar.com/support/tech-notes/general/debugging-checksum-calculations/) на самом деле очень хорошее. Вы должны посмотреть на это. –

+0

Наиболее вероятный источник проблемы (есть и другие возможности) - разные коды используют разные «полиномы», – user3629249

ответ

0

Почему вы думаете, что their code не работает? Каков ваш тест?

Это CRC-32, который использует многочлен 0x04c11db7 в прямом направлении, при этом исходный CRC равен 0xc704dd7b и не имеет окончательного эксклюзивного или. Таким образом, fast_crc32(0xc704dd7b, data, length) вернет CRC data[0..length-1].

0

Наконец-то я решил это. Я использовал этот код CRC32, приспособленный для моей цели: https://www.iar.com/support/tech-notes/general/c-source-for-crc32/

Во всех других моих попытках я использовал правую полиномиальный и перепробовал все конфигурации, используемые с другими платами в конфигурации линкера контрольной суммы IAR, но те не работают. Таким образом, конфигурация я использовал со значением инициализации в 0xFFFFFFFF и следующей конфигурации компоновщика IAR:

enter image description here

Я надеюсь, что это помогает. Это было очень редко из-за проблем, которые я реализовал с другими, я считаю, что правильные реализации CRC32.

С наилучшими пожеланиями,

ИВАН