const 1 8 августа, 2023 Опубликовано 8 августа, 2023 (изменено) · Жалоба Привет Никак не могу найти в документации на ИАР как узнать адрес конца ПО откомпилированного. Например, контрольная сумма обозначается __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 (при изменении ПО будет меняться), где его взять в ПО? Изменено 8 августа, 2023 пользователем const Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба Не знаю, как в IAR AVR, но в IAR ARM в руководстве есть глава, посвящённая вычислению контрольной суммы. Там всё очень подробно написано. Я сам по этому документу ни один раз делал вычисление КС. Попробуйте поискать в документации на Ваш компилятор то же самое. 1 hour ago, const said: мне надо посчитать КС до адреса 1Е21 (при изменении ПО будет меняться), где его взять в ПО? Может быть как и в IAR ARM: Сами адреса начала и конца ПО, которое подлежит расчёту КС, указывается на вкладке настройки линковщика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 8 августа, 2023 Опубликовано 8 августа, 2023 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
const 1 8 августа, 2023 Опубликовано 8 августа, 2023 (изменено) · Жалоба В 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 Изменено 8 августа, 2023 пользователем const Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 9 августа, 2023 Опубликовано 9 августа, 2023 · Жалоба 9 hours ago, dimka76 said: А если размер ПО окажется больше указанной вами величины ? Не проверял. Принял для себя, что нужно указать внимательно, и всё. Плюс, в скрипте линкера указал область памяти FLASH по максимальному размеру ПО. Затем всё скопировал на вкладку линковщика. Проверил глазками ещё раз. Поэтому, если размер ПО окажется больше, линковщик выругается, и не соберёт исполняемый файл. 8 hours ago, const said: Хотя хотелось бы и там считать КС только для используемой памяти. Простите, но зачем? Что изменится от того, что неиспользуемая в данный момент памяти тоже войдёт в расчёт? Но если сильно нужно, вряд ли можно решить проблему стандартными (через настройки GUI) средствами. Самое время осваивать интерпретируемый язык (make, python и т.п.) и писать скрипт сборки проекта самостоятельно. Я бы таким путём пошёл. 8 hours ago, const said: Забыл. to haker_fox. К слову, если обращаетесь по нику, то лучше писать его с символа "собака", вот так: @haker_fox. Тогда я увижу у себя уведомление, что кто-то сослался на меня. Да и выглядит это более красиво в тексте сообщения🙂 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
const 1 9 августа, 2023 Опубликовано 9 августа, 2023 (изменено) · Жалоба 4 hours ago, haker_fox said: Простите, но зачем? Что бы не лить через загрузчик по CAN лишние кбайты. И что бы одна и та же прошивка для разных МК имела одну и туже КС (имею ввиду ATmeg-и, у них есть модели с объемом 32/64/128). Изменено 9 августа, 2023 пользователем const Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
const 1 9 августа, 2023 Опубликовано 9 августа, 2023 (изменено) · Жалоба Не очень мне нравится, но остановился на таком варианте: -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; Разве, что способ подсчета КС поменяю. Изменено 9 августа, 2023 пользователем const Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться