zheka 1 8 июля, 2017 Опубликовано 8 июля, 2017 · Жалоба Есть у меня бутлодер, в котором расчитывается CRC16 для каждого принятого пакета. Хочу немного его усовершенствовать - считать CRC для всей прошивки, записывать ее во флеш, а при загрузке проверять целостность прошивки - на случай если вдруг последняя прошивка не удалась или просто слетела в процессе работы. В этом случае выдается приглашение на перепрошивку. Скажите, можно ли считать CRC16 для всей прошивки просто суммируя CRC каждого пакета, расчет которого уже реализован? Или это принципиально неправильно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
UniSoft 15 8 июля, 2017 Опубликовано 8 июля, 2017 · Жалоба Или это принципиально неправильно? принципиально неправильно! https://opensource.apple.com/source/xnu/xnu...c16.c.auto.html uint16_t crc = crc16(0, buffer1, len1); crc = crc16(crc, buffer2, len2); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 8 июля, 2017 Опубликовано 8 июля, 2017 · Жалоба buffer1 и buffer2 - это последовательность пакетов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 8 июля, 2017 Опубликовано 8 июля, 2017 · Жалоба Разобрался. Спасибо. Проверил в кристалле - все ОК. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 8 июля, 2017 Опубликовано 8 июля, 2017 · Жалоба Хм... что-то я туплю.. Где я ошибся. Пишу переменные 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. Как это понять? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 79 8 июля, 2017 Опубликовано 8 июля, 2017 · Жалоба Мне непонятно - ведь uint16_t занимает 2 байта а не 4. Скорее всего в вашу флэш можно писать 32-битными словами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 8 июля, 2017 Опубликовано 8 июля, 2017 (изменено) · Жалоба Скорее всего в вашу флэш можно писать 32-битными словами. Может быть, но если я убираю строку записи первого, 16-ти битного слова, то все нормально - 32-битное и пишется и читается правильно. СТранно, что процедура записи вызываемая первой строкой, портит то, что записывается второй строкой. Изменено 8 июля, 2017 пользователем zheka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 8 июля, 2017 Опубликовано 8 июля, 2017 · Жалоба Безнадёжно. FLASH_Status FLASH_ProgramWord (uint32_t Address, uint32_t Data) Programs a word (32-bit) at a specified address. Тридцать два. ТРИД-ЦАТЬ ДВА. Не шестнадцать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 8 июля, 2017 Опубликовано 8 июля, 2017 · Жалоба Есауленко, ну еще картинку мне приложите, как выглядит число 32. Нарисуйте 32 хомячка для наглядности. Смысл Вашего поста? У меня было предположение, что из-за 32-х битности записи, писать можно только по адресу, кратному 4-байтам. Но нет же, можно писать по адресу page_address+2 и данные получаются корректными. Я не пойму, почему, когда я ПЕРЕД этим пишу по адрсесу page_address+0, не происходит корректной записи по адресу page_address+2 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 8 июля, 2017 Опубликовано 8 июля, 2017 · Жалоба Я не пойму, почему, когда я ПЕРЕД этим пишу по адрсесу page_address+0, не происходит корректной записи по адресу page_address+2 ? Потому что первой записью вы уже записали 32 бита (4 байта). А второй записью вы пытаетесь записать что-то поверх (в третий и четвёртый байты). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 8 июля, 2017 Опубликовано 8 июля, 2017 · Жалоба Потому что первой записью вы уже записали 32 бита (4 байта). А второй записью вы пытаетесь записать что-то поверх (в третий и четвёртый байты). И порчу при этом первую запись. Но первая запись у меня всегда ПРАВИЛЬНАЯ! А страдает ВТОРАЯ. Вот в чем заковырка))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 8 июля, 2017 Опубликовано 8 июля, 2017 · Жалоба И порчу при этом первую запись. Но первая запись у меня всегда ПРАВИЛЬНАЯ! А страдает ВТОРАЯ. Вот в чем заковырка))) Так первое слово у вас двухбайтное, поэтому оно не портится. А портится четырехбайтное слово потому, что по адресу page_address+2 значения, отличные от 0xFF, из-за первой записи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 8 июля, 2017 Опубликовано 8 июля, 2017 · Жалоба А вторая запись разве их не перезаписывает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 8 июля, 2017 Опубликовано 8 июля, 2017 · Жалоба А вторая запись разве их не перезаписывает? При записи флеш памяти её биты могут только устанавливаться в 0. То есть стёрли страницу - все биты в 1. Записываем - нужные биты сбрасываются в 0. Если у вас после первой записи содержимое по адресу +2 будет отличаться от 0xFFFFFFFF, то последующая запись будет неверной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
UniSoft 15 9 июля, 2017 Опубликовано 9 июля, 2017 · Жалоба А вторая запись разве их не перезаписывает? Нет конечно... все как выше написали... только из 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(); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться