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

Как разместить bootloader по определённому адресу?

прескртптум: AVR Studio 4.17, WinAvr, C++, avr-c++

 

Есть функция-загрузчик. Её нужно поместить по адресу 0xf000. В мануале на avr-c++ написано как это сделать

 

void boot(void) __attribute__ ((section (".bootloader")));

To relocate the section to a fixed address the linker flag -section-start is used.

This option can be passed to the linker using the -Wl compiler option:

-Wl,--section-start=.bootloader=0x1E000

Но как это сделать в AVR Studio? если не указывать -Wl,--section-start=.bootloader=0xF000, то при линковке получаю ошибку

c:/soft/winavr-20090313/bin/../lib/gcc/avr/4.3.2/../../../../avr/bin/ld.exe: section .bootloader [000072ea -> 0000742f] overlaps section .data [000072ea -> 0000744f]

 

Пробовал переразместить секцию bootlooader в свойствах проекта на вкладке Costom options добавил опцию -Wl,--section-start=.bootloader=0xF000

но при линковке опять таже ошибка. Пробовал создать свою секцию и загрузчик разместить в неё - в результате при линковке таже ошибка.

 

Как в AVR Studio разместить функцию по нужному адресу? Как задать адрес секции?

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


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

если не указывать -Wl,--section-start=.bootloader=0xF000, то при линковке получаю ошибку
Значит, наверное, нужно указывать. Особенно, если документация говорит, что указывать надо.

Пробовал переразместить секцию bootlooader в свойствах проекта на вкладке Costom options добавил опцию -Wl,--section-start=.bootloader=0xF000

но при линковке опять таже ошибка.

Вы обратили вниманте, что там отдельно опции "дла всего", "для конкретного файла" и "для линкера"? Вы куда добавляли?

Пробовал создать свою секцию и загрузчик разместить в неё - в результате при линковке таже ошибка.
Интересно, а что же такое __attribute__ ((section (".bootloader"))) как не размещение загрузчика в свою секцию?

 

Хотя самое грамотное - скопировать скрипт линкера в проект и поправить там распределение сегментов. Ибо иначе вы никак не сможете разместить в секции загрузчика библиотечные функции. И второе рекомендуемое действие (скорее даже первое по удобству) - напишите свой makefile и укажите студии использовать его. Ее возможности автоматической генерации сильно ограничены.

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


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

Значит, наверное, нужно указывать. Особенно, если документация говорит, что указывать надо.
Конечно надо. Но я не определял ни каких секций типа .data .text и .bootloader. Однако после линковки я получаю увидомление, что в этих секциях занато столько-то памяти. Может где-то avr-c++ берёт эти секции, ведь я указал во фьюзах размер загрузочного сектора и его размещение. По идее этого должно быть достаточно, чтоб ИДЕ всё остальное сделала сама. Вот я пытаюсь с этим разобраться.

Вы обратили вниманте, что там отдельно опции "дла всего", "для конкретного файла" и "для линкера"? Вы куда добавляли?

конечно обратил. я добавлял в "Для всего", потом для конкретного сишного файла опцию "-WI, --section-start=.bootloader=0xf000", и пробывал указать опцию линкеру "--section-start=.bootloader=0xf000", "-section-start=.bootloader=0xf000", "section-start=.bootloader=0xf000". Эффект один и тотже - "... overlaps ...". Пробывал по всякому. ((

 

(блин, Ctrl+C на это компе не работает, не могу цитировать....) Что значит "скопировать скрипт линкера в проект" AVR Studio? И далее... наверно я не так спросил, или вы не так поняли.... я не хочу скопировать библиотечную функцию в секцию загрузчика. Я написал свой загрузчик (точнее скопировал готовый сишный код из примера), т.е. в вайле *.h объявил свою функцию, в *.c определил тело функции. Теперь мне нужно чтоб линкер разместил эту функцию по адресу 0xF000. Как это сделать?

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


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

модераторы..... ну вы блин даёте!!! Тему переместили!!! Ну хоть как-то бы обосновали бы свои действия и на старом месте подсказали бы где искать мне мою тему. Да и Сергея я не понял, он мне отвечает так, как будь-то я действительно как чайник, спросил сколько бит в байте и что такое "напряжометр". А на самом деле проблема пахнет очередной багой в авр студио. Опять придется багрепорт писать. ((

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


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

Project->Configuration Options->Memory Settings

click Add button

Memory Type: Flash

Name: .bootloader

Address (Hex): 0x1C00 (this is a word address)

(c avrfreaks)

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


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

Конечно надо. Но я не определял ни каких секций типа .data .text и .bootloader. Однако после линковки я получаю увидомление, что в этих секциях занато столько-то памяти. Может где-то avr-c++ берёт эти секции, ведь я указал во фьюзах размер загрузочного сектора и его размещение. По идее этого должно быть достаточно, чтоб ИДЕ всё остальное сделала сама. Вот я пытаюсь с этим разобраться.
секции .text, .data и многие другие определены в дефолтных скриптах линкера. Поэтому одним из моих советов было - скопировать такой скрипт, поправить и подключить его.

конечно обратил. я добавлял в "Для всего", потом для конкретного сишного файла опцию "-WI, --section-start=.bootloader=0xf000", и пробывал указать опцию линкеру "--section-start=.bootloader=0xf000", "-section-start=.bootloader=0xf000", "section-start=.bootloader=0xf000". Эффект один и тотже - "... overlaps ...". Пробывал по всякому. ((
вы не попробовали правильную комбинацию - указать -Wl,--section-start=.bootloader=0xf000 в опциях линкера. Обратите внимание, что после -Wl, (Wl, а не WI) пробела быть не должно.

Что значит "скопировать скрипт линкера в проект" AVR Studio?
Значить скопировать его в папку проекта и указать на него линкеру ключем -Wl,-T,<имя файла>
И далее... наверно я не так спросил, или вы не так поняли.... я не хочу скопировать библиотечную функцию в секцию загрузчика. Я написал свой загрузчик
Даже использование оператора switch() может приводить к вызову библиотечной функции ветвления. Аналогично с умножениями, делениями и т.д. При компиляции с ключем -mcall-prologues даже пролог и эпилог некоторых функций используют библиотечные подпрограммы для сохранения/восстановления регистров (а это иногда полезно для экономии памяти кода, особенно для загрузчика).
Да и Сергея я не понял, он мне отвечает так, как будь-то я действительно как чайник, спросил сколько бит в байте и что такое "напряжометр".
Извините, но опция -Wl описана в документации. Студия при компиляции выводит в окно сообщений командную строку, которой вызывает gcc. Не сложить эту информацию вместе может только чайник. Вопросы плана "что значит скопировать скрипт линкера в проект" тоже задают чайники. Это ваше первое сообщение на форуме, поэтому ни у кого не было возможности по предыдущим вашим сообщениям прикинуть ваш уровень.
А на самом деле проблема пахнет очередной багой в авр студио. Опять придется багрепорт писать. ((
Баги нет. Я

a) сам лично использовал этот метод передачи параметров когда начинал осваивать gcc

б) проверил перед тем, как писать на форум.

SysRq Спасибо!!! Проблема решена.
Заставили оболочку вписать -Wl,--section-start без ошибок и туда, куда надо. Что было причиной, почему заработало - так и не разобрались. "Бага в студии!" Типичный "не чайницкий" подход?

 

Добалю к вот этому:

Но я не определял ни каких секций типа .data .text и .bootloader
В описании линкера сказано, что если линкер не нашел в скрипте указания, куда класть текущую входную секцию - то он создает выходную секцию с таким же именем, что и входная, и размещает ее следом за последней размещенной. Так появляется выходная секция .bootloader

 

И совсем П.С. Слева вверху есть иконка f1.gif, под ней прячется линк "новые сообщения". Там ответы на ваше сообщение будут видны независимо от того, куда переместили ветку.

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


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

Сергей Борщ Чем умничать, лучше бы толковое сказали что-нибудь.

вы не попробовали правильную комбинацию - указать -Wl,--section-start=.bootloader=0xf000 в опциях линкера.

проверил перед тем, как писать на форум.
Может мы с разными процессорами пробуем? Вы с каким пробывали? Я пробовал c такой опцией, проект скомпелялся без ошибок, с выводом

avr-c++ -mmcu=at90can128 -Wl,--section-start=.bootloader=0xf000  -Wl,-Map=interfaces.map main.o spi.o Display.o timer.o initialization.o interrupts.o crc.o connection.o modbus.o tcpip.o iso104.o MapModbus.o extRom.o arm150.o boot.o     -o interfaces.elf

Но моя функция разместилась не по адресу 0xf000.

 

Разобрался в чём была моя проблема. Оказывается, по каждому адресу в проце лежит слово, линкеру нужно адрес указать байтовый. Т.е. 2*0xf000, и правильная опция будет -Wl,--section-start=.bootloader=0x1e000

 

p.s.

Обратите внимание, что после -Wl, (Wl, а не WI) пробела быть не должно.
)))) - ну это вообще на 5 балоф. Еще туда добавить "W - это дубль Вэ, а не две буквы V" и можно эти советы в тираж отдавать. Без обид ;). Я же эту опцию из пдф-ника скопировал в проект, а потом скопировал из проекта в форум. Видно же что там "-Wl".

 

И совсем П.С. Слева вверху есть иконка , под ней прячется линк "новые сообщения". Там ответы на ваше сообщение будут видны независимо от того, куда переместили ветку.
+1

 

Вопросы плана "что значит скопировать скрипт линкера в проект" тоже задают чайники.
Ну конечно, куда нам, любителям IDE до вас, до ГУРУ, пишущих код в vi и соберающих его из командной строки! Выяснил до конца в чём проблема из-за спортивного интереса. А на самом деле это ни к чему. Программист, пишущий в ИДЭ, не должен беспокоится о скриптах, параметрах линкера и компелятора, makefile-ах и т.п., а должен быть сконцентрирован на решении др. задач. Для того и нужна ИДЭ.

 

опять :bb-offtopic: .... сколько раз зарекался ......

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


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

Сергей Борщ Чем умничать, лучше бы толковое сказали что-нибудь.
Не вопрос. Идите в игнор.
p.s.

)))) - ну это вообще на 5 балоф. Еще туда добавить "W - это дубль Вэ, а не две буквы V" и можно эти советы в тираж отдавать. Без обид ;). Я же эту опцию из пдф-ника скопировал в проект, а потом скопировал из проекта в форум. Видно же что там "-Wl".

А WI я взял, значит из воздуха? Нетушки, я скопировал ее из вашего сообщения, и пробел там тоже обнаружил в процессе копирования. Так что не нужно пенять с больной головы.
Программист, пишущий в ИДЭ, не должен беспокоится о скриптах, параметрах линкера и компелятора, makefile-ах и т.п., а должен быть сконцентрирован на решении др. задач. Для того и нужна ИДЭ.
IDE должна использоваться в тех аспектах, в которых она расширяет возможности. Не ограничивая.

Успехов в расставлении галочек в новом проекте! Также успехов в попытках заставить студию включить в ваш проект файлы исходников на С++ с расширением .cpp

А я, сирый, скопирую makefile из старого проекта и поправлю при необходимости в нем пару строчек.

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


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

Программист, пишущий в ИДЭ, не должен беспокоится о скриптах, параметрах линкера и компелятора, makefile-ах и т.п.

Слово программист в таком контексте должно употребляться в кавычках и не иначе. Более правильное слово кодировщик.

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


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

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

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

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

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

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

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

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

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

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