Цитата(777777 @ Sep 6 2009, 09:26)

Ошибаетесь. Ничего он вставлять не будет, он тупо вставит эти команды, более того, добавление такой вставки вызовет необходимость отключения оптимизатора!
не ошибаюсь. вы, наверное, считаете, что ассемблерные вставки в GCC тупо 1 к 1 компилируются в код? ну, если речь идет о командах типа NOP - это действительно так. но в GCC имеется механизм для создания вставок с параметрами, и вот тут-то компилятор может разгуляться вовсю. так что вставка вставке рознь... вот пример:
Код
#include <avr/io.h>
#include <avr/interrupt.h>
volatile uint8_t value;
ISR(TIMER0_OVF_vect){
asm (
"in %0, %1" :
"=r" (value) :
"I" (_SFR_IO_ADDR(PORTD))
);
}
int main(void)
{
}
а вот листинг результата (только часть, касающаяся ISR:
Код
ISR(TIMER0_OVF_vect){
44: 1f 92 push r1
46: 0f 92 push r0
48: 0f b6 in r0, 0x3f; 63
4a: 0f 92 push r0
4c: 11 24 eor r1, r1
4e: 8f 93 push r24
asm (
50: 82 b3 in r24, 0x12; 18
52: 80 93 60 00 sts 0x0060, r24
"in %0, %1" :
"=r" (value) :
"I" (_SFR_IO_ADDR(PORTD))
);
}
56: 8f 91 pop r24
58: 0f 90 pop r0
5a: 0f be out 0x3f, r0; 63
5c: 0f 90 pop r0
5e: 1f 90 pop r1
60: 18 95 reti
обратите на то, чего нет в ассемблерной вставке, но есть в коде (касается R24) - я об этом и говорил
а теперь представьте себе, что ассемблерная вставка выглядела бы так:
Код
asm (
"in %0, %1\n\t"
"reti" :
"=r" (value) :
"I" (_SFR_IO_ADDR(PORTD))
);
вроде никакого криминала - считали из порта в переменную и выход из прерывания (так
хотелось), но ведь получится-то реально полный крах стека:
Код
ISR(TIMER0_OVF_vect){
44: 1f 92 push r1
46: 0f 92 push r0
48: 0f b6 in r0, 0x3f; 63
4a: 0f 92 push r0
4c: 11 24 eor r1, r1
4e: 8f 93 push r24
asm (
50: 82 b3 in r24, 0x12; 18
52: 18 95 reti
54: 80 93 60 00 sts 0x0060, r24
"in %0, %1\n\t"
"reti" :
"=r" (value) :
"I" (_SFR_IO_ADDR(PORTD))
);
}
58: 8f 91 pop r24
5a: 0f 90 pop r0
5c: 0f be out 0x3f, r0; 63
5e: 0f 90 pop r0
60: 1f 90 pop r1
62: 18 95 reti
поэтому я и предупредил автора топика, что перед тем, как делать вставки в GCC надо изучить, как их делать правильно...
Я бы взял частями... но мне надо сразу.