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

Расчет CRC16 для прошивки

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

Хочу немного его усовершенствовать - считать CRC для всей прошивки, записывать ее во флеш, а при загрузке проверять целостность прошивки - на случай если вдруг последняя прошивка не удалась или просто слетела в процессе работы. В этом случае выдается приглашение на перепрошивку.

 

Скажите, можно ли считать CRC16 для всей прошивки просто суммируя CRC каждого пакета, расчет которого уже реализован? Или это принципиально неправильно?

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


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

Или это принципиально неправильно?

принципиально неправильно!

 

https://opensource.apple.com/source/xnu/xnu...c16.c.auto.html

 

uint16_t crc = crc16(0, buffer1, len1);

crc = crc16(crc, buffer2, len2);

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


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

Хм... что-то я туплю..

Где я ошибся.

 

Пишу переменные FIRMWARE_CRC16 типа uint16_t и Size типа uint32_t вот так

 

page_address=FLASH_BASE+126*2048;

FLASH_Unlock();

flash_status=FLASH_ErasePage(page_address);

flash_status=FLASH_ProgramWord(page_address,FIRMWARE_CRC16);

flash_status=FLASH_ProgramWord(page_address+2,Size);

FLASH_Lock();

 

При чтении

 

flash_data=flash_read(page_address);

WRITTEN_FIRMWARE_CRC16=flash_data & 0xFFFF;

flash_data=flash_read(page_address+2);

FIRMWARE_SIZE=flash_data & 0xFFFFFFFF;

 

неправильно читается FIRMWARE_SIZE.

Правильно она читается лишь в том случае, если ее читать и писать по адресу page_address+4

 

Мне непонятно - ведь uint16_t занимает 2 байта а не 4.

Во вторых, если бы page_address+2 было неверным смещением адреса, то затиралась бы WRITTEN_FIRMWARE_CRC16, но ошибка не в ней, а в FIRMWARE_SIZE.

 

Как это понять?

 

 

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


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

Мне непонятно - ведь uint16_t занимает 2 байта а не 4.

Скорее всего в вашу флэш можно писать 32-битными словами.

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


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

Скорее всего в вашу флэш можно писать 32-битными словами.

Может быть, но если я убираю строку записи первого, 16-ти битного слова, то все нормально - 32-битное и пишется и читается правильно.

 

СТранно, что процедура записи вызываемая первой строкой, портит то, что записывается второй строкой.

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

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


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

Безнадёжно.

 

FLASH_Status FLASH_ProgramWord (uint32_t Address, uint32_t Data)

Programs a word (32-bit) at a specified address.

 

Тридцать два. ТРИД-ЦАТЬ ДВА. Не шестнадцать.

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


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

Есауленко, ну еще картинку мне приложите, как выглядит число 32. Нарисуйте 32 хомячка для наглядности.

 

Смысл Вашего поста?

 

У меня было предположение, что из-за 32-х битности записи, писать можно только по адресу, кратному 4-байтам. Но нет же, можно писать по адресу page_address+2 и данные получаются корректными.

 

Я не пойму, почему, когда я ПЕРЕД этим пишу по адрсесу page_address+0, не происходит корректной записи по адресу page_address+2 ?

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


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

Я не пойму, почему, когда я ПЕРЕД этим пишу по адрсесу page_address+0, не происходит корректной записи по адресу page_address+2 ?

Потому что первой записью вы уже записали 32 бита (4 байта). А второй записью вы пытаетесь записать что-то поверх (в третий и четвёртый байты).

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


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

Потому что первой записью вы уже записали 32 бита (4 байта). А второй записью вы пытаетесь записать что-то поверх (в третий и четвёртый байты).

 

И порчу при этом первую запись.

Но первая запись у меня всегда ПРАВИЛЬНАЯ!

А страдает ВТОРАЯ.

 

Вот в чем заковырка)))

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


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

И порчу при этом первую запись.

Но первая запись у меня всегда ПРАВИЛЬНАЯ!

А страдает ВТОРАЯ.

 

Вот в чем заковырка)))

Так первое слово у вас двухбайтное, поэтому оно не портится.

А портится четырехбайтное слово потому, что по адресу page_address+2 значения, отличные от 0xFF, из-за первой записи.

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


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

А вторая запись разве их не перезаписывает?

При записи флеш памяти её биты могут только устанавливаться в 0.

То есть стёрли страницу - все биты в 1. Записываем - нужные биты сбрасываются в 0.

Если у вас после первой записи содержимое по адресу +2 будет отличаться от 0xFFFFFFFF, то последующая запись будет неверной.

 

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


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

А вторая запись разве их не перезаписывает?

Нет конечно... все как выше написали... только из 1 в 0

а у вас там итак будут нули, после первой записи 32-битного значения...

 

просто, поменяйте просто местами Size и FIRMWARE_CRC16,

ну или так, если требуется именно такая последовательность:

page_address=FLASH_BASE+126*2048; 
FLASH_Unlock();
flash_status=FLASH_ErasePage(page_address);
flash_status=FLASH_ProgramWord(page_address, (Size << 16) | FIRMWARE_CRC16);
flash_status=FLASH_ProgramWord(page_address+4,Size >> 16);
FLASH_Lock();

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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