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

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

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

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

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

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

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

 
Опции темы
Непрочитано 24.06.2011, 22:38  
MaxiMuz79
Гражданин KAZUS.RU
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 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.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: bootloader в WinAVR

Сообщение от MaxiMuz79 Посмотреть сообщение
Оставшийся код как я понимаю bootloader. Нафига он тут нужен ?
Это не загрузчик, а обычный сишный стартап. Он линкуется автоматом. Занимается инициализацией глобальных/статических переменных значениями указанными явно - секция data. Также обнулением глобальных/статических переменных для которых значение при старте не задано - секция bss. Ну и настройкой указателя стека. Он же передает управление функции main. Исключить его можно, но тогда в программе не должно быть глобальных/статических переменных и вызовов функций, ведь для вызова используется стек для хранения адреса возврата. Прерываний тоже быть не должно - стека то нет. В Вашей программе можно и убрать стартап, но как только она станет чуть сложнее стартап тут же понадобится. Так что не переживайте особо, это правильная и нужная часть программы.
kison вне форума  
Сказали "Спасибо" kison
warel (28.06.2019)
Непрочитано 25.06.2011, 20:27  
MaxiMuz79
Гражданин KAZUS.RU
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 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.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
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.RU
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Re: bootloader в WinAVR

Сообщение от kison Посмотреть сообщение
Убрать стартап можно, но только вместе с векторами. Останется голая функция main. Работать это естественно не будет.
На ассемблере в AStudio работает , а под Си вдруг не заработает ?
MaxiMuz79 вне форума  
Сказали "Спасибо" MaxiMuz79
warel (28.06.2019)
Непрочитано 26.06.2011, 11:21  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
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, время: 01:57.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot