|
bootloader в WinAVR, к вопросу оптимизации |
|
|
|
Jun 25 2011, 16:58
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Простая программка: Код ************************************************ ПРИМЕР МИГАНИЯ СВЕТОДИОДАМИ ************************************************ #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
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Jun 25 2011, 20:49
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (MaxiMuz @ Jun 25 2011, 22:38)  я подозревал это  ну а как это выключить ? Это можно, только ответьте сначала на два вопроса: 1) Вы находясь в здравом уме собираетесь работать с неициализированными переменными с произвольным значением? 2) Если нет, то не стоит-ли Вам подумать, что инициализация их по одной займет больше кода, нежели оптом? P.S. На форуме есть раздел для начинающих. И не стоит по каждому чиху создавать новую тему, тем более не подобающих разделах.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 26 2011, 06:48
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Цитата(zltigo @ Jun 25 2011, 23:49)  P.S. На форуме есть раздел для начинающих. И не стоит по каждому чиху создавать новую тему, тем более не подобающих разделах. Чем же этот раздел не подобает ? Других я не нашел А на вопрос вы не ответили !
|
|
|
|
|
Jun 26 2011, 08:38
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (MaxiMuz @ Jun 26 2011, 08:48)  Других я не нашел Не верю, просто обычная привычка гадить, где попало  , не читать ни документации на компилятор, ни пользоваться знаниями накопленными на форуме. QUOTE А на вопрос вы не ответили ! Моим условием ответа на вопрос был для начала ответ на два моих вопроса - тоже типа "не нашли"  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 27 2011, 16:40
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(MaxiMuz @ Jun 27 2011, 19:59)  Непонимаю смысл инициализации все области памяти , если я с ней не работаю В Вашем случае (примере) никакой инициализации и не производится: фактически производится проверка, что инициализация не нужна (точнее, что инициализировать нужно 0 слов памяти). Реальные программы, обычно, гораздо сложнее Вашего примера, и, обычно, без инициализации некоторых областей памяти не обойтись. Если что-то в стандартном startup'е Вас не устраивает, то можно его поправить...
|
|
|
|
|
Jun 30 2011, 05:45
|
Местный
  
Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940

|
Цитата Поэтому 128 байт - тоже обьем, и принцып тут ни причем Тогда надо учится писать на AVR-ассемблере, или брать контроллер подходящий по объему флеша к реализуемой задаче
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|