реклама на сайте
подробности

 
 
> GCC и Simulator AVR Studio 4.17, развертывание контекста при выходе из прерывания
AVR38
сообщение Sep 3 2009, 14:19
Сообщение #1





Группа: Участник
Сообщений: 11
Регистрация: 3-09-09
Пользователь №: 52 181



Здравствуйте!
Запарился на такой простой с виду штуке, написанной в самообучающих целях:

контроллер ATmega32, AVR Studio 4.17, WinAVR-20090313
в обработчике прерывания от TCNT0 была сделана ассемблерная вставка. В эмуляторе при выходе из прырывания не восстаналивается из стека адрес возврата и происходит сброс программы. Даже при урезнии ассемблерной вставки до вида:

ISR(TIMER0_COMP_vect)
{
asm("reti""\n");
};

баг не пропадает.
Подскажите, где нагрешил?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
777777
сообщение Sep 6 2009, 05:26
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(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
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 6 2009, 07:09
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(777777 @ Sep 6 2009, 08:26) *
А вообще, ассемблерные вставки - это дичайшая глупость, я вообще не предстваляю зачем компиляторы разрешают их.

Тоже так думал - но все-же несколько моментов оказались удобными. Пример - правильное умножение 16бит * 16бит с результатом 32бита
Цитата
добавление такой вставки вызовет необходимость отключения оптимизатора!

Как раз оптимизатор там нужен для того, чтобы назначить "правильные" регистры для работы вставки. Остальное - оптимизировано вручную. smile.gif

Цитата
если из прерывания нужно вызвать какую-то функцию, тогда в обработчик вставляется сохранение и восстановдление всех регистров, так как компилятор не знает какие из них используются в функции.

Дык и не надо вызывать - лучше инлайнить. Наворачивать сложные прерывания - это моветон smile.gif
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 16:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.0136 секунд с 7
ELECTRONIX ©2004-2016