Jump to content

    

Автоматизация вычисления контрольной суммы

В линкере IAR можно задать автоматическое вычисление контрольной суммы, только если стоит галка на заполнителе свободного места (filler). Причем адрес задается вручную в 16-ричных адресах.

Можно ли как-нибудь сообщить этому филлеру реальный размер моей программы, чтобы лишнее не считал?
Или можно ли как-нибудь в теле программы узнать те цифры (адрес конца), которые я в линкере ему прописал как окончание заполнения? Эта переменная значится как FiileEnd в файле ewp, но не знаю, можно ли ее как-то извлечь.

Share this post


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

Или можно ли как-нибудь в теле программы узнать те цифры (адрес конца), которые я в линкере ему прописал как окончание заполнения? Эта переменная значится как FiileEnd в файле ewp, но не знаю, можно ли ее как-то извлечь.

extern "C" u8 const __checksum_begin[];
extern "C" u8 const __checksum_end[];
extern "C" u32 const __checksum;

Share this post


Link to post
Share on other sites

И еще вопрос: как эту переменную записать в бинарник?

 

Вот это работает:

__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
 

Share this post


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

И еще вопрос: как эту переменную записать в бинарник?

Какие переменные? Вы о чём???  :wacko2:

__checksum_begin и __checksum_end - это начало и конец блока памяти, для которого IAR считает CRC. Вроде всё должно быть кристально ясно из объявления, которое я приводил.

__checksum - константа, куда IAR кладёт эту CRC.

Share this post


Link to post
Share on other sites

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

Сама контрольная сумма кладется средствами линкера в конец прошивки

define block ROM_CONTENT with fixed order
{
 readonly,
 readonly section .checksum
};

place in ROM_region { block ROM_CONTENT };

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


 

 

Share this post


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

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

Так не пишите в конец, пишите в начало. Я, например, пишу CRC в один из неиспользуемых векторов таблицы прерываний в начале прошивки.

Share this post


Link to post
Share on other sites

Хотелось бы, чтобы CRC считалось компилятором и охватывало и таблицу прерываний тоже.

Share this post


Link to post
Share on other sites

Так и считайте и охватывайте. Кто-ж Вам мешает???

Share this post


Link to post
Share on other sites

Пока не могу решить вопрос, как __checksum_end автоматически поместить в код прошивки по определенному или известному адресу.

Share this post


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

Пока не могу решить вопрос, как __checksum_end автоматически поместить в код прошивки по определенному или известному адресу.

Найти в свойствах проекта вкладку "Linker" и прописать там "Start address" и "End address" вместе с остальными параметрами расчёта CRC. А как ещё?

Спойлер

2019-07-23_17-31-22.thumb.png.2623583471aee8a428770875fad7d88a.png

 

Share this post


Link to post
Share on other sites

Сейчас в линкере прописаны эти start address и end address. CRC вычисляется и прописывается в конец программы.

Но как сообщить загрузчику эти адреса? (он может их извлечь из тела прошивки, но как их прописать по определенному адресу или сказать прошивальщику, откуда извлекать?)
 

Share this post


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

Но как сообщить загрузчику эти адреса? (он может их извлечь из тела прошивки, но как их прописать по определенному адресу или сказать прошивальщику, откуда извлекать?)

Я же писал - поместить в начало прошивки. Например - в таблицу прерываний или сразу после неё. Где находится начало прошивки ваш загрузчик ведь знает?

У меня в один вектор прописывается CRC32, а в другой - указатель на структуру, содержащую всякую инфу о прошивке, в том числе - адреса её начала/конца. Оттуда бутлоадер и читает. И код самопроверки при старте - тоже.

Share this post


Link to post
Share on other sites
2 часа назад, jcxz сказал:

И код самопроверки при старте - тоже.

Кстати, код самопроверки формируете в .icf-файле или его можно генерировать прямо в startup (если это возможно)?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now