Цитата(AVR38 @ Sep 3 2009, 18:19)

ISR(TIMER0_COMP_vect)
{
asm("reti""\n");
};
Когда задаете вопрос, нужно в первую очередь писать что вы хотите добиться, из приведенного фрагмента это не понятно - для чего подпрограмма обработки прерываний состоящая из одного возврата? Если там есть еще какие-то команды, обозначайте их как-то, многоточиями например. А для чего в нее надо вставлять reti? Ведь это подпрограмма обработки прерываний, компилятор знает об этом и вставит эту команду сам, это ведь очевидно. Если нужно выйти из середины программы, пиши return - это ведь программа на Си.
А вообще, ассемблерные вставки - это дичайшая глупость, я вообще не предстваляю зачем компиляторы разрешают их. Если надо написать обработку прерывания (или какую-то другую подпрограмму) на ассемблере, пишите ее на ассемблере целиком и в другом файле. А для чего могут понадобиться вставки?
Цитата(ARV @ Sep 4 2009, 11:10)

компилятор запросто может самостоятельно обрамлять вашу вставку дополнительными командами (типа push-pop)
Ошибаетесь. Ничего он вставлять не будет, он тупо вставит эти команды, более того, добавление такой вставки вызовет необходимость отключения оптимизатора!
Цитата(demiurg_spb @ Sep 4 2009, 15:22)

Есть выход - писать обработчики прерываний полостью на ASM в отдельном *.s файле (если ASM _действительно необходим_).
Я знаю только одну причину - если из прерывания
нужно вызвать какую-то функцию, тогда в обработчик вставляется сохранение и восстановдление всех регистров, так как компилятор не знает какие из них используются в функции.
Цитата(demiurg_spb @ Sep 4 2009, 15:22)

Напишите для начала на чистом С. Вдруг это вас устроит. Зачем лишняя морока...
+1000
Сообщение отредактировал 777777 - Sep 6 2009, 05:22