viakon 0 8 декабря, 2015 Опубликовано 8 декабря, 2015 · Жалоба Если ставлю -Xlinker --gc-sections выкидывает бутлоадер. Как объяснить линкеру что некоторые секции выбрасывать нельзя? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 8 декабря, 2015 Опубликовано 8 декабря, 2015 · Жалоба SECTIONS { .text : { KEEP(*(.loader.enter)); /* тут имя секции со стартовой функцией бутлоадера */ Неясно впрочем, у вас бутлоадер линкуется вместе с программой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 8 декабря, 2015 Опубликовано 8 декабря, 2015 · Жалоба у вас бутлоадер линкуется вместе с программой?Присоединяюсь к вопросу. Во избежание сюрпризов их лучше хранить отдельно и при необходимости склеивать вместе выходные .hex непосредственно перед прошивкой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viakon 0 8 декабря, 2015 Опубликовано 8 декабря, 2015 · Жалоба Неясно впрочем, у вас бутлоадер линкуется вместе с программой? Есть вариант когда вместе, удобнее отлаживать все разом. В данном случае отдельно. Но основная программа вызывает функцию в бутлодыре, вот ее при компиляции и выкидывает. пробовал KEEP все равно выкидывает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 8 декабря, 2015 Опубликовано 8 декабря, 2015 · Жалоба Есть вариант когда вместе, удобнее отлаживать все разом. В данном случае отдельно. Но основная программа вызывает функцию в бутлодыре, вот ее при компиляции и выкидывает. пробовал KEEP все равно выкидывает. Ну значит надо добавить эту функцию в KEEP. Если не получается - попробуйте сократить пример до минимального и выложить. Кстати насчет совместной линковки - как минимум не должно быть двух функций main, нужны отдельные копии всех функций из стандартной библиотеки (а часть арифметики к примеру реализована в виде функций), возможно еще что-то. И зачем отлаживать совместно? В программе делаете некую заглушку, куда приходите по команде "вызвать загрузчик" и отлаживаете себе отдельно от загрузчика... Даже если вам остро необходим загрузчик, возможно проще будет сделать бинарный образ загрузчика (скомпилированного отдельно) и этот образ прилинковывать к основной программе. Линковать вместе - это просто поход по граблям... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viakon 0 8 декабря, 2015 Опубликовано 8 декабря, 2015 (изменено) · Жалоба Ну значит надо добавить эту функцию в KEEP. Можно поподробнее как это делается. Линковать вместе - это просто поход по граблям... В чем грабли то? Если загрузчик состоит всего из нескольких функций, то несложно прямо указать их расположение в секции BOOTLOADER. Вот проект с загрузчиком на базе LWIP это да, все функции пометить префиксом BOOTLOADER та еще работа и можно что-нибудь пропустить. Изменено 8 декабря, 2015 пользователем viakon Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 8 декабря, 2015 Опубликовано 8 декабря, 2015 · Жалоба В чем грабли то? 1) Библиотечные функции. Если компилятор их решил использовать, то у загрузчика они должны быть свои. А это может быть что угодно - арифметика, ветвление по таблице, пролог/эпилог функций и т.д. 2) Неловкое движение может сделать вашу программу несовместимой с загрузчиками старых версий в предыдущих версиях уже проданного железа. При этом она будет дружить с последней версией загрузчика, вместе с которой собирается 3) потом их все равно надо разделить, чтобы послать пользователям только приложение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 8 декабря, 2015 Опубликовано 8 декабря, 2015 · Жалоба Можно поподробнее как это делается. Я ж писал выше - KEEP(*(xxx)), где xxx - имя секции с этой функцией. Его можно посмотреть в map-файле но опять же, если загрузчик тривиальный, сделайте заглушку Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viakon 0 8 декабря, 2015 Опубликовано 8 декабря, 2015 · Жалоба 1) Библиотечные функции. Если компилятор их решил использовать, то у загрузчика они должны быть свои. А это может быть что угодно - арифметика, ветвление по таблице, пролог/эпилог функций и т.д. Простенький бут обходится без библиотечных функций. 2) Неловкое движение может сделать вашу программу несовместимой с загрузчиками старых версий в предыдущих версиях уже проданного железа. При этом она будет дружить с последней версией загрузчика, вместе с которой собирается У меня обычно вызов только одной функции из основной программы, она размещается в отдельной секции, и никаких проблем с совместимостью. 3) потом их все равно надо разделить, чтобы послать пользователям только приложение. Ну а это то вообще элементарно, основная программа в секциях isr_vector, text и data arm-none-eabi-objcopy -O binary -j .isr_vector -j .text -j .data В результате бут по CSD звонку обновляет программу. Я ж писал выше - KEEP(*(xxx)), где xxx - имя секции с этой функцией. Его можно посмотреть в map-файле но опять же, если загрузчик тривиальный, сделайте заглушку Да пробовал я KEEP, выкидывает :(. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 8 декабря, 2015 Опубликовано 8 декабря, 2015 · Жалоба Простенький бут обходится без библиотечных функций.Каждый имеет право ходить по собственноручно разложенным граблям. Да пробовал я KEEP, выкидывает :(.Показывайте, у меня не выкидывает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 9 декабря, 2015 Опубликовано 9 декабря, 2015 · Жалоба А я использую __attribute__((used)) used This attribute, attached to a function, means that code must be emitted for the function even if it appears that the function is not referenced. This is useful, for example, when the function is referenced only in inline assembly. used This attribute, attached to a variable with static storage, means that the variable must be emitted even if it appears that the variable is not referenced. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viakon 0 10 декабря, 2015 Опубликовано 10 декабря, 2015 · Жалоба Показывайте, у меня не выкидывает. Спасибо всем. Создал новый проект, перенес в него исходники, KEEP заработал. Разбираться со старым не стал. Вопрос к Гуру, как правильно прилинковать готовый бут к проекту? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 10 декабря, 2015 Опубликовано 10 декабря, 2015 · Жалоба Есть вариант когда вместе, удобнее отлаживать все разом. Правильные отладчики могут загружать отладочную информацию из двух и более программ. Кейл, к примеру, это умеет. Собственно, именно так я и отлаживал совместно загрузчик и основную программу. А линковать их вместе - это какой-то адЪ и раскидывание граблей перед собой. Вопрос к Гуру, как правильно прилинковать готовый бут к проекту? Зачем? У нас на производстве сначала прошивается загрузчик, а уже через него заливается основная прошивка (через Ethernet). Заодно тестируется работоспособность порта Ethernet. Если всё же хочется прошивать сразу и то и другое, выше уже было сказано, что объединять их надо на уровне HEX. К примеру, SRecord это умеет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 10 декабря, 2015 Опубликовано 10 декабря, 2015 · Жалоба Правильные отладчики могут загружать отладочную информацию из двух и более программ. Хм, не думал о таком. Я на gdb загружал загрузчик и программу, а потом отлаживал или то или другое. Интересно, gdb умеет загружать одновременно?*\ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viakon 0 18 декабря, 2015 Опубликовано 18 декабря, 2015 (изменено) · Жалоба Хм, не думал о таком. Я на gdb загружал загрузчик и программу, а потом отлаживал или то или другое. Интересно, gdb умеет загружать одновременно?*\ Одновременно это как? Можно загрузить два elf файла. Гружу загрузчик, потом основной проект. Не нашел как сделать так чтоб в загрузчике код отображался, символьная информация грузится только для основной программы. Ну или только для загрузчика (если запустить отладку загрузчика). Как в GDB подгрузить символьные данные? Все таки классная штука SWD, можно не гнять комп на отладке по ночам. Заметил что девайс работает как-то не так подключил SWD зашел в отладку без загрузки флеша и смотри, что не так, программа-то не перезагружается, продолжает работать. Как я намучился с вечно падающим JTAG у AVR. Щелкнуло реле на плате, и все, синхронизация потеряна. PS: нашел, команда file имя_проекта.elf грузит символьную информацию. Вот только старую забывает. Перешел из лоадера в основной проект, грузи ручками. Вернулся обратно снова грузи. Как бы сделать чтоб оба elf грузились одновременно. Изменено 18 декабря, 2015 пользователем viakon Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться