Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
24.06.2011, 22:38
|
|
Гражданин KAZUS.RU
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
bootloader в WinAVR к вопросу оптимизации
Пользую WinAVR-20080610
Простая программка:
Цитата:
|
************************************************
ПРИМЕР МИГАНИЯ СВЕТОДИОДАМИ
************************************************
#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› |
Собственно полезный код занимает десяток байт , таблица векторов прерваний - это понятно. Оставшийся код как я понимаю bootloader. Нафига он тут нужен ?
Как исключить его из кода ?
Последний раз редактировалось MaxiMuz79; 25.06.2011 в 20:35.
|
|
|
Сказали "Спасибо" MaxiMuz79
|
|
|
25.06.2011, 04:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: bootloader в WinAVR
Сообщение от MaxiMuz79
|
Оставшийся код как я понимаю bootloader. Нафига он тут нужен ?
|
Это не загрузчик, а обычный сишный стартап. Он линкуется автоматом. Занимается инициализацией глобальных/статических переменных значениями указанными явно - секция data. Также обнулением глобальных/статических переменных для которых значение при старте не задано - секция bss. Ну и настройкой указателя стека. Он же передает управление функции main. Исключить его можно, но тогда в программе не должно быть глобальных/статических переменных и вызовов функций, ведь для вызова используется стек для хранения адреса возврата. Прерываний тоже быть не должно - стека то нет. В Вашей программе можно и убрать стартап, но как только она станет чуть сложнее стартап тут же понадобится. Так что не переживайте особо, это правильная и нужная часть программы.
|
|
|
|
25.06.2011, 20:27
|
|
Гражданин KAZUS.RU
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: bootloader в WinAVR
kison, для инициализации указателя стека нужны всего две команды:
Код:
|
2a: cf ed ldi r28, 0xDF ; 223
2c: cd bf out 0x3d, r28 ; 61 |
Перед ними две команды:
Код:
|
26: 11 24 eor r1, r1
28: 1f be out 0x3f, r1 ; 63 |
они обнуляют регистр SREG - Ни в одном датащите, ни в одном руководстве к программированию AVR в асме нет такой рекомендации обнулять в начале программы SREG ! Может быть не к месту это сказано , но всеже вызывает вопрос
Как можно убрать этот стартап ?
|
|
|
Сказали "Спасибо" MaxiMuz79
|
|
|
26.06.2011, 05:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: bootloader в WinAVR
Сообщение от MaxiMuz79
|
они обнуляют регистр SREG - Ни в одном датащите, ни в одном руководстве к программированию AVR в асме нет такой рекомендации обнулять в начале программы SREG !
|
В AVR-GCC регистр R1 всегда содержит 0. А обнуление SREG это аналог CLI. Лишнего нет. Убрать стартап можно, но только вместе с векторами. Останется голая функция main. Работать это естественно не будет.
И второй путь - посмотреть скрипт линкера и изменить как хочется.
Скрипты в WinAVR\avr\lib\ldscripts, с расширением х.
Там стартап на секции разбит и можно повыкидывать любую.
Пример:
Код:
|
*(.init0) /* Start here after reset. */
KEEP (*(.init0))
*(.init1)
KEEP (*(.init1))
*(.init2) /* Clear __zero_reg__, set up stack pointer. */
KEEP (*(.init2))
*(.init3)
KEEP (*(.init3))
*(.init4) /* Initialize data and BSS. */ |
Если удалить например init2, то обнуления R1, запрета прерываний и настройки стека не будет. Свой скрипт подключается к линкеру ключиком -T‹имя скрипта›.
Но подумайте трижды перед тем как выкидывать нужные части программы. Компилятор не рассчитан на простейшие программы без прерываний и без переменных. Как только они появятся - в стартапе ничего лишнего не будет.
|
|
|
|
26.06.2011, 09:14
|
|
Прописка
Регистрация: 19.07.2006
Адрес: Russia,Yekaterinburg
Сообщений: 184
Сказал спасибо: 12
Сказали Спасибо 75 раз(а) в 43 сообщении(ях)
|
Re: bootloader в WinAVR
Сообщение от MaxiMuz79
|
Как можно убрать этот стартап ?
|
Пишите на asm. Там все будет так как вы захотите.
__________________
Разработка электроники на заказ, написание ПО для ПК и МК.Обращайтесь в личку.
|
|
|
Сказали "Спасибо" mobil2005
|
|
|
26.06.2011, 10:40
|
|
Гражданин KAZUS.RU
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: bootloader в WinAVR
Сообщение от kison
|
Убрать стартап можно, но только вместе с векторами. Останется голая функция main. Работать это естественно не будет.
|
На ассемблере в AStudio работает , а под Си вдруг не заработает ?
|
|
|
Сказали "Спасибо" MaxiMuz79
|
|
|
26.06.2011, 11:21
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: bootloader в WinAVR
Сообщение от MaxiMuz79
|
На ассемблере в AStudio работает , а под Си вдруг не заработает ?
|
Заработает. Но только самая примитивная программа, типа цикла в первом сообщении. Оно и надо? Точно такая же пишется на асме за две минуты. А нормальной программе нужны переменные, стек и т.д. Я смысл убирания стартапа понять так и не могу. Ладно бы на свой заменить.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:57.
|
|