Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

bootloader в WinAVR

Непрочитано 24.06.2011, 22:38  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" MaxiMuz79
warel (28.06.2019)
Непрочитано 25.06.2011, 04:40  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: bootloader в WinAVR

Сообщение от MaxiMuz79 Посмотреть сообщение
Оставшийся код как я понимаю bootloader. Нафига он тут нужен ?
Это не загрузчик, а обычный сишный стартап. Он линкуется автоматом. Занимается инициализацией глобальных/статических переменных значениями указанными явно - секция data. Также обнулением глобальных/статических переменных для которых значение при старте не задано - секция bss. Ну и настройкой указателя стека. Он же передает управление функции main. Исключить его можно, но тогда в программе не должно быть глобальных/статических переменных и вызовов функций, ведь для вызова используется стек для хранения адреса возврата. Прерываний тоже быть не должно - стека то нет. В Вашей программе можно и убрать стартап, но как только она станет чуть сложнее стартап тут же понадобится. Так что не переживайте особо, это правильная и нужная часть программы.
kison вне форума  
Сказали "Спасибо" kison
warel (28.06.2019)
Непрочитано 25.06.2011, 20:27  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" MaxiMuz79
warel (28.06.2019)
Непрочитано 26.06.2011, 05:43  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию 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‹имя скрипта›.
Но подумайте трижды перед тем как выкидывать нужные части программы. Компилятор не рассчитан на простейшие программы без прерываний и без переменных. Как только они появятся - в стартапе ничего лишнего не будет.
kison вне форума  
Сказали "Спасибо" kison
warel (28.06.2019)
Непрочитано 26.06.2011, 09:14  
mobil2005
Прописка
 
Аватар для mobil2005
 
Регистрация: 19.07.2006
Адрес: Russia,Yekaterinburg
Сообщений: 184
Сказал спасибо: 12
Сказали Спасибо 75 раз(а) в 43 сообщении(ях)
mobil2005 на пути к лучшему
По умолчанию Re: bootloader в WinAVR

Сообщение от MaxiMuz79 Посмотреть сообщение
Как можно убрать этот стартап ?
Пишите на asm. Там все будет так как вы захотите.
__________________
Разработка электроники на заказ, написание ПО для ПК и МК.Обращайтесь в личку.
mobil2005 вне форума  
Сказали "Спасибо" mobil2005
warel (28.06.2019)
Непрочитано 26.06.2011, 10:40  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Re: bootloader в WinAVR

Сообщение от kison Посмотреть сообщение
Убрать стартап можно, но только вместе с векторами. Останется голая функция main. Работать это естественно не будет.
На ассемблере в AStudio работает , а под Си вдруг не заработает ?
MaxiMuz79 вне форума  
Сказали "Спасибо" MaxiMuz79
warel (28.06.2019)
Непрочитано 26.06.2011, 11:21  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: bootloader в WinAVR

Сообщение от MaxiMuz79 Посмотреть сообщение
На ассемблере в AStudio работает , а под Си вдруг не заработает ?
Заработает. Но только самая примитивная программа, типа цикла в первом сообщении. Оно и надо? Точно такая же пишется на асме за две минуты. А нормальной программе нужны переменные, стек и т.д. Я смысл убирания стартапа понять так и не могу. Ладно бы на свой заменить.
kison вне форума  
Сказали "Спасибо" kison
warel (28.06.2019)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подниму тему WinAVR vs IAR oleg110592 Микроконтроллеры, АЦП, память и т.д 5 24.10.2015 14:06
Глюки WinAVR KBH-I Коллекция глюков 19 07.06.2011 01:16
WinAVR в вопросах и ответах avr123-nm-ru Микроконтроллеры, АЦП, память и т.д 0 02.03.2009 14:03
Bootloader Atmega LSergM Микроконтроллеры, АЦП, память и т.д 0 23.12.2007 02:32
Задание массива во Flash AVR на Си в AVRStudio + WinAVR zelen536 Микроконтроллеры, АЦП, память и т.д 14 07.09.2007 10:45


Часовой пояс GMT +4, время: 06:43.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.