Перейти к содержанию
    

Подсчет контрольной суммы прошивки stm32f103 средствами линкера в IAR

Добрый день, генерирую 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;
   	}

   	// ...
}

На всякий случай приложу скрин настроек линкера:

image.thumb.png.92eeaba462e5b74d5043887b1463803c.png

При сравнении контрольных сумм расчитанных линкером и аппаратным CRC модулем stm32, получаю такую картину, в Hex-виде они идентичны:

 image.png.225edebcc3d7d9e597cd9c2b3b746729.png

а в десятичном виде они разные:

image.png.1c3865c0fdb0964a779fc317d69426b3.png

Как так получается, что контрольная сумма рассчитывается отрицательная, я так и не понял. Буду благодарен за любую помощь.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 minutes ago, l_fin_l said:

Как так получается, что контрольная сумма рассчитывается отрицательная, я так и не понял. Буду благодарен за любую помощь.

Так быть не может.
Похоже листинг показываете новый, а отладочную инфу старую. Перекомпилируйте и залейте заново весь проект. 
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, AlexandrY сказал:

Так быть не может.
Похоже листинг показываете новый, а отладочную инфу старую. Перекомпилируйте и залейте заново весь проект. 
 

Пересобрал проект:

 

Безымянный.png

Изменено пользователем l_fin_l

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Значит неправильно объявили 

extern uint32_t __checksum;

__checksum - это знаковая переменная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, AlexandrY сказал:

Значит неправильно объявили 


extern uint32_t __checksum;

__checksum - это знаковая переменная.

я это вижу, просто мне не понятно, а как тогда считать crc32 самим мк, чтобы эти две суммы совпали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, l_fin_l said:

я это вижу, просто мне не понятно, а как тогда считать crc32 самим мк, чтобы эти две суммы совпали.

Они же у вас совпадают.
Просто дебагер в десятичном представлении показывает __checksum со знаком потому что считает эту переменную знаковой. 
Переключитесь на шестнадцатеричное представление и смотрите значение CRC только в нем.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, AlexandrY сказал:

Переключитесь на шестнадцатеричное представление и смотрите значение CRC только в нем.  

в отладчике-то я могу переключить представление в hex, но в коде он все-равно не совпадает

image.thumb.png.f0dae59a3e086608a567019f3b8b5c70.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, l_fin_l said:

в отладчике-то я могу переключить представление в hex, но в коде он все-равно не совпадает

По ходу у вас еще где-то объявлена паразитная переменная  __checksum
Эт бывает, провалы в памяти, где-то вставили чего-то лишнего и забыли. 
Просканируете весь код на предмет поиска слова __checksum 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

34 минуты назад, AlexandrY сказал:

__checksum - это знаковая переменная.

С каких пор uint32_t стала знаковой?  В таком случае что за int32_t  ?

18 минут назад, l_fin_l сказал:

в отладчике-то я могу переключить представление в hex, но в коде он все-равно не совпадает

У вас проверку-то делает не отладчик, а прога на МК, вот и выведите printf("0x%08x,0x%08x\n",crc32,__checksum);  И посмотрите, так ли это...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, AlexandrY сказал:

Просканируете весь код на предмет поиска слова __checksum

Просканировал, все норм

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 минуты назад, l_fin_l сказал:

в отладчике-то я могу переключить представление в hex, но в коде он все-равно не совпадает

В окне Watch - совпадает.

Насчёт кода: переключитесь в окно дизасма и протрассируйте. Вангую включение оптимизации и её влияние. Как всегда впрочем.  :unknw:

 

PS: Если хотите отлаживаться с оптимизацией - то только с открытым окном дизасма.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, mantech сказал:

У вас проверку-то делает не отладчик, а прога на МК, вот и выведите printf("0x%08x,0x%08x\n",crc32,__checksum);  И посмотрите, так ли это...

да тут даже по отладчику видно, что разные типы

image.png.06d18528dc62c5051699d64db5cd790a.png

вот я и немогу понять почему(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, l_fin_l сказал:

вот я и немогу понять почему(

Если неохота парится, сделайте свою функцию расчета тоже знаковой...

1 час назад, l_fin_l сказал:

extern uint32_t __checksum;

Кстати, на это ИАР не ругается? Неправильный тип и все такое?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 минут назад, mantech сказал:

Кстати, на это ИАР не ругается? Неправильный тип и все такое?

нет, не ругается, в документации так и написано:

image.thumb.png.5b7f1ea9cf37d906b67f721f471e3a70.png

 

Сейчас отключил оптимизацию, вроде работает все верно, но я все-равно понять не могу почему __checksum типа int:

image.thumb.png.6c8bd64d3137b2215caa317bdb2975bb.png

Изменено пользователем l_fin_l

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...