juvf 17 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба прескртптум: 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 разместить функцию по нужному адресу? Как задать адрес секции? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба если не указывать -Wl,--section-start=.bootloader=0xF000, то при линковке получаю ошибкуЗначит, наверное, нужно указывать. Особенно, если документация говорит, что указывать надо. Пробовал переразместить секцию bootlooader в свойствах проекта на вкладке Costom options добавил опцию -Wl,--section-start=.bootloader=0xF000 но при линковке опять таже ошибка. Вы обратили вниманте, что там отдельно опции "дла всего", "для конкретного файла" и "для линкера"? Вы куда добавляли? Пробовал создать свою секцию и загрузчик разместить в неё - в результате при линковке таже ошибка.Интересно, а что же такое __attribute__ ((section (".bootloader"))) как не размещение загрузчика в свою секцию? Хотя самое грамотное - скопировать скрипт линкера в проект и поправить там распределение сегментов. Ибо иначе вы никак не сможете разместить в секции загрузчика библиотечные функции. И второе рекомендуемое действие (скорее даже первое по удобству) - напишите свой makefile и укажите студии использовать его. Ее возможности автоматической генерации сильно ограничены. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба Значит, наверное, нужно указывать. Особенно, если документация говорит, что указывать надо. Конечно надо. Но я не определял ни каких секций типа .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. Как это сделать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 10 декабря, 2009 Опубликовано 10 декабря, 2009 · Жалоба модераторы..... ну вы блин даёте!!! Тему переместили!!! Ну хоть как-то бы обосновали бы свои действия и на старом месте подсказали бы где искать мне мою тему. Да и Сергея я не понял, он мне отвечает так, как будь-то я действительно как чайник, спросил сколько бит в байте и что такое "напряжометр". А на самом деле проблема пахнет очередной багой в авр студио. Опять придется багрепорт писать. (( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 10 декабря, 2009 Опубликовано 10 декабря, 2009 · Жалоба Project->Configuration Options->Memory Settings click Add button Memory Type: Flash Name: .bootloader Address (Hex): 0x1C00 (this is a word address) (c avrfreaks) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 10 декабря, 2009 Опубликовано 10 декабря, 2009 · Жалоба SysRq Спасибо!!! Проблема решена. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 10 декабря, 2009 Опубликовано 10 декабря, 2009 · Жалоба Конечно надо. Но я не определял ни каких секций типа .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 И совсем П.С. Слева вверху есть иконка , под ней прячется линк "новые сообщения". Там ответы на ваше сообщение будут видны независимо от того, куда переместили ветку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 10 декабря, 2009 Опубликовано 10 декабря, 2009 · Жалоба Сергей Борщ Чем умничать, лучше бы толковое сказали что-нибудь. вы не попробовали правильную комбинацию - указать -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: .... сколько раз зарекался ...... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 10 декабря, 2009 Опубликовано 10 декабря, 2009 · Жалоба Сергей Борщ Чем умничать, лучше бы толковое сказали что-нибудь.Не вопрос. Идите в игнор.p.s. )))) - ну это вообще на 5 балоф. Еще туда добавить "W - это дубль Вэ, а не две буквы V" и можно эти советы в тираж отдавать. Без обид ;). Я же эту опцию из пдф-ника скопировал в проект, а потом скопировал из проекта в форум. Видно же что там "-Wl". А WI я взял, значит из воздуха? Нетушки, я скопировал ее из вашего сообщения, и пробел там тоже обнаружил в процессе копирования. Так что не нужно пенять с больной головы.Программист, пишущий в ИДЭ, не должен беспокоится о скриптах, параметрах линкера и компелятора, makefile-ах и т.п., а должен быть сконцентрирован на решении др. задач. Для того и нужна ИДЭ.IDE должна использоваться в тех аспектах, в которых она расширяет возможности. Не ограничивая. Успехов в расставлении галочек в новом проекте! Также успехов в попытках заставить студию включить в ваш проект файлы исходников на С++ с расширением .cpp А я, сирый, скопирую makefile из старого проекта и поправлю при необходимости в нем пару строчек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 10 декабря, 2009 Опубликовано 10 декабря, 2009 · Жалоба Программист, пишущий в ИДЭ, не должен беспокоится о скриптах, параметрах линкера и компелятора, makefile-ах и т.п. Слово программист в таком контексте должно употребляться в кавычках и не иначе. Более правильное слово кодировщик. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 10 декабря, 2009 Опубликовано 10 декабря, 2009 · Жалоба to juvf: imho тему нужно было создавать разделе GCC... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться