Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Что-то я не понял. avr-gcc, оптимизация -O2, стартап подключен, никаких векторов никто не убирает, 130 байт кода

Отправлено ReAl 12 июня 2007 г. 18:16
В ответ на: Угу. В версии "pro" вообще можно удалить неиспользуемые векторы прерываний - размер кода для этого примера - 186 байт.... отправлено Гудвин 12 июня 2007 г. 15:27

foo.c:

#include
#define F_CPU 8000000
#include

int mas[22]; // ¤Єю ўЄюс√ startup ръЄштшЁютрЄ№
int counter;

int main( void )
{
unsigned char led;

PORTB = 0xFF; // Give PORTB and the User LEDs an initial startvalue

led = 1; // Start with LED0

DDRB = 0xFF; // Set PORTB as output

while(1) // Eternal loop
{
counter++;
mas[2]=counter;
PORTB = ~led; // Invert the output since a zero means: LED on
led <<= 1; // Move to next LED by performing a rotate left

if (!led)
led = 1; // If overflow: start with LED0 again

//__delay_cycles(500000); // Wait for 500 000 cycles
// _delay_loop_2 у avr-gcc берёт только 16 бит на входе
for( uint8_t i = 8; --i; ) _delay_loop_2(65535);
}
}

make


======== Beginning of foo processing
avr-gcc.exe (GCC) 4.1.2 (WinAVR 20070525)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

==== Compiling foo.c
==== Link to foo.elf
==== extract foo.hex
======== All OK, project size:
AVR Memory Usage
----------------
Device: attiny45

Program: 130 bytes (3.2% Full)
(.text + .data + .bootloader)

Data: 46 bytes (18.0% Full)
(.data + .bss + .noinit)

foo.dump:


../../exe/foo.elf: file format elf32-avr

Disassembly of section .text:

00000000 <__vectors>:
0: 0e c0 rjmp .+28 ; 0x1e <__ctors_end>
2: 29 c0 rjmp .+82 ; 0x56 <__bad_interrupt>
4: 28 c0 rjmp .+80 ; 0x56 <__bad_interrupt>
6: 27 c0 rjmp .+78 ; 0x56 <__bad_interrupt>
8: 26 c0 rjmp .+76 ; 0x56 <__bad_interrupt>
a: 25 c0 rjmp .+74 ; 0x56 <__bad_interrupt>
c: 24 c0 rjmp .+72 ; 0x56 <__bad_interrupt>
e: 23 c0 rjmp .+70 ; 0x56 <__bad_interrupt>
10: 22 c0 rjmp .+68 ; 0x56 <__bad_interrupt>
12: 21 c0 rjmp .+66 ; 0x56 <__bad_interrupt>
14: 20 c0 rjmp .+64 ; 0x56 <__bad_interrupt>
16: 1f c0 rjmp .+62 ; 0x56 <__bad_interrupt>
18: 1e c0 rjmp .+60 ; 0x56 <__bad_interrupt>
1a: 1d c0 rjmp .+58 ; 0x56 <__bad_interrupt>
1c: 1c c0 rjmp .+56 ; 0x56 <__bad_interrupt>

0000001e <__ctors_end>:
1e: 11 24 eor r1, r1
20: 1f be out 0x3f, r1 ; 63
22: cf e5 ldi r28, 0x5F ; 95
24: d1 e0 ldi r29, 0x01 ; 1
26: de bf out 0x3e, r29 ; 62
28: cd bf out 0x3d, r28 ; 61

0000002a <__do_copy_data>:
2a: 10 e0 ldi r17, 0x00 ; 0
2c: a0 e6 ldi r26, 0x60 ; 96
2e: b0 e0 ldi r27, 0x00 ; 0
30: e2 e8 ldi r30, 0x82 ; 130
32: f0 e0 ldi r31, 0x00 ; 0
34: 03 c0 rjmp .+6 ; 0x3c <.do_copy_data_start>

00000036 <.do_copy_data_loop>:
36: c8 95 lpm
38: 31 96 adiw r30, 0x01 ; 1
3a: 0d 92 st X+, r0

0000003c <.do_copy_data_start>:
3c: a0 36 cpi r26, 0x60 ; 96
3e: b1 07 cpc r27, r17
40: d1 f7 brne .-12 ; 0x36 <.do_copy_data_loop>

00000042 <__do_clear_bss>:
42: 10 e0 ldi r17, 0x00 ; 0
44: a0 e6 ldi r26, 0x60 ; 96
46: b0 e0 ldi r27, 0x00 ; 0
48: 01 c0 rjmp .+2 ; 0x4c <.do_clear_bss_start>

0000004a <.do_clear_bss_loop>:
4a: 1d 92 st X+, r1

0000004c <.do_clear_bss_start>:
4c: ae 38 cpi r26, 0x8E ; 142
4e: b1 07 cpc r27, r17
50: e1 f7 brne .-8 ; 0x4a <.do_clear_bss_loop>
52: 02 d0 rcall .+4 ; 0x58


54: 15 c0 rjmp .+42 ; 0x80 <_exit>

00000056 <__bad_interrupt>:
56: d4 cf rjmp .-88 ; 0x0 <__vectors>

00000058

:
int mas[22]; // ¤Єю ўЄюс√ startup ръЄштшЁютрЄ№
int counter;

int main( void )
{
58: 8f ef ldi r24, 0xFF ; 255
5a: 88 bb out 0x18, r24 ; 24
unsigned char led;

PORTB = 0xFF; // Give PORTB and the User LEDs an initial startvalue

led = 1; // Start with LED0

DDRB = 0xFF; // Set PORTB as output
5c: 87 bb out 0x17, r24 ; 23
5e: 31 e0 ldi r19, 0x01 ; 1

while(1) // Eternal loop
{
counter++;
mas[2]=counter;
PORTB = ~led; // Invert the output since a zero means: LED on
60: 83 2f mov r24, r19
62: 80 95 com r24
64: 88 bb out 0x18, r24 ; 24
led <<= 1; // Move to next LED by performing a rotate left
66: 33 0f add r19, r19

if (!led)
68: 09 f4 brne .+2 ; 0x6c
6a: 31 e0 ldi r19, 0x01 ; 1
6c: 27 e0 ldi r18, 0x07 ; 7
6e: ef ef ldi r30, 0xFF ; 255
70: ff ef ldi r31, 0xFF ; 255
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
72: 8e 2f mov r24, r30
74: 9f 2f mov r25, r31
76: 01 97 sbiw r24, 0x01 ; 1
78: f1 f7 brne .-4 ; 0x76
led = 1; // If overflow: start with LED0 again

//__delay_cycles(500000); // Wait for 500 000 cycles
// _delay_loop_2 у avr-gcc берёт только 16 бит на входе
for( uint8_t i = 8; --i; ) _delay_loop_2(65535);
7a: 21 50 subi r18, 0x01 ; 1
7c: d1 f7 brne .-12 ; 0x72
7e: f0 cf rjmp .-32 ; 0x60

00000080 <_exit>:
80: ff cf rjmp .-2 ; 0x80 <_exit>




Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 567:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru