l_fin_l 0 5 апреля, 2021 Опубликовано 5 апреля, 2021 · Жалоба Добрый день, генерирую crc32 прошивки при помощи IAR EWARM 8.30.1, следуя инструкциям из этого аппноута - https://www.iar.com/knowledge/support/technical-notes/general/calculate-crc32-as-in-stm32-hardware-v.5.50-and-later/. Полученный код выглядит следующим образом: // Контрольная сумма прошивки extern uint32_t __checksum; volatile uint32_t crc32 = 0; int32_t checksum_match = -1; uint32_t calcCrc32(uint8_t* data, uint32_t len); uint32_t calcCrc32(uint8_t* data, uint32_t len) { uint32_t* pBuffer = (uint32_t*) data; uint32_t BufferLength = len/4; uint32_t index = 0; RCC->AHBENR |= RCC_AHBENR_CRCEN; CRC->CR |= CRC_CR_RESET; for(index = 0; index < BufferLength; index++) { CRC->DR = pBuffer[index]; } return CRC->DR; } int main(void) { //... crc32 = calcCrc32((uint8_t*)0x08000000, 0x020000 - 4); if (crc32 == __checksum) { checksum_match = 1; } else { checksum_match = 0; } // ... } На всякий случай приложу скрин настроек линкера: При сравнении контрольных сумм расчитанных линкером и аппаратным CRC модулем stm32, получаю такую картину, в Hex-виде они идентичны: а в десятичном виде они разные: Как так получается, что контрольная сумма рассчитывается отрицательная, я так и не понял. Буду благодарен за любую помощь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 5 апреля, 2021 Опубликовано 5 апреля, 2021 · Жалоба Представление отрицательных чисел в памяти Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 5 апреля, 2021 Опубликовано 5 апреля, 2021 · Жалоба 19 minutes ago, l_fin_l said: Как так получается, что контрольная сумма рассчитывается отрицательная, я так и не понял. Буду благодарен за любую помощь. Так быть не может. Похоже листинг показываете новый, а отладочную инфу старую. Перекомпилируйте и залейте заново весь проект. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
l_fin_l 0 5 апреля, 2021 Опубликовано 5 апреля, 2021 (изменено) · Жалоба 13 минут назад, AlexandrY сказал: Так быть не может. Похоже листинг показываете новый, а отладочную инфу старую. Перекомпилируйте и залейте заново весь проект. Пересобрал проект: Изменено 5 апреля, 2021 пользователем l_fin_l Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 5 апреля, 2021 Опубликовано 5 апреля, 2021 · Жалоба Значит неправильно объявили extern uint32_t __checksum; __checksum - это знаковая переменная. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
l_fin_l 0 5 апреля, 2021 Опубликовано 5 апреля, 2021 · Жалоба 4 минуты назад, AlexandrY сказал: Значит неправильно объявили extern uint32_t __checksum; __checksum - это знаковая переменная. я это вижу, просто мне не понятно, а как тогда считать crc32 самим мк, чтобы эти две суммы совпали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 5 апреля, 2021 Опубликовано 5 апреля, 2021 · Жалоба Just now, l_fin_l said: я это вижу, просто мне не понятно, а как тогда считать crc32 самим мк, чтобы эти две суммы совпали. Они же у вас совпадают. Просто дебагер в десятичном представлении показывает __checksum со знаком потому что считает эту переменную знаковой. Переключитесь на шестнадцатеричное представление и смотрите значение CRC только в нем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
l_fin_l 0 5 апреля, 2021 Опубликовано 5 апреля, 2021 · Жалоба 6 минут назад, AlexandrY сказал: Переключитесь на шестнадцатеричное представление и смотрите значение CRC только в нем. в отладчике-то я могу переключить представление в hex, но в коде он все-равно не совпадает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 5 апреля, 2021 Опубликовано 5 апреля, 2021 · Жалоба 2 minutes ago, l_fin_l said: в отладчике-то я могу переключить представление в hex, но в коде он все-равно не совпадает По ходу у вас еще где-то объявлена паразитная переменная __checksum Эт бывает, провалы в памяти, где-то вставили чего-то лишнего и забыли. Просканируете весь код на предмет поиска слова __checksum Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 34 5 апреля, 2021 Опубликовано 5 апреля, 2021 · Жалоба 34 минуты назад, AlexandrY сказал: __checksum - это знаковая переменная. С каких пор uint32_t стала знаковой? В таком случае что за int32_t ? 18 минут назад, l_fin_l сказал: в отладчике-то я могу переключить представление в hex, но в коде он все-равно не совпадает У вас проверку-то делает не отладчик, а прога на МК, вот и выведите printf("0x%08x,0x%08x\n",crc32,__checksum); И посмотрите, так ли это... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
l_fin_l 0 5 апреля, 2021 Опубликовано 5 апреля, 2021 · Жалоба 16 минут назад, AlexandrY сказал: Просканируете весь код на предмет поиска слова __checksum Просканировал, все норм Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 5 апреля, 2021 Опубликовано 5 апреля, 2021 · Жалоба 22 минуты назад, l_fin_l сказал: в отладчике-то я могу переключить представление в hex, но в коде он все-равно не совпадает В окне Watch - совпадает. Насчёт кода: переключитесь в окно дизасма и протрассируйте. Вангую включение оптимизации и её влияние. Как всегда впрочем. PS: Если хотите отлаживаться с оптимизацией - то только с открытым окном дизасма. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
l_fin_l 0 5 апреля, 2021 Опубликовано 5 апреля, 2021 · Жалоба 4 минуты назад, mantech сказал: У вас проверку-то делает не отладчик, а прога на МК, вот и выведите printf("0x%08x,0x%08x\n",crc32,__checksum); И посмотрите, так ли это... да тут даже по отладчику видно, что разные типы вот я и немогу понять почему( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 34 5 апреля, 2021 Опубликовано 5 апреля, 2021 · Жалоба 1 минуту назад, l_fin_l сказал: вот я и немогу понять почему( Если неохота парится, сделайте свою функцию расчета тоже знаковой... 1 час назад, l_fin_l сказал: extern uint32_t __checksum; Кстати, на это ИАР не ругается? Неправильный тип и все такое? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
l_fin_l 0 5 апреля, 2021 Опубликовано 5 апреля, 2021 (изменено) · Жалоба 8 минут назад, mantech сказал: Кстати, на это ИАР не ругается? Неправильный тип и все такое? нет, не ругается, в документации так и написано: Сейчас отключил оптимизацию, вроде работает все верно, но я все-равно понять не могу почему __checksum типа int: Изменено 5 апреля, 2021 пользователем l_fin_l Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться