|
|
  |
Как разместить bootloader по определённому адресу? |
|
|
|
Dec 9 2009, 11:51
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
прескртптум: 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 разместить функцию по нужному адресу? Как задать адрес секции?
|
|
|
|
|
Dec 9 2009, 14:46
|

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

|
Цитата(juvf @ Dec 9 2009, 13:51)  если не указывать -Wl,--section-start=.bootloader=0xF000, то при линковке получаю ошибку Значит, наверное, нужно указывать. Особенно, если документация говорит, что указывать надо. Цитата(juvf @ Dec 9 2009, 13:51)  Пробовал переразместить секцию bootlooader в свойствах проекта на вкладке Costom options добавил опцию -Wl,--section-start=.bootloader=0xF000 но при линковке опять таже ошибка. Вы обратили вниманте, что там отдельно опции "дла всего", "для конкретного файла" и "для линкера"? Вы куда добавляли? Цитата(juvf @ Dec 9 2009, 13:51)  Пробовал создать свою секцию и загрузчик разместить в неё - в результате при линковке таже ошибка. Интересно, а что же такое __attribute__ ((section (".bootloader"))) как не размещение загрузчика в свою секцию? Хотя самое грамотное - скопировать скрипт линкера в проект и поправить там распределение сегментов. Ибо иначе вы никак не сможете разместить в секции загрузчика библиотечные функции. И второе рекомендуемое действие (скорее даже первое по удобству) - напишите свой makefile и укажите студии использовать его. Ее возможности автоматической генерации сильно ограничены.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 9 2009, 17:29
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата Значит, наверное, нужно указывать. Особенно, если документация говорит, что указывать надо. Конечно надо. Но я не определял ни каких секций типа .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. Как это сделать?
|
|
|
|
|
Dec 10 2009, 04:50
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Цитата Project->Configuration Options->Memory Settings click Add button Memory Type: Flash Name: .bootloader Address (Hex): 0x1C00 (this is a word address) ( c avrfreaks)
|
|
|
|
|
Dec 10 2009, 07:44
|

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

|
Цитата(juvf @ Dec 9 2009, 19:29)  Конечно надо. Но я не определял ни каких секций типа .data .text и .bootloader. Однако после линковки я получаю увидомление, что в этих секциях занато столько-то памяти. Может где-то avr-c++ берёт эти секции, ведь я указал во фьюзах размер загрузочного сектора и его размещение. По идее этого должно быть достаточно, чтоб ИДЕ всё остальное сделала сама. Вот я пытаюсь с этим разобраться. секции .text, .data и многие другие определены в дефолтных скриптах линкера. Поэтому одним из моих советов было - скопировать такой скрипт, поправить и подключить его. Цитата(juvf @ Dec 9 2009, 19:29)  конечно обратил. я добавлял в "Для всего", потом для конкретного сишного файла опцию "-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) пробела быть не должно. Цитата(juvf @ Dec 9 2009, 19:29)  Что значит "скопировать скрипт линкера в проект" AVR Studio? Значить скопировать его в папку проекта и указать на него линкеру ключем -Wl,-T,<имя файла> Цитата(juvf @ Dec 9 2009, 19:29)  И далее... наверно я не так спросил, или вы не так поняли.... я не хочу скопировать библиотечную функцию в секцию загрузчика. Я написал свой загрузчик Даже использование оператора switch() может приводить к вызову библиотечной функции ветвления. Аналогично с умножениями, делениями и т.д. При компиляции с ключем -mcall-prologues даже пролог и эпилог некоторых функций используют библиотечные подпрограммы для сохранения/восстановления регистров (а это иногда полезно для экономии памяти кода, особенно для загрузчика). Цитата(juvf @ Dec 10 2009, 05:30)  Да и Сергея я не понял, он мне отвечает так, как будь-то я действительно как чайник, спросил сколько бит в байте и что такое "напряжометр". Извините, но опция -Wl описана в документации. Студия при компиляции выводит в окно сообщений командную строку, которой вызывает gcc. Не сложить эту информацию вместе может только чайник. Вопросы плана "что значит скопировать скрипт линкера в проект" тоже задают чайники. Это ваше первое сообщение на форуме, поэтому ни у кого не было возможности по предыдущим вашим сообщениям прикинуть ваш уровень. Цитата(juvf @ Dec 10 2009, 05:30)  А на самом деле проблема пахнет очередной багой в авр студио. Опять придется багрепорт писать. (( Баги нет. Я a) сам лично использовал этот метод передачи параметров когда начинал осваивать gcc б) проверил перед тем, как писать на форум. Цитата(juvf @ Dec 10 2009, 06:57)  SysRq Спасибо!!! Проблема решена. Заставили оболочку вписать -Wl,--section-start без ошибок и туда, куда надо. Что было причиной, почему заработало - так и не разобрались. "Бага в студии!" Типичный "не чайницкий" подход? Добалю к вот этому: Цитата Но я не определял ни каких секций типа .data .text и .bootloader В описании линкера сказано, что если линкер не нашел в скрипте указания, куда класть текущую входную секцию - то он создает выходную секцию с таким же именем, что и входная, и размещает ее следом за последней размещенной. Так появляется выходная секция .bootloader И совсем П.С. Слева вверху есть иконка  , под ней прячется линк " новые сообщения". Там ответы на ваше сообщение будут видны независимо от того, куда переместили ветку.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 10 2009, 09:29
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Сергей Борщ Чем умничать, лучше бы толковое сказали что-нибудь. Цитата вы не попробовали правильную комбинацию - указать -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-ах и т.п., а должен быть сконцентрирован на решении др. задач. Для того и нужна ИДЭ. опять  .... сколько раз зарекался ......
|
|
|
|
|
Dec 10 2009, 09:49
|

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

|
Цитата(juvf @ Dec 10 2009, 11:29)  Сергей Борщ Чем умничать, лучше бы толковое сказали что-нибудь. Не вопрос. Идите в игнор. Цитата(juvf @ Dec 10 2009, 11:29)  p.s. )))) - ну это вообще на 5 балоф. Еще туда добавить "W - это дубль Вэ, а не две буквы V" и можно эти советы в тираж отдавать. Без обид  . Я же эту опцию из пдф-ника скопировал в проект, а потом скопировал из проекта в форум. Видно же что там "-Wl". А WI я взял, значит из воздуха? Нетушки, я скопировал ее из вашего сообщения, и пробел там тоже обнаружил в процессе копирования. Так что не нужно пенять с больной головы. Цитата(juvf @ Dec 10 2009, 11:29)  Программист, пишущий в ИДЭ, не должен беспокоится о скриптах, параметрах линкера и компелятора, makefile-ах и т.п., а должен быть сконцентрирован на решении др. задач. Для того и нужна ИДЭ. IDE должна использоваться в тех аспектах, в которых она расширяет возможности. Не ограничивая. Успехов в расставлении галочек в новом проекте! Также успехов в попытках заставить студию включить в ваш проект файлы исходников на С++ с расширением .cpp А я, сирый, скопирую makefile из старого проекта и поправлю при необходимости в нем пару строчек.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|