реклама на сайте
подробности

 
 
> bootloader в WinAVR, к вопросу оптимизации
MaxiMuz
сообщение Jun 25 2011, 16:58
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
defunct
сообщение Jul 5 2011, 00:22
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата
В случае написании на Си и оптимизации по обьему (Оs), код , я думаю , тоже будет ужат нормально, а этих 128Б может как раз не хватить

не понимаю я bootloader'ы в WinAVR, CV, ICC или еще какой-то байде, для бутсекций в 2kb. Если старая программа написана на asm'е да еще и соптимизирована, то на Си вы просто ни при каких обстоятельствах не сможете добиться такого функционала в том же объеме, не говоря уже о расширении оного.

Функционал который со скрипом влезет в самую большую бут секцию (2kb) с макс оптимизацией на WinAVR, - на асм поместится в самую маленькую бутсекцию из 256 байт. Достигается это за счет оптимальных прологов/эпилогов функций и исключительно регистровых переменных.
Реализция бутлоадера на Сях оправдана разве только "тайм ту маркетом" либо большим объемом флеш целевого МК. На С vs ASM, вы всегда потеряете или функциональность, или объем, или скорость, или всё сразу, какой бы ключик оптимизации не ставили.

Цитата(Сергей Борщ @ Jun 30 2011, 08:50) *
У вас такое бывало?
Ибо ужать 2К программу на 128 байт обычно не составляет труда. Дальнейшая дискуссия неинтересна - вы спорите о вкусе устриц с теми, кто их ел.

У меня вот что есть сказать, - бутсекция 1кб - поддержка: modbus по 485-му, загрузка с внешней eeprom'ки, CRC апп секции, шифрование в обе стороны... Портирование между МК байты приходится искать вставляя код в неиспользуемые ячейки таблицы векторов, проект собирается ровно в 1024байт ни одной свободной ячейки флеш (портировать с m8 напр на m16 - занятие не особо веселое, и найти там не то что 128, 8 байт без урезания функционала - большая проблема). Зато освобождается целый 1кб под апликейшин, для 8/16кб флешевых чипов - очень актуально. Бутлоадер - это такой тип программы, где простота найти 128 байт - означает недодать эти 128 байт (чаще больше) аппликейшину, а там они явно нужнее.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- MaxiMuz   bootloader в WinAVR   Jun 25 2011, 16:58
- - _Артём_   ЦитатаОставшийся код как я понимаю bootloader ? з...   Jun 25 2011, 18:06
|- - Taradov Alexander   Оставшийся код - это то, что позволяет неинициализ...   Jun 25 2011, 18:19
|- - MaxiMuz   Цитата(Taradov Alexander @ Jun 25 2011, 21...   Jun 25 2011, 20:38
|- - zltigo   QUOTE (MaxiMuz @ Jun 25 2011, 22:38) я по...   Jun 25 2011, 20:49
|- - MaxiMuz   Цитата(zltigo @ Jun 25 2011, 23:49) P.S. ...   Jun 26 2011, 06:48
||- - Taradov Alexander   QUOTE (MaxiMuz @ Jun 26 2011, 10:48) А на...   Jun 26 2011, 08:24
||- - zltigo   QUOTE (MaxiMuz @ Jun 26 2011, 08:48) Друг...   Jun 26 2011, 08:38
|- - MaxiMuz   Цитата(zltigo @ Jun 25 2011, 23:49) Это м...   Jun 27 2011, 15:59
|- - Палыч   Цитата(MaxiMuz @ Jun 27 2011, 19:59) Непо...   Jun 27 2011, 16:40
|- - MaxiMuz   Цитата(Палыч @ Jun 27 2011, 19:40) ... Ес...   Jun 28 2011, 07:17
|- - jorikdima   Цитата(MaxiMuz @ Jun 28 2011, 11:17) можн...   Jun 28 2011, 10:30
|- - MaxiMuz   Цитата(jorikdima @ Jun 28 2011, 13:30) У ...   Jun 29 2011, 06:56
|- - Сергей Борщ   QUOTE (MaxiMuz @ Jun 29 2011, 09:56) И ча...   Jun 30 2011, 05:50
|- - MaxiMuz   Цитата(Сергей Борщ @ Jun 30 2011, 08:50) ...   Jul 2 2011, 06:06
- - XVR   То, что вы видели называется Statrup. Он написан н...   Jun 27 2011, 08:51
- - alexeyv   ЦитатаПоэтому 128 байт - тоже обьем, и принцып тут...   Jun 30 2011, 05:45
- - zltigo   QUOTE (defunct @ Jul 5 2011, 03:22) Функц...   Jul 5 2011, 09:03
- - defunct   Цитата(zltigo @ Jul 5 2011, 12:03) Для по...   Jul 5 2011, 12:59
- - zltigo   QUOTE (defunct @ Jul 5 2011, 15:59) Bootl...   Jul 5 2011, 13:22


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 14:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01476 секунд с 7
ELECTRONIX ©2004-2016