![]() |
|
Модераторы: PILOT, ManiaK, Mazzi |
![]()
|
|
| Hiehachi |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 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 " |
|||
|
||||
| Hiehachi |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 27.12.2005 Где: Ukraine->Odess a Репутация: нет Всего: нет |
Вопрос более сокращенный: Кто-нибудь утилил с avr-as , avr-ld или avr-gcc (с опцией -S ). Можете что-нибудь подсказать - я новичек, еще ни разу не писал на "C" на микроконтролере. Очень хочется чтоб получилось.
|
|||
|
||||
| Hiehachi |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 27.12.2005 Где: Ukraine->Odess a Репутация: нет Всего: нет |
Привет всем.
Разобрался с этим непонятным глюком, но не полностью. Оказалось какие-то страности с командами JMP и CALL на которых неправильно генерирует "OPCODE" то-ли ассемблер, то-ли линковщик. Со скриптами линковщика помоему все в норме. В итоге пришлось пойти на уступки : при компиляциях выбирал не AVR5 модель, а AVR2 модель CPU, в эту модель входят все контролеры которые не могут исполнять CALL,JMP - ,а исполняют взамест их RCALL,RJMP. Переработал свои функции : заменил эти команды, компилировал, все работает хорошо. Но боюсь придется наступить на грабли когда буду увеличивать размер своей программы. Эти команды RJMP,RCALL имеют 2Kb смешение. Но с этим еще можно как-то смирится. Спасибо за внимание, тема закрыта. |
|||
|
||||
![]()
|
| Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)" | |
|
|
На данный раздел помимо Правил форума распространяются текже следующие правила:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |