Jump to content

    
l_fin_l

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

Recommended Posts

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

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

 

Share this post


Link to post
Share on other sites
19 minutes ago, l_fin_l said:

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

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

Share this post


Link to post
Share on other sites
13 минут назад, AlexandrY сказал:

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

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

 

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

Edited by l_fin_l

Share this post


Link to post
Share on other sites
4 минуты назад, AlexandrY сказал:

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


extern uint32_t __checksum;

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

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

Share this post


Link to post
Share on other sites
Just now, l_fin_l said:

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

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

Share this post


Link to post
Share on other sites
6 минут назад, AlexandrY сказал:

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

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

image.thumb.png.f0dae59a3e086608a567019f3b8b5c70.png

Share this post


Link to post
Share on other sites
2 minutes ago, l_fin_l said:

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

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

Share this post


Link to post
Share on other sites
34 минуты назад, AlexandrY сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites
22 минуты назад, l_fin_l сказал:

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

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

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

 

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

Share this post


Link to post
Share on other sites
4 минуты назад, mantech сказал:

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

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

image.png.06d18528dc62c5051699d64db5cd790a.png

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

Share this post


Link to post
Share on other sites
1 минуту назад, l_fin_l сказал:

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

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

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

extern uint32_t __checksum;

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

Share this post


Link to post
Share on other sites
8 минут назад, mantech сказал:

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

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

image.thumb.png.5b7f1ea9cf37d906b67f721f471e3a70.png

 

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

image.thumb.png.6c8bd64d3137b2215caa317bdb2975bb.png

Edited by l_fin_l

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.