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

IAR 6.3.3 AVR адрес конца ПО

Привет

Никак не могу найти в документации на ИАР как узнать адрес конца ПО откомпилированного.

Например, контрольная сумма обозначается __checksum, начало ПО __program_start.

Есть еще дата и время компиляции __DATA__, __TIME__.

А как будет обозначаться конец ПО?

Команда линкеру: -J2,sum,1,,CODE,,,,,

Symbol      Checksum  Memory  Start      End       Initial value
------      --------  ------  -----      ---       -------------
__checksum    0xd551   CODE   00000000 - 000000E5  0x0000 (#0x0000)
                       CODE   000000E8 - 00001E21

мне надо посчитать КС до адреса 1Е21 (при изменении ПО будет меняться), где его взять в ПО?

 

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

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


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

Не знаю, как в IAR AVR, но в IAR ARM в руководстве есть глава, посвящённая вычислению контрольной суммы. Там всё очень подробно написано. Я сам по этому документу ни один раз делал вычисление КС. Попробуйте поискать в документации на Ваш компилятор то же самое.

image.thumb.png.60930d2f051c1b3a33ddb8ba47cbcdee.png

1 hour ago, const said:

мне надо посчитать КС до адреса 1Е21 (при изменении ПО будет меняться), где его взять в ПО?

Может быть как и в IAR ARM:

image.thumb.png.09ff5bb3bf2900e2124acc661dda81e4.png

Сами адреса начала и конца ПО, которое подлежит расчёту КС, указывается на вкладке настройки линковщика.

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


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

On 8/8/2023 at 6:32 PM, haker_fox said:

Сами адреса начала и конца ПО, которое подлежит расчёту КС, указывается на вкладке настройки линковщика.

Т.е. указывается вручную до куда будет считаться КС.

А если размер ПО окажется больше указанной вами величины ?

 

Вот тема была уже

https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=123397

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


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

В IAR ARM тоже использую КС, настройки и функции для подсчета CRC32 брал с этого форума (тыц). Все ок. Но там я прописываю диапазон адресов для подсчета (с запасом). Хотя хотелось бы и там считать КС только для используемой памяти. Но надо было «прямо сейчас» поэтому не заморачивался.

В IAR AVR читал такой раздел (файл прикрепляю) «Checksum calculation» - page 34 и «Descriptions of XLINK options» «-J» - page 50. Но все что смог «родить» (с некоторыми опциями):

-J2,sum,1,,CODE,,,,,

Если решения не найду, наверное, пойду таким путем. Строчку «-J2,sum,1,,CODE,,,,,» заменю на «-J2,sum,1,,CODE,,,,,={CODE}», тогда из подсчета КС выпадут пару областей (дома не установлен ИАР, могут быть неточности): таблица векторов, область «FILL» в начале, и еще пару областей в конце прошивки (таблицы инициализации и еще чот, там немного). Тогда конец подсчета КС будет совпадать с меткой __exit + 1. А области в начале прошивки можно исключить с помощью __section_size(название областей), по моему, в ИАР АВР как и в ИАР АРМ есть такой макрос (haker_fox подсказал в смежной теме). Если не так, там, вроде, есть еще какая-то метка, пропускающая первые области. Или добавить эти области в подсчет: "-J2,sum,1,,CODE,,,,,=0-FF,{CODE}" (FF - как пример, главное больше начальных областей, см. стр. 53 прикрепленного файла). Но хотелось бы узнать как в ПО получить адрес = «размер прошивки» - 1.

Пока писал сообщение пришла еще идея, так как количество и название областей неизменно, можно с помощью __section_size добавить смещения до конца файла. Хотя вспоминаю, там есть «упакованные» области (название со спец символами) и их добавлять не получалось - выдавало ошибку. Еще надо попробовать.

З.Ы. "-J2,sum,1,,CODE,,,,," - приведено как пример, для удобства проверки, после экспериментов будет использована другая КС.

Забыл. to haker_fox. __checksum_begin и __checksum_end нету, есть какие-то CHECKSUM_START и CHECKSUM_END (стр. 52), но их ПО не видит(

xlink.ENU.pdf

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

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


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

9 hours ago, dimka76 said:

А если размер ПО окажется больше указанной вами величины ?

Не проверял. Принял для себя, что нужно указать внимательно, и всё. Плюс, в скрипте линкера указал область памяти FLASH по максимальному размеру ПО. Затем всё скопировал на вкладку линковщика. Проверил глазками ещё раз. Поэтому, если размер ПО окажется больше, линковщик выругается, и не соберёт исполняемый файл.

8 hours ago, const said:

Хотя хотелось бы и там считать КС только для используемой памяти.

Простите, но зачем? Что изменится от того, что неиспользуемая в данный момент памяти тоже войдёт в расчёт? Но если сильно нужно, вряд ли можно решить проблему стандартными (через настройки GUI) средствами. Самое время осваивать интерпретируемый язык (make, python и т.п.) и писать скрипт сборки проекта самостоятельно. Я бы таким путём пошёл.

8 hours ago, const said:

Забыл. to haker_fox.

К слову, если обращаетесь по нику, то лучше писать его с символа "собака", вот так: @haker_fox. Тогда я увижу у себя уведомление, что кто-то сослался на меня. Да и выглядит это более красиво в тексте сообщения🙂

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


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

4 hours ago, haker_fox said:

Простите, но зачем?

Что бы не лить через загрузчик по CAN лишние кбайты. И что бы одна и та же прошивка для разных МК имела одну и туже КС (имею ввиду ATmeg-и, у них есть модели с объемом 32/64/128).

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

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


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

Не очень мне нравится, но остановился на таком варианте:

-J2,sum,1,,CODE,,,,,=0-3FF,{CODE} // при этом не считаются последние сегменты во флеш (<FAR_F> 1, INITTAB, NEAR_ID), что то 80 байт

В коде

extern void (__exit)(int); // как переменная не хотело объявляться
extern uint16_t __flash __checksum; // хранится не в конце прошивки, а в начале
uint16_t sz = ((uint16_t)__exit + 1) * 2;

Разве, что способ подсчета КС поменяю.

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

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


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

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

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

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

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

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

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

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

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

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