pyroman 2 12 мая, 2023 Опубликовано 12 мая, 2023 (изменено) · Жалоба Добрый вечер, уважаемые! #pragma vector=TIMER1_COMPA_vect __interrupt void TIMER1_COMPA_ISR(void) { ... } void main( void ) { __sleep(); } Имеем программу, вся работа которой выполняется в прерываниях. Каким образом объяснить компилятору, что сохранять регистры при входе в прерывание не имеет смысла и не требуется? ATmega16, EWAVR версии 6 Изменено 12 мая, 2023 пользователем pyroman Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 12 мая, 2023 Опубликовано 12 мая, 2023 · Жалоба 23 минуты назад, pyroman сказал: Каким образом объяснить компилятору, что сохранять регистры при входе в прерывание не имеет смысла и не требуется? У IAR EWARM есть префикс __task для такого. Может и у EWAVR он есть - см. мануал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pyroman 2 12 мая, 2023 Опубликовано 12 мая, 2023 (изменено) · Жалоба 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 Изменено 12 мая, 2023 пользователем pyroman Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 12 мая, 2023 Опубликовано 12 мая, 2023 · Жалоба 57 минут назад, pyroman сказал: Получилось... Помог __noreturn __noreturn вообще-то для другого. Для функций из которых нет возврата. У вас же - ISR. А значит возврат есть. Так что - возможно грабли вы уже разложили, только ещё не наступили на них. Не знаю как там в AVR, но в ARM возврат осуществляется посредством регистра LR. Который не должен быть разрушен внутри функции. Но __noreturn отменяет это правило. А значит LR может быть использован для каких-то целей. И адрес возврата - разрушен. Но заметить вы это можете только когда или включите оптимизацию или напишете больше кода. Тогда с удивлением обнаружите, что программа вдруг перестала работать. И конечно решите, что глючит компилятор, собака! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pyroman 2 13 мая, 2023 Опубликовано 13 мая, 2023 (изменено) · Жалоба #pragma vector=TIMER1_COMPA_vect __raw __interrupt void TIMER1_COMPA_ISR(void) Нашёл - специально для прерываний есть __raw Изменено 13 мая, 2023 пользователем pyroman Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться