реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> WinAvr gcc, Помогите! Неверный скрипт для avr-ld ???...
картошка
сообщение Dec 28 2005, 22:23
Сообщение #1


Участник
*

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



Здраствуйте.

Разбираюсь с пакетом WINAVR ни разу не писал для микроконтролеров на "C".
Откомпилировал файл : avr-gcc -mmcu=atmega16 -S tavr.c -o tavr.s . И получил текстовый ассемблерный файл с именем tavr.s, как заказывал в командной строке.
При запуске командной строки : avr-as -mmcu=avr5 -ahls=asm.l freqpomp.s tavr.s -o tavr.o - создается обьектный файл для линковщика и ненужно-контрольный файл asm.l который я заказал в командной строке. Все хорошо и нет никаких ошибок.

Но при обработке обьектного файла дизасемблером (avr-objdump) на командах jmp и call нулевые указатели адреса. И после запуска линковщика : avr-ld -Map maps.l -T tavr.lnk tavr.o -o file.bin создается мною попрошенный файл maps.l и сама готовая програма в файле file.bin. При просмотре бинарника дизасемблером IDA PRO ADVANCE ну и просто визуально, я замечаю что в командах jmp и call нулевые физические адреса.
У меня есть подозрительно-вопросительные соображения что возможно я что-то в скипте недописал? , вот его код:

OUTPUT_FORMAT ("binary")
SECTIONS
{
.text : { * ( .text )}
. = 0x00020000; --- адресное смещение для формирования файла
.data : { * ( .data )}
.bss : { * ( .bss )}
__do_copy_data = 0;
__do_clear_bss = 0;
__stack = 0x0300;
}

примечание: сегменты .data и .bss у меня не использованы и не создаются , я просто не создавал пока никаких переменных.

Помогите словом добрым пожалуйста.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Dec 29 2005, 02:14
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



2картошка: а может все упростить??? Я так понимаю, что Вы мучаетесь с makefile? Может быть скачать свежую версию WinAVR, там есть утилита для создания makefile, где можно задать тип МК, уровень оптимизации, выходные форматы и т.д. А осваивать лучше сам язык "Си", нежели мучиться с "мудренным" скриптом.

P.S. ИМХО лучше комплитор IAR (http://www.iar.com)

Сообщение отредактировал haker_fox - Dec 29 2005, 02:16


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
unichorn
сообщение Dec 29 2005, 10:02
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 24-09-05
Пользователь №: 8 901



А мне нравится WinAVR20050214+AVRStudio4.11

А вот простейший тестовый Makefile можно компилить C и C++

# makfile configuration
NAME = UnitMain
OBJECTS = UnitMain.o
CPU = atmega128

EXTRAINCDIRS = G:\WinAVR\avr\include\avr\

CFLAGS = -mmcu=$(CPU) -O2 -Wall -g $(patsubst %,-I %,$(EXTRAINCDIRS))
CXXFLAGS = -mmcu=$(CPU) -O2 -Wall -g -fno-rtti $(patsubst %,-I %,$(EXTRAINCDIRS))

#switch the compiler (for the internal make rules)
CC = avr-gcc
CXX = avr-g++


#all should be the first target. it's built when make is run without args
all: $(NAME).elf $(NAME).avr $(NAME).lst

#additional rules for files
$(NAME).elf: $(OBJECTS)
$(CC) -mmcu=$(CPU) -o $@ $(OBJECTS)
$(CXX) -mmcu=$(CPU) -o $@ $(OBJECTS)

$(NAME).avr: $(NAME).elf
avr-objcopy -O ihex $^ $@

$(NAME).lst: $(NAME).elf
avr-objdump -dSt $^ >$@

clean:
rm -f $(NAME).elf $(NAME).avr $(NAME).lst $(OBJECTS)

#dummy target as dependecy if something has to be build everytime
FORCE:

#project dependencies
UnitMain.o: UnitMain.cpp
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Dec 29 2005, 10:58
Сообщение #4


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(unichorn @ Dec 29 2005, 18:02) *
А мне нравится WinAVR20050214+AVRStudio4.11


Согласен!!! Сам до недавнего времени пользовался именно таким "миксом" :-)
Но теперь пока сижу на IAR EWAVR 4.11A.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
картошка
сообщение Dec 29 2005, 23:58
Сообщение #5


Участник
*

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



Спасибо.
Вот хочу поделится че вышло за сегодня.


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

Весь интернет облазил ничего на эту тему нет сообразительного.
Спасибо большое за помощь.

maniac.gif
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Dec 30 2005, 01:58
Сообщение #6


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Ну не должно быть таких граблей...
Какой версией WinAVR пользуетесь?
Как составляете makefile? Вручную или программой MFile?


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
картошка
сообщение Dec 30 2005, 15:31
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 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]
Go to the top of the page
 
+Quote Post
Andy Great
сообщение Dec 31 2005, 08:43
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 793
Регистрация: 5-11-04
Из: Краматорск, Украина
Пользователь №: 1 057



Ключ --no-stdlib спасет гиганта мысли. GCC настраивается ключами. Учите уставы. С Новым Годом!
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jan 1 2006, 09:34
Сообщение #9


Профессионал
*****

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



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

С наступившим! Успехов!


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
картошка
сообщение Jan 1 2006, 13:34
Сообщение #10


Участник
*

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



С наступившем. И с наступающим Рождеством.

Я не работаю ни с make файлом, ни с утилитой make. А ключ --no-stdlib это наверно к make применяктся при настройках библиотек.
Вообщем, главное что пока все получается.
Спасибо.
Go to the top of the page
 
+Quote Post
Andy Great
сообщение Jan 1 2006, 16:12
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 793
Регистрация: 5-11-04
Из: Краматорск, Украина
Пользователь №: 1 057



ключ -nostdlib (уточнил) - это ключ линкера. Я ни словом не упомянул про make. С Вашим нежеланием читать доку Вам трудно будет работать.

Сообщение отредактировал Andy Great - Jan 1 2006, 16:39
Go to the top of the page
 
+Quote Post
картошка
сообщение Jan 1 2006, 17:35
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 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.bin

tavr.lnk - не привожу вроде мне все там понятно.

Вот что может linker avr-ld, и на gnu.org небольше этого написано, поможите поподробнее Вы наверняка же знаете, заранее спасибо.

Кроме -Lpath ближе тем там нет: blink.gif

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
Go to the top of the page
 
+Quote Post
Andy Great
сообщение Jan 2 2006, 09:08
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 793
Регистрация: 5-11-04
Из: Краматорск, Украина
Пользователь №: 1 057



avr-ld --help выдает список ключей. Для моего v2.15 этот ключ есть.
Go to the top of the page
 
+Quote Post
картошка
сообщение Jan 2 2006, 22:38
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 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 .
Спасибо буду эксперементировать. cheers.gif
Go to the top of the page
 
+Quote Post
картошка
сообщение Jan 3 2006, 02:20
Сообщение #15


Участник
*

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



Все ключи для avr-ld и avr-as перепробовал ничего не помогает.
Ассемблер работает правильно. Obj файл который создался я обработал avt-objdump все правильно и OPCODE соответствуют. Правда неплохо было-бы попробовать другой утилитой просмотра obj не gnu.

Вот особенности проблемы: если ставить на команды не метки, а непосредственные адресса - то все нормально и линковщик генерит правильный код.
Линковщик и ассемблер проходит без единной ошибки.
Вот часть листинга при ассемблировании avr-as, все OPCODE правильные , а после линковки искажаютя, справа я указал где именно:

1
2
3 0000 0C94 0000 resets: jmp resets2 ; сдесь уже проблема OPCODE
4 0004 0C94 0002 jmp 1024 ; сдесь норма
5 0008 0C94 3408 jmp 4200 норма
6 000c 0C94 0000 jmp nneint проблема
7 0010 0C94 0000 jmp resets2
8 0014 0C94 0000 jmp nneint проблема
9 0018 0C94 0000 jmp nneint проблема
10 001c 0C94 0000 jmp nneint проблема
11 0020 0C94 0000 jmp nneint проблема
12 0024 0C94 0000 jmp counti проблема
13 0028 0C94 0000 resets2: jmp nneint проблема


Но если переставить метку resets2 вверх то листинг совсем другой :

1
2 __stack = 0x0450
3 0000 0C94 0000 resets: jmp resets2 ; правильный OPCODE
4 0004 0C94 0002 jmp 1024 ; норма
5 0008 0C94 3408 jmp 4200 ; норма
6 000c 0C94 0000 jmp nneint проблема
7 0010 0C94 0000 jmp resets2 норма
8 0014 0C94 0000 jmp nneint проблема
9 0018 0C94 0000 jmp nneint проблема
10 001c 0C94 0000 jmp nneint ну и ниже т.д.
11 0020 0C94 0000 jmp nneint
12 0024 0C94 0000 resets2: jmp counti
13 0028 0C94 0000 jmp nneint

14 002c 0C94 0000 jmp receiv
15 0030 0C94 0000 jmp nneint
16 0034 0C94 0000 jmp transm
17 0038 0C94 0000 jmp nneint
18 003c 0C94 0000 jmp nneint
19 0040 0C94 0000 jmp nneint
20 0044 0C94 0000 jmp nneint
21 0048 0C94 0000 jmp nneint
22 004c 0C94 0000 jmp nneint
23 0050 0C94 0000 jmp nneint


Вот дальше часть кода на что указывают эти метки в командах JMP:
24 nneint:
25 0054 1895 reti
26 counti:
27 0056 1895 reti
28 receiv:
29 0058 1895 reti
30 transm:
31 005a 1895 reti

Примечание : искажается код примерно так: вот OPCODE команды jmp - 0C94 0000 , после линковщика искажаеся по кокому-то алгоритму X : вот неправильный OPCODE - XX94 0000.

Ведь если вместо call и jmp использовать rcall и rjmp все с кодом впорядке и все работает.
Ничего не понимаю.
Go to the top of the page
 
+Quote Post
Andy Great
сообщение Jan 3 2006, 09:23
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 793
Регистрация: 5-11-04
Из: Краматорск, Украина
Пользователь №: 1 057



Что касается особенностей работы GNU-программ, читайте общие описания - АВРовские тулзы наследуют общую функциональность.
Go to the top of the page
 
+Quote Post
картошка
сообщение Jan 3 2006, 23:20
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 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.

Вот такие пироги. rolleyes.gif
Go to the top of the page
 
+Quote Post
Petka
сообщение Jan 4 2006, 17:53
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



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

Картошка: а вы зачем дизассемблируете ОБЬЕКТНИК? обьектный файл не содержит ОКОНЧАТЕЛЬНОГО кода. по идеологии обьектного файла адреса внешних функций ДО линковки (т.е. на стадии обьектного файла) НЕИЗВЕСТНЫ. известны лишь символьные имена меток. а для того, что бы вызывались конкретные адреса (а не текстовые строки) в коде могут оставляться опкоды "пустышки", которые на стадии линковки дополняются. можно "запудрить" линковщик до такой степени, что он так и оставит эти "пустышки" в конечном коде, но если делать как общепринято, такого не случится.
Go to the top of the page
 
+Quote Post
картошка
сообщение Jan 5 2006, 02:58
Сообщение #19


Участник
*

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



Спасибо "Petka" . Я уже все перепробовал : и обьектник дизассемблировал, чтоб хоть убедится что ни он портачит. Мои мысленные допуски по поводу нулевых адресов на командах JMP и CALL в обьектном модуле подтвердились, ведь это дело линковщика адресса расставлять. Но проблема не в том, что линковщик их не расставляет, а в том что он их расставляет с искажением OPCODE. Попробуйте написать маленькую програмку, а потом залинковать. Примеры скрипта в этом разделе темы, наверху.

Я этот же вопрос задал на AVRFREAKS , может действительно проблема, или будут смеятся.

Вчера написал утилиту автоматической шлифовки ассемблерного, листинга c avr-gcc -S на удобовоспринимаемый ассемблером из AVR STUDIO с которым я уже долго работаю. Из WINAVRа буду использовать только avr-gcc с опцией -S для выдачи ассемблерного файла и все (линковать не прийдется w00t.gif ) . А ассемблировать avrasm32.exe из AVR STUDIO. Так сказать нерешенных проблем нет.

Програмы шлифовки как доработаю то выложу на Моя веб-страница
Go to the top of the page
 
+Quote Post
Petka
сообщение Jan 6 2006, 12:51
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 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 для выдачи ассемблерного файла и все (линковать не прийдется w00t.gif ) . А ассемблировать avrasm32.exe из AVR STUDIO. Так сказать нерешенных проблем нет.

Програмы шлифовки как доработаю то выложу на Моя веб-страница


в поставке WinAVR есть каталог exapmles\demo . там есть пример makefile файла. т.е. заходите в этот каталог и наберите 'make' будут созданы bin и hex файлы, вот как раз bin файлы и надо дизассемблировать. по аналогии компилируйте и свои проекты.
Go to the top of the page
 
+Quote Post
viakon
сообщение Jan 18 2006, 05:58
Сообщение #21


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



ничего не понимаю второй год с GCC работаю, все нормально. Оптимизатор у него шибко умный, иногда напрягает что исчезает кусок кода, а потом посмотришь оказавается компилятор определил что условие никогда не выполнимо и соотвественноо все отрезал.
пользуйся makefile, все получается очень просто сразу на выходе получаешь elf файл и hex. elf отлаживаешь в студии, причем нормально видишь исходный текст.
Студия 4.12 позволяет делать все из под себя и сама makefile делает, не надо с ним заморачиваться.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01578 секунд с 7
ELECTRONIX ©2004-2016