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