Простая программка:
Код
************************************************
ПРИМЕР МИГАНИЯ СВЕТОДИОДАМИ
************************************************
#include <avr/io.h>
int main(void)
{
PORTB |=_BV(PB2) | _BV(PB0);
DDRB |= _BV(PB0);
while (1) {
if (bit_is_clear(PINB,PB2)) PORTB |= _BV(PB0);
else PORTB &= ~_BV(PB0);
}
}
Использовал различные уровни оптимизации (OPT = s в данном случае)
Команда: "make.exe" all выдает следующий протокол:
Код
Creating load file for Flash: test.hex
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature test.elf test.hex
Creating load file for EEPROM: test.eep
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 --no-change-warnings -O ihex test.elf test.eep || exit 0
Creating Extended Listing: test.lss
avr-objdump -h -S -z test.elf > test.lss
Creating Symbol Table: test.sym
avr-nm -n test.elf > test.sym
Size after:
AVR Memory Usage
----------------
Device: attiny2313
Program: 114 bytes (5.6% Full)
(.text + .data + .bootloader)
Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)
-------- end --------
> Process Exit Code: 0
> Time Taken: 00:02
Получается вот такой код:
Код
test.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000072 00000000 00000000 00000054 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .debug_aranges 00000020 00000000 00000000 000000c6 2**0
CONTENTS, READONLY, DEBUGGING
2 .debug_pubnames 0000001b 00000000 00000000 000000e6 2**0
CONTENTS, READONLY, DEBUGGING
3 .debug_info 00000076 00000000 00000000 00000101 2**0
CONTENTS, READONLY, DEBUGGING
4 .debug_abbrev 00000041 00000000 00000000 00000177 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_line 00000073 00000000 00000000 000001b8 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_frame 00000020 00000000 00000000 0000022c 2**2
CONTENTS, READONLY, DEBUGGING
7 .debug_str 00000079 00000000 00000000 0000024c 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 12 c0 rjmp .+36; 0x26 <__ctors_end>
2: 2a c0 rjmp .+84; 0x58 <__bad_interrupt>
4: 29 c0 rjmp .+82; 0x58 <__bad_interrupt>
6: 28 c0 rjmp .+80; 0x58 <__bad_interrupt>
8: 27 c0 rjmp .+78; 0x58 <__bad_interrupt>
a: 26 c0 rjmp .+76; 0x58 <__bad_interrupt>
c: 25 c0 rjmp .+74; 0x58 <__bad_interrupt>
e: 24 c0 rjmp .+72; 0x58 <__bad_interrupt>
10: 23 c0 rjmp .+70; 0x58 <__bad_interrupt>
12: 22 c0 rjmp .+68; 0x58 <__bad_interrupt>
14: 21 c0 rjmp .+66; 0x58 <__bad_interrupt>
16: 20 c0 rjmp .+64; 0x58 <__bad_interrupt>
18: 1f c0 rjmp .+62; 0x58 <__bad_interrupt>
1a: 1e c0 rjmp .+60; 0x58 <__bad_interrupt>
1c: 1d c0 rjmp .+58; 0x58 <__bad_interrupt>
1e: 1c c0 rjmp .+56; 0x58 <__bad_interrupt>
20: 1b c0 rjmp .+54; 0x58 <__bad_interrupt>
22: 1a c0 rjmp .+52; 0x58 <__bad_interrupt>
24: 19 c0 rjmp .+50; 0x58 <__bad_interrupt>
00000026 <__ctors_end>:
26: 11 24 eor r1, r1
28: 1f be out 0x3f, r1; 63
2a: cf ed ldi r28, 0xDF; 223
2c: cd bf out 0x3d, r28; 61
0000002e <__do_copy_data>:
2e: 10 e0 ldi r17, 0x00; 0
30: a0 e6 ldi r26, 0x60; 96
32: b0 e0 ldi r27, 0x00; 0
34: e2 e7 ldi r30, 0x72; 114
36: f0 e0 ldi r31, 0x00; 0
38: 02 c0 rjmp .+4 ; 0x3e <.do_copy_data_start>
0000003a <.do_copy_data_loop>:
3a: 05 90 lpm r0, Z+
3c: 0d 92 st X+, r0
0000003e <.do_copy_data_start>:
3e: a0 36 cpi r26, 0x60; 96
40: b1 07 cpc r27, r17
42: d9 f7 brne .-10; 0x3a <.do_copy_data_loop>
00000044 <__do_clear_bss>:
44: 10 e0 ldi r17, 0x00; 0
46: a0 e6 ldi r26, 0x60; 96
48: b0 e0 ldi r27, 0x00; 0
4a: 01 c0 rjmp .+2 ; 0x4e <.do_clear_bss_start>
0000004c <.do_clear_bss_loop>:
4c: 1d 92 st X+, r1
0000004e <.do_clear_bss_start>:
4e: a0 36 cpi r26, 0x60; 96
50: b1 07 cpc r27, r17
52: e1 f7 brne .-8 ; 0x4c <.do_clear_bss_loop>
54: 02 d0 rcall .+4 ; 0x5a <main>
56: 0b c0 rjmp .+22; 0x6e <_exit>
00000058 <__bad_interrupt>:
58: d3 cf rjmp .-90; 0x0 <__vectors>
0000005a <main>:
5a: 88 b3 in r24, 0x18; 24
5c: 85 60 ori r24, 0x05; 5
5e: 88 bb out 0x18, r24; 24
60: b8 9a sbi 0x17, 0; 23
62: b2 99 sbic 0x16, 2; 22
64: 02 c0 rjmp .+4 ; 0x6a <main+0x10>
66: c0 9a sbi 0x18, 0; 24
68: fc cf rjmp .-8 ; 0x62 <main+0x8>
6a: c0 98 cbi 0x18, 0; 24
6c: fa cf rjmp .-12; 0x62 <main+0x8>
0000006e <_exit>:
6e: f8 94 cli
00000070 <__stop_program>:
70: ff cf rjmp .-2 ; 0x70 <__stop_program>
Собственно полезный код занимает десяток байт , таблица векторов прерваний - это понятно, далее секция <__ctors_end>:
первые две команды - обнуление SREG ! Для каких это целей ?
Оставшийся код как я понимаю bootloader ?
зачем он тут нужен ?
Как исключить его из кода ?
Сообщение отредактировал MaxiMuz - Jun 25 2011, 17:02