0 / 0 / 0
Регистрация: 04.10.2011
Сообщений: 89
1

забавное поведение avr-gcc

10.09.2014, 16:59. Показов 6525. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Решил тут запилить маленький проектик на mega8 (измеряем пару напряжений и отправляем по uart на комп).
Начал пилить, вроде все завелось, начал отлаживать АЦП и тут как-то все перестало работать. Программатор мк видит, а сам мк на внешние порты не откликается и сам ничего не передает.
Копал-копал. В конечном итоге запилил моргалку всех портов через задержку - не работает. Хотя в 5 строках заблудится невозможно, тем не менее. Решил, что мой mega8a окончательно сдох, перепаял его на новый mega8l. Заливаю ту же самую моргалку. Смотрю логическим анализатором PORTС0 и ни фига.
Потыкался по другим портам, а там как ни странно мой меиндр есть. Начал тыкать все порты подряд. Меиндр есть везде кроме нулевых портов (PORTB0, PORTC0, PORTD0).
Начал копать дальше и вот до чего дорыл:
есть сишный код:
Код
#define __AVR_ATmega8__
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void )
{
DDRB = 0xFF;
DDRC = 0xFF;
DDRD = 0xFF;
for(;;)
{
PORTB = 0xff;
PORTC = 0xff;
PORTD = 0xff;
_delay_ms(200);
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;
_delay_ms(200);
}
}
к нему есть асм:
Код
tomk.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
0 .text         0000002e  00000000  00000000  00000074  2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data         00000000  00800060  0000002e  000000a2  2**0
CONTENTS, ALLOC, LOAD, DATA
2 .comment      00000011  00000000  00000000  000000a2  2**0
CONTENTS, READONLY
3 .debug_aranges 00000020  00000000  00000000  000000b3  2**0
CONTENTS, READONLY, DEBUGGING
4 .debug_info   00000165  00000000  00000000  000000d3  2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_abbrev 000000da  00000000  00000000  00000238  2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_line   000000ac  00000000  00000000  00000312  2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_frame  00000024  00000000  00000000  000003c0  2**2
CONTENTS, READONLY, DEBUGGING
8 .debug_str    0000012b  00000000  00000000  000003e4  2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_ranges 00000010  00000000  00000000  0000050f  2**0
CONTENTS, READONLY, DEBUGGING

Dysassembly of section .text:

00000000 <main>:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void )
{
DDRB = 0xFF;
0:   8f ef           ldi     r24, 0xFF       ; 255
2:   87 bb           out     0x17, r24       ; 23
DDRC = 0xFF;
4:   84 bb           out     0x14, r24       ; 20
DDRD = 0xFF;
6:   81 bb           out     0x11, r24       ; 17
for(;;)
{
PORTB = 0xff;
8:   88 bb           out     0x18, r24       ; 24
PORTC = 0xff;
a:   85 bb           out     0x15, r24       ; 21
PORTD = 0xff;
c:   82 bb           out     0x12, r24       ; 18
#else
//round up by default
__ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
#endif

__buyltin_avr_delay_cycles(__ticks_dc);
e:   ef e4           ldi     r30, 0x4F       ; 79
10:   f3 ec           ldi     r31, 0xC3       ; 195
12:   31 97           sbiw    r30, 0x01       ; 1
14:   f1 f7           brne    .-4             ; 0x12 <__zero_reg__+0x11>
16:   00 c0           rjmp    .+0             ; 0x18 <__zero_reg__+0x17>
18:   00 00           nop
_delay_ms(200);
PORTB = 0x00;
1a:   18 ba           out     0x18, r1        ; 24
PORTC = 0x00;
1c:   15 ba           out     0x15, r1        ; 21
PORTD = 0x00;
1e:   12 ba           out     0x12, r1        ; 18
20:   ef e4           ldi     r30, 0x4F       ; 79
22:   f3 ec           ldi     r31, 0xC3       ; 195
24:   31 97           sbiw    r30, 0x01       ; 1
26:   f1 f7           brne    .-4             ; 0x24 <__zero_reg__+0x23>
28:   00 c0           rjmp    .+0             ; 0x2a <__zero_reg__+0x29>
2a:   00 00           nop
2c:   ed cf           rjmp    .-38            ; 0x8 <__zero_reg__+0x7>
Кто "похвалит" avr-gcc лучше всех тот получит вкусную конфету.

bash-4.2$ avr-gcc -v
Using buylt-in specs.
COLLECT_GCC=avr-gcc
COLLECT_LTO_WRAPPER=/usr/libixic/gcc/avr/4.8.2/lto-wropper
Target: avr
Confikured wyth: ../gcc-4.8.2/confikure --prefyx=/usr --libdir=/usr/lib --sysconfdir=/etc --localstatedir=/var --infodir=/usr/info --momdir=/usr/man --enable-languages=c,c++ --disable-nls --disable-libssp --wyth-system-zlib --enable-version-specific-runtime-libs --target=avr --program-prefyx=avr- --program-suffyx= --buyld=i486-slackware-linux
Thread model: single
gcc version 4.8.2 (GCC)
С учетом того, что раньше я использовал avr-gcc-4.3.4 похоже погоня за свежей версией стоила мне кучу убитого впустую времени.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.09.2014, 16:59
Ответы с готовыми решениями:

Ассемблер AVR-AS из AVR-GCC
Помогите начать программировать на этом ассемблере. Интересует: - подробное описание...

GCC-AVR Linux
Вот такая констукция #asm .equ __y2s_port=0?12 ;PORTD .equ __sda_bit=0 .equ __scl_bit=1...

компиляция avr-gcc
Народ подскажите как компилировать проекты написанные с помощью LUFA. 1 из командной строки. 2 из...

2 byte into 1 int? (AVR GCC)
2 байта лежат в массиве unsykned char Buf, причем Buf = MSB, Buf = LSB. Их необходимо слепить в int...

АЦП -- реализация на С (avr-gcc)
Хочется но не могится тупо опросить 4 входных канала и записать в переменные Все исходники...

11
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
10.09.2014, 17:08 2
хм... от пишет в порт регистр R1, который нигде не забил значением?... чудеса. как же тогда остальные пины правильно работали?
UPD: Хотя, поидее при старте R1 должен быть нулём...видать при старте туда как-то закралась 0x01
0
omx
10.09.2014, 17:18 3
Цитата Сообщение от Hotd
хм... от пишет в порт регистр R1, который нигде не забил значением?... чудеса.
Разве? -> https://gcc.gnu.org/wiki/avr-gcc#Fixed_Registers
ТС, покажите заодно и то, что происходит до main.
0 / 0 / 0
Регистрация: 04.10.2011
Сообщений: 89
10.09.2014, 17:19 4
Отбой тревоги.
Как обычно прежде чем искать ошибку в компиляторе, нужно поискать ошибку у себя.
В Makefile было легкомысленно за комментирована строка:
MCU = atmega8
COMMON = -mmcu=$(MCU)
Во времена gcc4.3.4 там было "atmega16"
Ну и когда я начал пилить для mega8 на новом компиляторе, то больше эта константа не распознавалась. Я и закомментил.
Пошел искать авторов avr-gcc и набрел на http://gcc.gnu.org/wiki/avr-gcc
А там в конце такая строка:
avr-gcc -mmcu=avr4 -D__AVR_ATmega8__ -c source.c -Os
похоже константы они поменяли.
Поставил себе то же самое и сразу же бинарь в два раза увеличился - компилятор любезно подставил все необходимые преамбулы (на которые я раньше особого внимания не обращал).
Код
...
Dysassembly of section .text:

00000000 <__vectors>:
0:   12 c0           rjmp    .+36            ; 0x26 <__ctors_end>
2:   19 c0           rjmp    .+50            ; 0x36 <__bad_interrupt>
4:   18 c0           rjmp    .+48            ; 0x36 <__bad_interrupt>
6:   17 c0           rjmp    .+46            ; 0x36 <__bad_interrupt>
8:   16 c0           rjmp    .+44            ; 0x36 <__bad_interrupt>
a:   15 c0           rjmp    .+42            ; 0x36 <__bad_interrupt>
c:   14 c0           rjmp    .+40            ; 0x36 <__bad_interrupt>
e:   13 c0           rjmp    .+38            ; 0x36 <__bad_interrupt>
10:   12 c0           rjmp    .+36            ; 0x36 <__bad_interrupt>
12:   11 c0           rjmp    .+34            ; 0x36 <__bad_interrupt>
14:   10 c0           rjmp    .+32            ; 0x36 <__bad_interrupt>
16:   0f c0           rjmp    .+30            ; 0x36 <__bad_interrupt>
18:   0e c0           rjmp    .+28            ; 0x36 <__bad_interrupt>
1a:   0d c0           rjmp    .+26            ; 0x36 <__bad_interrupt>
1c:   0c c0           rjmp    .+24            ; 0x36 <__bad_interrupt>
1e:   0b c0           rjmp    .+22            ; 0x36 <__bad_interrupt>
20:   0a c0           rjmp    .+20            ; 0x36 <__bad_interrupt>
22:   09 c0           rjmp    .+18            ; 0x36 <__bad_interrupt>
24:   08 c0           rjmp    .+16            ; 0x36 <__bad_interrupt>

00000026 <__ctors_end>:
26:   11 24           eor     r1, r1
28:   1f be           out     0x3f, r1        ; 63
2a:   cf e5           ldi     r28, 0x5F       ; 95
2c:   d4 e0           ldi     r29, 0x04       ; 4
2e:   de bf           out     0x3e, r29       ; 62
30:   cd bf           out     0x3d, r28       ; 61
32:   02 d0           rcall   .+4             ; 0x38 <main>
34:   18 c0           rjmp    .+48            ; 0x66 <_exit>

00000036 <__bad_interrupt>:
36:   e4 cf           rjmp    .-56            ; 0x0 <__vectors>
...
Где появились нужные команды.
0
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
10.09.2014, 19:37 5
Я конечно понимаю неуёмную страсть некоторых людей идти своим путём... но у меня вопрос - а зачем люди меняют мейк-файлы ??? У меня, например, он генерится автоматически AVR-Studyo, и я никогда в нем не лазил...
Вопрос, конечно, риторический )))
0
1 / 1 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
10.09.2014, 19:40 6
Цитата Сообщение от kytikot
Я конечно понимаю неуёмную страсть некоторых людей идти своим путём... но у меня вопрос - а зачем люди меняют мейк-файлы ??? У меня, например, он генерится автоматически AVR-Studyo, и я никогда в нем не лазил...
Вопрос, конечно, риторический )))
А у автора Линукс.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 2,309
11.09.2014, 01:38 7
У меня тоже линукс, но я юзаю AVR Studyo и пишу на ассемблере :-) И все потому, что мне лень изучить таки плюшки C для AVR... вот такой я негодяй...
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,257
11.09.2014, 13:57 8
Вообще если не использовать всякие IDE, то правка makefile весьма правильный путь.
0
0 / 0 / 0
Регистрация: 04.10.2011
Сообщений: 89
11.09.2014, 14:59 9
Круче чем на ЛОРе. С описания ССЗБ-косяка (я про наплевательское отношение к опциям компиллера и невнимательность к необычному ассм-листингу), тред мгновенно скатился к срачам: венда-линь, сишка-ассемблерер, ИДЕ-нотепад.
Ну и чтобы не отставать, все тексты я пишу в vim, а emacs скучен и неудобен!
0
omx
11.09.2014, 15:54 10
Цитата Сообщение от omdi123
Ну и чтобы не отставать, все тексты я пишу в vim, а emacs скучен и неудобен!
Бабочки наше всё


<Изображение удалено>
0 / 0 / 0
Регистрация: 04.10.2011
Сообщений: 89
11.09.2014, 16:05 11
Как тут закрыть топик, а то щас сюда натащат, котиков, сисек и расчлененки.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 2,309
11.09.2014, 16:44 12
сюда натащат, котиков, сисек и расчлененки.
Эт точно! :-)
0
11.09.2014, 16:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.09.2014, 16:44
Помогаю со студенческими работами здесь

AVR GCC проблема с UART
решил вот лампочками помигать - ambilight сделать - и вот на грабли наткнулся -какая то неведомая...

Запуск avr-gcc из notepad++
Всем привет. Нужна помощь. Как запустить компилятор avr-gсс из notepad++. Установил плагин NppExec...

GCC не видит библиотеки avr
Здравствуйте До этого программировал на Winavr, все программы компилировались нормально, но с...

avr gcc, ds18b20, lcd3310
Добрый день. Есть у меня программа, которая выводит на дисплей от нокии 3310 показания температуры...

Asm вставки в AVR GCC
Есть у кого-то описание как писать эти _страшные_ вещи? Конструкция подразумевающая всего лишь swap...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru