|
WinAvr gcc, Помогите! Неверный скрипт для avr-ld ???... |
|
|
|
Dec 29 2005, 23:58
|

Участник

Группа: Участник
Сообщений: 65
Регистрация: 28-12-05
Из: Odessa
Пользователь №: 12 673

|
Спасибо. Вот хочу поделится че вышло за сегодня. Разобрался с этим непонятным глюком, но не полностью. Оказалось какие-то страности с командами JMP и CALL на которых неправильно генерирует "OPCODE" то-ли ассемблер, то-ли линковщик. Со скриптами линковщика помоему все в норме. В итоге пришлось пойти на уступки : при компиляциях выбирал не AVR5 модель, а AVR2 модель CPU, в эту модель входят все контролеры которые не могут исполнять CALL,JMP - ,а исполняют взамест их RCALL,RJMP. Переработал свои функции : заменил эти команды, компилировал, все работает хорошо. Но боюсь придется наступить на грабли когда буду увеличивать размер своей программы. Эти команды RJMP,RCALL имеют 2Kb смешение. Но с этим еще можно как-то смирится. Весь интернет облазил ничего на эту тему нет сообразительного. Спасибо большое за помощь.
|
|
|
|
|
Dec 30 2005, 15:31
|

Участник

Группа: Участник
Сообщений: 65
Регистрация: 28-12-05
Из: Odessa
Пользователь №: 12 673

|
Цитата(haker_fox @ Dec 30 2005, 04:58)  Как составляете makefile? Вручную или программой MFile? Ой make file я не использую. Все старым проверенным дедовским методом. Изучил конвенцию и особенности этого "C" компилера. Делаю свой ассемблерный файл функций для "C" программы и там же размещаю свой Startup Code, и функции прерывания, создаю header файл этих функций. Пишу "С" файл и транслирую его в ассемблерный опцией -S. Далее даю два файла на съедение ассемблеру, потом линкую. Просто боюсь я этого чистого программирования на "C" с фирменными библиотеками, я потрачу меньше времени на поиск глюков в своем собственном коде чем на отладку непонятностей в чужом. Да и когда я пишу свои чистые функции я практически не использую prologue и epilogue. Плюс ко всему я понаблюдал за трансляцией с "C" исходника в ассемблерный и заметил что если делать свои функции на "C" на базе других функций, то компилятор в этом коде просто изобилует prologue и epilogue-ами причем громадных размеров. А при использовании библиотечных функций я затрудняюсь сказать как они слеплены память же надо беречь. Я раньше при написании программок под DOS на WATCOME "C++" только своими headeraми и пользовался потому, что в стандартной поставке не было функций для работы с SVGA режимами, а с чужими библиотеками разбираться - потратишь в раз десять больше времени и без пользы. [b] Хорошо когда знаешь ассемблеры.[/b]
|
|
|
|
|
Jan 1 2006, 09:34
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Пару слов вдогонку. 1. Я бы не советовал пользоваться Идой для AVR. Попробуйте специализированный дизассемблер, например REAVR. 2.MFile генерит вполне достойные мэйкфайлы, они поддерживают dependenсy, что незаменимо в больших проектах.Попробуйте не пожалеете. 3.Компилятор в глюках вроде бы не замечен. Иногда может дурить с оптимизацией, но покопавшись в листингах, к его особенностям быстро приноравливаешься. 4.Стандартной библиотеке С можно доверять стопроцентно, а вот где действительно надо быть осторожным, это с специфичными библиотеками типа boot, eeprom etc. 5.Вообще gcc наверно наиболее педантично придерживаеться стандарта, многих он раздражает именно потому, что он ругаеться на небрежности к которым коммерческие компиляторы относяться терпимо.
С наступившим! Успехов!
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jan 1 2006, 17:35
|

Участник

Группа: Участник
Сообщений: 65
Регистрация: 28-12-05
Из: Odessa
Пользователь №: 12 673

|
Цитата(Andy Great @ Jan 1 2006, 19:12)  ключ -nostdlib (уточнил) - это ключ линкера. Я ни словом не упомянул про make. С Вашим нежеланием читать доку Вам трудно будет работать. Всю документацию по WINAVR просмотрел. Ничего такого там нет. Нет там таких ключей ни на : avr-ld, avr-gcc, avr-as. Так-же внимательно смотрел с сайта www.gnu.org/manual всю доку по этим трем утилитам. Тоже ничего по поводу этого ключа. вот что у меня записано в bat файле: avr-gcc -mmcu=avr2 -S tavr.c -o tavr.s avr-as -mmcu=avr2 -al=asm.l freqpomp.s -o tavrs.o avr-ld -Map maps.l -T tavr.lnk tavrs.o -o file.bintavr.lnk - не привожу вроде мне все там понятно. Вот что может linker avr-ld, и на gnu.org небольше этого написано, поможите поподробнее Вы наверняка же знаете, заранее спасибо. Кроме -Lpath ближе тем там нет: Controlling the linker avr-ld: Selected linker options While there are no machine-specific options for avr-ld, a number of the standard options might be of interest to AVR users.
-lname Locate the archive library named libname.a, and use it to resolve currently unresolved symbols from it. The library is searched along a path that consists of builtin pathname entries that have been specified at compile time (e. g. /usr/local/avr/lib on Unix systems), possibly extended by pathname entries as specified by -L options (that must precede the -l options on the command-line).
-Lpath Additional location to look for archive libraries requested by -l options.
--defsym symbol=expr Define a global symbol symbol using expr as the value.
-M Print a linker map to stdout.
-Map mapfile Print a linker map to mapfile.
--cref Output a cross reference table to the map file (in case -Map is also present), or to stdout.
--section-start sectionname=org Start section sectionname at absolute address org.
-Tbss org -Tdata org -Ttext org Start the bss, data, or text section at org, respectively.
-T scriptfile
|
|
|
|
|
Jan 2 2006, 22:38
|

Участник

Группа: Участник
Сообщений: 65
Регистрация: 28-12-05
Из: Odessa
Пользователь №: 12 673

|
Цитата(Andy Great @ Jan 2 2006, 12:08)  avr-ld --help выдает список ключей. Для моего v2.15 этот ключ есть. Очень большое Cпасибо. Там много ключей которых нет в стандартном описании avr-ld. Спасибо попробую. Извините, что отвлек - тупикую немного. Чесно говоря даже в голову не пришло написать : avr-ld --help . Спасибо буду эксперементировать.
|
|
|
|
|
Jan 3 2006, 23:20
|

Участник

Группа: Участник
Сообщений: 65
Регистрация: 28-12-05
Из: Odessa
Пользователь №: 12 673

|
Всем! Всем! Всем! Действительно глюк компилятора точнее линковщика avr-ld. В интернете по этому поводу ничего вразумительного, и все проекты в инете имеют минимальный код чтоб обходится без JMP и CALL, используют только RJMP и RCALL , и всегда выбирают как правило AT90S8515. На двух сайтах людьми на форумах была поднята эта тема OPCODE JMP,CALL для WINAVR, никто не ответил ничего. А глюк выдал себя вот так: как я говорил, если непосредственно записать числовое значение в эти команды, то OPCODE правильный. Если ставить текстовую метку в качестве адреса перехода на команду JMP, начинается проблема с генерированием OPCODE (хотя на командах RJMP и RCALL такое безобразие не проявляется(в этом и суть)). Выявлял проблему так: разместил команду Start: JMP Start на нулевой адрес, OPCODE = 940C000 - правильный OPCODE. Далее поменял параметр JMP START+4, скомпилировал, получил OPCODE = 94100000 -уже неправильный OPCODE (правильный 940C0002). Далее еще увеличил параметр JMP START+4, получил также неправильный OPCODE 94140000 (правильный 940C0004). Дальше еще лучше, короче глюченный линковщик и на этом точка. Я же немогу применять команды JMP при самостоятельных высчитах смещения адресов. Но все-таки хорошее от WINAVR есть. Исправно генерит с "C" файла текстовый ассемблерный файл. Правда этот файл надо подредактировать, чтобы скормить ассемблеру в AVR STUDIO. Этим далее я и буду заниматься позже - напишу утилиту переработки ассемблерного текста с avr-as на вид воспринимаемый ассемблером из AVRSTUDIO. Вот такие пироги.
|
|
|
|
|
Jan 5 2006, 02:58
|

Участник

Группа: Участник
Сообщений: 65
Регистрация: 28-12-05
Из: Odessa
Пользователь №: 12 673

|
Спасибо " Petka" . Я уже все перепробовал : и обьектник дизассемблировал, чтоб хоть убедится что ни он портачит. Мои мысленные допуски по поводу нулевых адресов на командах JMP и CALL в обьектном модуле подтвердились, ведь это дело линковщика адресса расставлять. Но проблема не в том, что линковщик их не расставляет, а в том что он их расставляет с искажением OPCODE. Попробуйте написать маленькую програмку, а потом залинковать. Примеры скрипта в этом разделе темы, наверху. Я этот же вопрос задал на AVRFREAKS , может действительно проблема, или будут смеятся. Вчера написал утилиту автоматической шлифовки ассемблерного, листинга c avr-gcc -S на удобовоспринимаемый ассемблером из AVR STUDIO с которым я уже долго работаю. Из WINAVRа буду использовать только avr-gcc с опцией -S для выдачи ассемблерного файла и все (линковать не прийдется  ) . А ассемблировать avrasm32.exe из AVR STUDIO. Так сказать нерешенных проблем нет. Програмы шлифовки как доработаю то выложу на Моя веб-страница
|
|
|
|
|
Jan 6 2006, 12:51
|
Профессионал
    
Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886

|
Цитата(картошка @ Jan 5 2006, 05:58)  Спасибо " Petka" . Я уже все перепробовал : и обьектник дизассемблировал, чтоб хоть убедится что ни он портачит. Мои мысленные допуски по поводу нулевых адресов на командах JMP и CALL в обьектном модуле подтвердились, ведь это дело линковщика адресса расставлять. Но проблема не в том, что линковщик их не расставляет, а в том что он их расставляет с искажением OPCODE. Попробуйте написать маленькую програмку, а потом залинковать. Примеры скрипта в этом разделе темы, наверху. Я этот же вопрос задал на AVRFREAKS , может действительно проблема, или будут смеятся. Вчера написал утилиту автоматической шлифовки ассемблерного, листинга c avr-gcc -S на удобовоспринимаемый ассемблером из AVR STUDIO с которым я уже долго работаю. Из WINAVRа буду использовать только avr-gcc с опцией -S для выдачи ассемблерного файла и все (линковать не прийдется  ) . А ассемблировать avrasm32.exe из AVR STUDIO. Так сказать нерешенных проблем нет. Програмы шлифовки как доработаю то выложу на Моя веб-страницав поставке WinAVR есть каталог exapmles\demo . там есть пример makefile файла. т.е. заходите в этот каталог и наберите 'make' будут созданы bin и hex файлы, вот как раз bin файлы и надо дизассемблировать. по аналогии компилируйте и свои проекты.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|