Цитата(ARV @ Mar 5 2009, 12:07)

не знаю, как на счет выбрасывания лишних функций (нет у меня пока таких), но вот инлайнинг функций из разных файлов не прокатывает с этими опциями... специально вынес содержимое главного цикла main() в другой файл в виде функции: увы, rcall как был, так и остался...
или я чего-то недопонял и недоделал?
Возможно, та функция была слишком большая для его понятий об инлайне? Хотя однократно вызываемую могло бы и проинлайнтить.
1.cКод
#include <avr/io.h>
#include "2.h"
void main()
{
uint16_t start = get_tcnt1();
for(;;) {
uint16_t current;
do current = get_tcnt1(); while( (uint16_t)(current - start) < 0x1234 );
start = current;
PORTB ^= 0x01;
}
}
2.hКод
uint16_t get_tcnt1();
2.cКод
#include <avr/io.h>
#include "3.h"
uint16_t get_tcnt1()
{
uint8_t srg = irg_save_and_disable();
uint16_t tmp = TCNT1;
irq_restore(srg);
return tmp;
}
3.hКод
uint8_t irg_save_and_disable();
void irq_restore(uint8_t srg);
3.cКод
#include <avr/io.h>
#include <avr/interrupt.h>
uint8_t irg_save_and_disable()
{
uint8_t temp = SREG;
cli();
return temp;
}
void irq_restore(uint8_t srg)
{
SREG = srg;
}
do.batКод
set avrgcc=c:\WinAVR-20081205\bin
%avrgcc%\avr-gcc -Wall -Wextra --version 2>&1
%avrgcc%\avr-gcc -Wall -Wextra -Os --combine --whole-program -mmcu=atmega8 -Wno-main 1.c 2.c 3.c 2>&1
%avrgcc%\avr-objdump -d -S a.out >a.dump
c:\WinAVR-20081205Код
0000005e <main>:
5e: 8f b7 in r24, 0x3f; 63
60: f8 94 cli
62: 4c b5 in r20, 0x2c; 44
64: 5d b5 in r21, 0x2d; 45
66: 8f bf out 0x3f, r24; 63
68: 61 e0 ldi r22, 0x01; 1
6a: 8f b7 in r24, 0x3f; 63
6c: f8 94 cli
6e: 2c b5 in r18, 0x2c; 44
70: 3d b5 in r19, 0x2d; 45
72: 8f bf out 0x3f, r24; 63
74: c9 01 movw r24, r18
76: 84 1b sub r24, r20
78: 95 0b sbc r25, r21
7a: 84 53 subi r24, 0x34; 52
7c: 92 41 sbci r25, 0x12; 18
7e: a8 f3 brcs .-22 ; 0x6a <main+0xc>
80: 88 b3 in r24, 0x18; 24
82: 86 27 eor r24, r22
84: 88 bb out 0x18, r24; 24
86: a9 01 movw r20, r18
88: f0 cf rjmp .-32 ; 0x6a <main+0xc>
0000008a <_exit>:
8a: f8 94 cli
0000008c <__stop_program>:
8c: ff cf rjmp .-2 ; 0x8c <__stop_program>
c:\WinAVR-20071221Код
0000005e <main>:
5e: 8f b7 in r24, 0x3f; 63
60: f8 94 cli
62: 4c b5 in r20, 0x2c; 44
64: 5d b5 in r21, 0x2d; 45
66: 8f bf out 0x3f, r24; 63
68: 8f b7 in r24, 0x3f; 63
6a: f8 94 cli
6c: 2c b5 in r18, 0x2c; 44
6e: 3d b5 in r19, 0x2d; 45
70: 8f bf out 0x3f, r24; 63
72: c9 01 movw r24, r18
74: 84 1b sub r24, r20
76: 95 0b sbc r25, r21
78: 84 53 subi r24, 0x34; 52
7a: 92 41 sbci r25, 0x12; 18
7c: a8 f3 brcs .-22 ; 0x68 <main+0xa>
7e: 88 b3 in r24, 0x18; 24
80: 91 e0 ldi r25, 0x01; 1
82: 89 27 eor r24, r25
84: 88 bb out 0x18, r24; 24
86: a9 01 movw r20, r18
88: ef cf rjmp .-34 ; 0x68 <main+0xa>
0000008a <_exit>:
8a: ff cf rjmp .-2 ; 0x8a <_exit>
c:\WinAVR-20021209UPD: Ой, наврал, у него не получаетсяЦитата(_Pasha @ Mar 5 2009, 12:44)

Так его и не будет. Из разных модулей проинлайнить что-либо невозможно.
С этими опциями - на раз (не забыв указать в командной строке драйвера gcc все файлы проекта).
Причём даже с
даже с переупорядочиванием кусков.
UPD2:Это хозяйство работает (из установленного у меня) начиная с avr-gcc 4.1.2 (WinAVR-20070525), для 3.4.6 (WinAVR-20060421) и более ранних - не работает, у них просто ключей таких нет.