Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WinAvr проблема с компоновкой avr-ld, Описываю что предпринял, помогите в оста 
:(
    Опции темы
Hiehachi
Дата 27.12.2005, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 27.12.2005
Где: Ukraine->Odess a

Репутация: нет
Всего: нет



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

Не знаю с чего начать cтоит у меня такая проблема и работа стоит.
Пишу программу без использования стандартных библиотек. Написал отдельный ассемблерный файл с моими функциями для "C" модуля (конвенцию изучил для этого компилятора), создал header файл к нему, написал отдельный "C" файл с функцией main - все как положено для проверки.

создал файлы:
tavr.c - основной единственный "C" модуль.
pomp.s - ассемблерный файл моих функций для "C" программы
pomp.h - и header файл к моему asm файлу

запускаю командную строку: avr-gcc -mmcu=atmega16 -S tavr.c -o tavr.s
...получается asm файл c "C" файла - просматриваю его, все нормально.

вставляю в свой ассемблерный файл функций "pomp.s" - строку .include "tavr.s"
в результате чего как-бы обьединяются два asm файла в один.

далее запускаю командную строку: avr-as -mmcu=atmega16 -al=asm1.l pomp.s -o tavrs.o
...получается обьектный файл tavrs.o и файл листинга asm1.l . Просматриваю выданный файл листинга - все нормально, там присутствует оба asm файла: файл моих функций и самой программы на "C". Все нормально нет никаких ошибок или предупреждений.

далее запускаю avr-ld -Map maps.l -T tavr.lnk tavrs.o -o file.bin
вот файл сценария tavr.lnk
"
OUTPUT_FORMAT ("binary")
SECTIONS
{
.text : { * ( .text )}
. = 0x00020000;
.data : { * ( .data )}
.bss : { * ( .bss )}
__do_copy_data = 0;
__do_clear_bss = 0;
__stack = 0x0300;
}
"
создается файл file.bin и map файл maps.l
в файле maps.l содержимое вполне нормальное, вот пример:
"
Memory Configuration

Name Origin Length Attributes
*default* 0x00000000 0xffffffff

Linker script and memory map

0x00000000 __do_copy_data = 0x0
0x00000000 __do_clear_bss = 0x0
0x00000300 __stack = 0x300
LOAD tavrs.o
OUTPUT(file.bin binary)

.text 0x00000000 0x470
.text 0x00000000 0x470 tavrs.o
0x0000015a DisableFreqDriverPort
0x000002d4 CalculateStructCrc16
0x000000ac GetKeyboardPort
0x00000164 LcdResTo
0x000000f2 SignalNormaSysReleOn
0x0000030e ReceiverInteruptEnabled
0x00000080 Rele3FNumberOff
0x0000013e MOSISPITo
0x00000176 ReadAdcAds1110Data
0x0000012c SCKSPITo
0x00000274 WriteByteEEPROM
0x00000150 EnableFreqDriverPort
0x00000110 SignalAvariaSigReleOff
0x0000011a SSSPITo
0x00000332 ClearTransmitStatus
0x0000039c AllInteruptOff
0x0000036c Pausa1S
0x0000035e PausaMs
0x000001ac WriteAdcAds1110Comand
0x00000064 Seting3FReles
0x00000288 WriteBlockEEPROM
0x0000031a GetStatusReceiveError
0x000002e6 InitialComPortRS232
0x0000033a WriteByteRS232
0x0000030a ReceiverInteruptDisable
0x000003a4 main
0x000002a2 ReadByteEEPROM
0x000000e8 SignalFreqDriverReleOff
0x000003a0 AllInteruptOn
0x00000322 GetStatusTransmit
0x00000312 GetStatusReceive
0x00000374 StartInitSystem
0x00000098 SetingFreqRele
0x000002b4 ReadBlockEEPROM
0x0000046e exit
0x000000c0 OutToSpecPort
0x000002f8 DisableComPortRS232
0x0000032a GetStatusTransmit2
0x000000de SignalFreqDriverReleOn
0x00000106 SignalAvariaSigReleOn
0x000000fc SignalNormaSysReleOff
0x0000006c Rele3FNumberOn
0x00000348 ReadByteRS232

.data 0x00000470 0x0

.bss 0x00000470 0x0

"

а вот содержимое file.bin неработоспособное . Посмотрел через IDA PRO ADVANCED и увидел что все команды call и jmp имеют значение 0, хотя каждая эта команда имела нормальную символьную метку в текстовых asm файлах.

Загадка какая-то. Линковщик правильно знает адреса меток и разместил эти адреса в сгенерированом им же map файле, а в сгенерированом исполнимом bin файле проставил 0.
Вот тут-то я и ЗАГлох.


Даю пример моего asm файла функций (урезаного):
метки main,LowPowerInterupt,noneint присутствуют в этом файле(в этом отрезке файла их нет), но как я понял не проставляется адресация вообще. Помогите люди добрые как решить эту проблему
.

"
.arch atmega16
.text
.extern main
jmp main здесь ноль
jmp LowPowerInterupt и здесь ноль
jmp noneint и здесь тоже ноль
jmp noneint и везде 0
jmp noneint
jmp noneint
jmp noneint
jmp noneint
jmp noneint
jmp CountersInterupt
jmp noneint
jmp ReceiverInterupt
jmp noneint
jmp TransmiterInterupt
jmp noneint
jmp noneint
jmp noneint
jmp noneint
jmp noneint
jmp noneint
jmp noneint
noneint: nop
reti


LowPowerInterupt:
reti

CountersInterupt:
reti

ReceiverInterupt:
reti

TransmiterInterupt:
reti




PINA = 0x19
DDRA = 0x1A
PORTA = 0x1B
PINB = 0x16
DDRB = 0x17
PORTB = 0x18
PIND = 0x10
DDRD = 0x11
PORTD = 0x12
PORTC = 0x15
DDRC = 0x14
PINC = 0x13
SREG = 0x5F

MCUCR = 0x35
MCUCSR = 0x34
GICR = 0x3B

LCDI2CPORTO = DDRC
LCDI2CPORTI = PINC
ADCSDA = 7
XSCL = 4
RXCIE = 7

SpecPortValue = 0x61

MCUCR = 0x35 ; регистр конфигурации (sleep команды)

UDR = 0x0C ; регистр данных UART
USR = 0x0B ; регистр статуса UART
UCR = 0x0A ; регистр управления UART

UBRRL = 0x09 ; регистр скорости UART младший байт
UBRRH = 0x20 ; регистр скорости UART старший байт


TIMSK = 0x39 ; регистр масок прерывания
TCCR0 = 0x33 ; регистр режима работы
TCNT0 = 0x32 ; регистр счетчика


; Регистры EPROM памяти 512 байт
EEARH = 0x1F ; регистр адреса старший
EEARL = 0x1E ; регистр адреса младший
EEDR = 0x1D ; регистр данных
EECR = 0x1C ; регистр управления записи/чтения EPROM
; определение битовых смещения
EERIE = 3
EEMWE = 2
EEWE = 1
EERE = 0

SPL = 0x3D
SPH = 0x3E





PausPort:
ret
PausStrobe:
ret

.global Seting3FReles
.func Seting3FReles
Seting3FReles:
out PORTA,r24
ldi r24,255
out DDRA,r24
ret
.endfunc


.global Rele3FNumberOn
.func Rele3FNumberOn
Rele3FNumberOn:
ldi r22,0b00000001
andi r24,0b00000111
breq r3fq1
r3fq2: lsl r22
dec r24
brne r3fq2
r3fq1: in r25,PORTA
or r25,r22
out PORTA,r25
ret
.endfunc

.global Rele3FNumberOff
.func Rele3FNumberOff
Rele3FNumberOff:
ldi r22,0b00000001
andi r24,0b00000111
breq r3fqu1
r3fqu2: lsl r22
dec r24
brne r3fqu2
r3fqu1: in r25,PORTA
ldi r21,0b11111111
eor r22,r21
and r25,r22
out PORTA,r25
ret
.endfunc
"



PM MAIL WWW ICQ   Вверх
Hiehachi
Дата 27.12.2005, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 27.12.2005
Где: Ukraine->Odess a

Репутация: нет
Всего: нет



Вопрос более сокращенный: Кто-нибудь утилил с avr-as , avr-ld или avr-gcc (с опцией -S ). Можете что-нибудь подсказать - я новичек, еще ни разу не писал на "C" на микроконтролере. Очень хочется чтоб получилось.
PM MAIL WWW ICQ   Вверх
Hiehachi
Дата 30.12.2005, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 27.12.2005
Где: Ukraine->Odess a

Репутация: нет
Всего: нет



Привет всем.

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

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0403 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.