|
Линкер выкидывает нужный код. Как исправить? |
|
|
|
Dec 8 2015, 05:34
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Код SECTIONS { .text : { KEEP(*(.loader.enter)); /* тут имя секции со стартовой функцией бутлоадера */ Неясно впрочем, у вас бутлоадер линкуется вместе с программой?
|
|
|
|
|
Dec 8 2015, 07:49
|
Местный
  
Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002

|
Цитата(Непомнящий Евгений @ Dec 8 2015, 10:34)  Неясно впрочем, у вас бутлоадер линкуется вместе с программой? Есть вариант когда вместе, удобнее отлаживать все разом. В данном случае отдельно. Но основная программа вызывает функцию в бутлодыре, вот ее при компиляции и выкидывает. пробовал KEEP все равно выкидывает.
|
|
|
|
|
Dec 8 2015, 08:02
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(viakon @ Dec 8 2015, 10:49)  Есть вариант когда вместе, удобнее отлаживать все разом. В данном случае отдельно. Но основная программа вызывает функцию в бутлодыре, вот ее при компиляции и выкидывает. пробовал KEEP все равно выкидывает. Ну значит надо добавить эту функцию в KEEP. Если не получается - попробуйте сократить пример до минимального и выложить. Кстати насчет совместной линковки - как минимум не должно быть двух функций main, нужны отдельные копии всех функций из стандартной библиотеки (а часть арифметики к примеру реализована в виде функций), возможно еще что-то. И зачем отлаживать совместно? В программе делаете некую заглушку, куда приходите по команде "вызвать загрузчик" и отлаживаете себе отдельно от загрузчика... Даже если вам остро необходим загрузчик, возможно проще будет сделать бинарный образ загрузчика (скомпилированного отдельно) и этот образ прилинковывать к основной программе. Линковать вместе - это просто поход по граблям...
|
|
|
|
|
Dec 8 2015, 09:23
|
Местный
  
Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002

|
Цитата(Непомнящий Евгений @ Dec 8 2015, 13:02)  Ну значит надо добавить эту функцию в KEEP. Можно поподробнее как это делается. Цитата(Непомнящий Евгений @ Dec 8 2015, 13:02)  Линковать вместе - это просто поход по граблям... В чем грабли то? Если загрузчик состоит всего из нескольких функций, то несложно прямо указать их расположение в секции BOOTLOADER. Вот проект с загрузчиком на базе LWIP это да, все функции пометить префиксом BOOTLOADER та еще работа и можно что-нибудь пропустить.
Сообщение отредактировал viakon - Dec 8 2015, 09:30
|
|
|
|
|
Dec 8 2015, 11:56
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(viakon @ Dec 8 2015, 12:23)  В чем грабли то? 1) Библиотечные функции. Если компилятор их решил использовать, то у загрузчика они должны быть свои. А это может быть что угодно - арифметика, ветвление по таблице, пролог/эпилог функций и т.д. 2) Неловкое движение может сделать вашу программу несовместимой с загрузчиками старых версий в предыдущих версиях уже проданного железа. При этом она будет дружить с последней версией загрузчика, вместе с которой собирается 3) потом их все равно надо разделить, чтобы послать пользователям только приложение.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 8 2015, 12:31
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(viakon @ Dec 8 2015, 12:23)  Можно поподробнее как это делается. Я ж писал выше - KEEP(*(xxx)), где xxx - имя секции с этой функцией. Его можно посмотреть в map-файле но опять же, если загрузчик тривиальный, сделайте заглушку
|
|
|
|
|
Dec 8 2015, 15:57
|
Местный
  
Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002

|
Цитата(Сергей Борщ @ Dec 8 2015, 16:56)  1) Библиотечные функции. Если компилятор их решил использовать, то у загрузчика они должны быть свои. А это может быть что угодно - арифметика, ветвление по таблице, пролог/эпилог функций и т.д. Простенький бут обходится без библиотечных функций. Цитата(Сергей Борщ @ Dec 8 2015, 16:56)  2) Неловкое движение может сделать вашу программу несовместимой с загрузчиками старых версий в предыдущих версиях уже проданного железа. При этом она будет дружить с последней версией загрузчика, вместе с которой собирается У меня обычно вызов только одной функции из основной программы, она размещается в отдельной секции, и никаких проблем с совместимостью. Цитата(Сергей Борщ @ Dec 8 2015, 16:56)  3) потом их все равно надо разделить, чтобы послать пользователям только приложение. Ну а это то вообще элементарно, основная программа в секциях isr_vector, text и data arm-none-eabi-objcopy -O binary -j .isr_vector -j .text -j .data В результате бут по CSD звонку обновляет программу. Цитата(Непомнящий Евгений @ Dec 8 2015, 17:31)  Я ж писал выше - KEEP(*(xxx)), где xxx - имя секции с этой функцией. Его можно посмотреть в map-файле
но опять же, если загрузчик тривиальный, сделайте заглушку Да пробовал я KEEP, выкидывает  .
|
|
|
|
|
Dec 8 2015, 18:54
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(viakon @ Dec 8 2015, 18:57)  Простенький бут обходится без библиотечных функций. Каждый имеет право ходить по собственноручно разложенным граблям. Цитата(viakon @ Dec 8 2015, 18:57)  Да пробовал я KEEP, выкидывает  . Показывайте, у меня не выкидывает.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 9 2015, 09:21
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
А я использую __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.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Dec 10 2015, 04:36
|
Местный
  
Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002

|
Цитата(Сергей Борщ @ Dec 8 2015, 23:54)  Показывайте, у меня не выкидывает. Спасибо всем. Создал новый проект, перенес в него исходники, KEEP заработал. Разбираться со старым не стал. Вопрос к Гуру, как правильно прилинковать готовый бут к проекту?
|
|
|
|
|
Dec 10 2015, 07:49
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(viakon @ Dec 8 2015, 10:49)  Есть вариант когда вместе, удобнее отлаживать все разом. Правильные отладчики могут загружать отладочную информацию из двух и более программ. Кейл, к примеру, это умеет. Собственно, именно так я и отлаживал совместно загрузчик и основную программу. А линковать их вместе - это какой-то адЪ и раскидывание граблей перед собой. Цитата(viakon @ Dec 10 2015, 07:36)  Вопрос к Гуру, как правильно прилинковать готовый бут к проекту? Зачем? У нас на производстве сначала прошивается загрузчик, а уже через него заливается основная прошивка (через Ethernet). Заодно тестируется работоспособность порта Ethernet. Если всё же хочется прошивать сразу и то и другое, выше уже было сказано, что объединять их надо на уровне HEX. К примеру, SRecord это умеет.
|
|
|
|
|
Dec 18 2015, 05:06
|
Местный
  
Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002

|
Цитата(Непомнящий Евгений @ Dec 10 2015, 12:51)  Хм, не думал о таком. Я на gdb загружал загрузчик и программу, а потом отлаживал или то или другое. Интересно, gdb умеет загружать одновременно?*\ Одновременно это как? Можно загрузить два elf файла. Гружу загрузчик, потом основной проект. Не нашел как сделать так чтоб в загрузчике код отображался, символьная информация грузится только для основной программы. Ну или только для загрузчика (если запустить отладку загрузчика). Как в GDB подгрузить символьные данные? Все таки классная штука SWD, можно не гнять комп на отладке по ночам. Заметил что девайс работает как-то не так подключил SWD зашел в отладку без загрузки флеша и смотри, что не так, программа-то не перезагружается, продолжает работать. Как я намучился с вечно падающим JTAG у AVR. Щелкнуло реле на плате, и все, синхронизация потеряна. PS: нашел, команда file имя_проекта.elf грузит символьную информацию. Вот только старую забывает. Перешел из лоадера в основной проект, грузи ручками. Вернулся обратно снова грузи. Как бы сделать чтоб оба elf грузились одновременно.
Сообщение отредактировал viakon - Dec 18 2015, 06:48
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|