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

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

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

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

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


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

8 минут назад, Target сказал:

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

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

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


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

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

 

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

__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
 

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


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

17 минут назад, Target сказал:

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

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

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

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

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


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

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

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

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

place in ROM_region { block ROM_CONTENT };

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


 

 

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


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

2 минуты назад, Target сказал:

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

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

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


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

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

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


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

27 минут назад, Target сказал:

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

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

Спойлер

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

 

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


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

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

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

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


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

5 минут назад, Target сказал:

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

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

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

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


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

2 часа назад, jcxz сказал:

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

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

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


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

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

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

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

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

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

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

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

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

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