Target 0 23 июля, 2019 Опубликовано 23 июля, 2019 · Жалоба В линкере IAR можно задать автоматическое вычисление контрольной суммы, только если стоит галка на заполнителе свободного места (filler). Причем адрес задается вручную в 16-ричных адресах. Можно ли как-нибудь сообщить этому филлеру реальный размер моей программы, чтобы лишнее не считал? Или можно ли как-нибудь в теле программы узнать те цифры (адрес конца), которые я в линкере ему прописал как окончание заполнения? Эта переменная значится как FiileEnd в файле ewp, но не знаю, можно ли ее как-то извлечь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 23 июля, 2019 Опубликовано 23 июля, 2019 · Жалоба 8 минут назад, Target сказал: Или можно ли как-нибудь в теле программы узнать те цифры (адрес конца), которые я в линкере ему прописал как окончание заполнения? Эта переменная значится как FiileEnd в файле ewp, но не знаю, можно ли ее как-то извлечь. extern "C" u8 const __checksum_begin[]; extern "C" u8 const __checksum_end[]; extern "C" u32 const __checksum; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Target 0 23 июля, 2019 Опубликовано 23 июля, 2019 · Жалоба Большое спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Target 0 23 июля, 2019 Опубликовано 23 июля, 2019 · Жалоба И еще вопрос: как эту переменную записать в бинарник? Вот это работает: __root const size_t flash_begin @ "flash_begin" = 0x08000000U; ... define block ROM_CONTENT with fixed order { readonly section flash_begin, ... place in ROM_region { block ROM_CONTENT }; А если аналогично заполняю checksum_end, то не работает extern size_t const __checksum_end; ... __root const size_t checksum_end @ "checksum_end" = __checksum_end; ... define block ROM_CONTENT with fixed order { readonly section checksum_end, ... Не выдает ошибок, но пишет: No sections matched the following patterns: ro section checksum_end in block ROM_CONTENT Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 23 июля, 2019 Опубликовано 23 июля, 2019 · Жалоба 17 минут назад, Target сказал: И еще вопрос: как эту переменную записать в бинарник? Какие переменные? Вы о чём??? __checksum_begin и __checksum_end - это начало и конец блока памяти, для которого IAR считает CRC. Вроде всё должно быть кристально ясно из объявления, которое я приводил. __checksum - константа, куда IAR кладёт эту CRC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Target 0 23 июля, 2019 Опубликовано 23 июля, 2019 · Жалоба Да, Ваше описание очень помогло. Есть загрузчик, который проверяет контрольную сумму прошивки. Сама контрольная сумма кладется средствами линкера в конец прошивки define block ROM_CONTENT with fixed order { readonly, readonly section .checksum }; place in ROM_region { block ROM_CONTENT }; Хотелось бы в это определение записать еще константу, где будет записан адрес, по которому эта контрольная сумма размещена, чтобы загрузчик сразу ее нашел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 23 июля, 2019 Опубликовано 23 июля, 2019 · Жалоба 2 минуты назад, Target сказал: Хотелось бы в это определение записать еще константу, где будет записан адрес, по которому эта контрольная сумма размещена, чтобы загрузчик сразу ее нашел. Так не пишите в конец, пишите в начало. Я, например, пишу CRC в один из неиспользуемых векторов таблицы прерываний в начале прошивки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Target 0 23 июля, 2019 Опубликовано 23 июля, 2019 · Жалоба Хотелось бы, чтобы CRC считалось компилятором и охватывало и таблицу прерываний тоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 23 июля, 2019 Опубликовано 23 июля, 2019 · Жалоба Так и считайте и охватывайте. Кто-ж Вам мешает??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Target 0 23 июля, 2019 Опубликовано 23 июля, 2019 · Жалоба Пока не могу решить вопрос, как __checksum_end автоматически поместить в код прошивки по определенному или известному адресу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 23 июля, 2019 Опубликовано 23 июля, 2019 · Жалоба 27 минут назад, Target сказал: Пока не могу решить вопрос, как __checksum_end автоматически поместить в код прошивки по определенному или известному адресу. Найти в свойствах проекта вкладку "Linker" и прописать там "Start address" и "End address" вместе с остальными параметрами расчёта CRC. А как ещё? Спойлер Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Target 0 23 июля, 2019 Опубликовано 23 июля, 2019 · Жалоба Сейчас в линкере прописаны эти start address и end address. CRC вычисляется и прописывается в конец программы. Но как сообщить загрузчику эти адреса? (он может их извлечь из тела прошивки, но как их прописать по определенному адресу или сказать прошивальщику, откуда извлекать?) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 23 июля, 2019 Опубликовано 23 июля, 2019 · Жалоба 5 минут назад, Target сказал: Но как сообщить загрузчику эти адреса? (он может их извлечь из тела прошивки, но как их прописать по определенному адресу или сказать прошивальщику, откуда извлекать?) Я же писал - поместить в начало прошивки. Например - в таблицу прерываний или сразу после неё. Где находится начало прошивки ваш загрузчик ведь знает? У меня в один вектор прописывается CRC32, а в другой - указатель на структуру, содержащую всякую инфу о прошивке, в том числе - адреса её начала/конца. Оттуда бутлоадер и читает. И код самопроверки при старте - тоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 23 июля, 2019 Опубликовано 23 июля, 2019 · Жалоба 2 часа назад, jcxz сказал: И код самопроверки при старте - тоже. Кстати, код самопроверки формируете в .icf-файле или его можно генерировать прямо в startup (если это возможно)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 23 июля, 2019 Опубликовано 23 июля, 2019 · Жалоба Зачем в startup? Есть же __low_level_init(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться