Перейти к содержанию
    

только прерывания

Добрый вечер, уважаемые!

 

#pragma vector=TIMER1_COMPA_vect
__interrupt void TIMER1_COMPA_ISR(void)
{
...
}

void main( void )
{
	__sleep();
}

Имеем программу, вся работа которой выполняется в прерываниях. Каким образом объяснить компилятору, что сохранять регистры при входе в прерывание не имеет смысла и не требуется?

ATmega16, EWAVR версии 6

Изменено пользователем pyroman

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 минуты назад, pyroman сказал:

Каким образом объяснить компилятору, что сохранять регистры при входе в прерывание не имеет смысла и не требуется?

У IAR EWARM есть префикс __task для такого. Может и у EWAVR он есть - см. мануал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 minutes ago, jcxz said:

У IAR EWARM есть префикс __task для такого. Может и у EWAVR он есть - см. мануал.

Спасибо, он есть, но

__task void main( void )

ничего не изменило

А к процедуре прерывания это не применимо.

#pragma vector=TIMER1_COMPA_vect
__noreturn __interrupt void TIMER1_COMPA_ISR(void)
{
...
}

__task void main( void )
{
	__sleep();
}

Получилось... Помог __noreturn

Изменено пользователем pyroman

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

57 минут назад, pyroman сказал:

Получилось... Помог __noreturn

__noreturn вообще-то для другого. Для функций из которых нет возврата. У вас же - ISR. А значит возврат есть. Так что - возможно грабли вы уже разложили, только ещё не наступили на них.  :biggrin:

Не знаю как там в AVR, но в ARM возврат осуществляется посредством регистра LR. Который не должен быть разрушен внутри функции. Но __noreturn отменяет это правило. А значит LR может быть использован для каких-то целей. И адрес возврата - разрушен. Но заметить вы это можете только когда или включите оптимизацию или напишете больше кода. Тогда с удивлением обнаружите, что программа вдруг перестала работать. И конечно решите, что глючит компилятор, собака!  :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#pragma vector=TIMER1_COMPA_vect
__raw __interrupt void TIMER1_COMPA_ISR(void)

Нашёл - специально для прерываний есть __raw

Изменено пользователем pyroman

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...