|
Замена обработчика прерывания в WinAVR |
|
|
|
Dec 16 2008, 04:23
|

Местный
  
Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249

|
Нужно использовать различные обработчики прерывания в зависимости от случая. Например в начале программы обработчик_пр = функция 1 Код ISR(INT1_vect) { обработчик_пр } а затем где-то по далее необходимо заменить его на обработчик_пр = функция 2 Как это грамотно сделать в WinAVR?
--------------------
Если все, то не я...
|
|
|
|
|
 |
Ответов
|
Dec 16 2008, 06:13
|

Местный
  
Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249

|
Цитата(MrYuran @ Dec 16 2008, 09:59)  Определить указатель на функцию и поставить его в тело обработчика прерывания. Указателю между делом можно присваивать адреса разных функций. Издержки - команда CALL в теле обработчика прерываний. Зато задержка будет фиксированной и независимой от условий, как в случае switch или if/else. +1 Кстати это очень удобно. Код //Прототипы функций void isr1(void); void isr2(void); //Указатель на функцию обработчик void (* cur_isr)(void) = isr1;
void isr1(void) { // тело обработчика 1 }
void isr2(void) { // тело обработчика 2 }
ISR(INT1_vect) { (* cur_isr)(); }
int main(void) { // ля-ля тополя... ... cur_isr = isr2; ... }
--------------------
Если все, то не я...
|
|
|
|
|
Dec 16 2008, 07:49
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(PhX @ Dec 16 2008, 08:13)  Код int main(void) { // ля-ля тополя... ... cur_isr = isr2; ... } Оно, конечно, "само собой разумеется", но cur_isr = isr2; надо в атомарный блок взять.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Dec 16 2008, 09:19
|

Местный
  
Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249

|
Цитата(ReAl @ Dec 16 2008, 11:49)  Оно, конечно, "само собой разумеется", но cur_isr = isr2; надо в атомарный блок взять. А как это сделать? Цитата Вызов функции по указателю внутри обработчика ведет к сохранению ВСЕХ регистров в стеке. И восстановлению их при выходе. Не быстрый обработчик получается Ну хоть как-то. Не очень хорошо конечно, но что делать. Может есть способ лучше? Правда, в мем случае, быстродействия достаточно.
--------------------
Если все, то не я...
|
|
|
|
Сообщений в этой теме
PhX Замена обработчика прерывания в WinAVR Dec 16 2008, 04:23 733259 ИМХО никак, т.к. в AVR адреса векторов фиксированы... Dec 16 2008, 04:35    defunct Цитата(PhX @ Dec 16 2008, 11:19) Ну хоть ... Dec 20 2008, 01:03 Qwertty Вызов функции по указателю внутри обработчика веде... Dec 16 2008, 08:36 MrYuran Цитата(Qwertty @ Dec 16 2008, 11:36) Вызо... Dec 17 2008, 11:34  _Pasha Цитата(MrYuran @ Dec 17 2008, 15:34) а чт... Dec 17 2008, 11:46   Сергей Борщ Цитата(_Pasha @ Dec 17 2008, 13:46) Не, т... Dec 17 2008, 14:31 _Pasha Векторизация прерываний. Например, int1
Soft_vect... Dec 16 2008, 09:19 _Pasha Цитата(_Pasha @ Dec 16 2008, 13:19) Прост... Dec 16 2008, 09:38 aesok Цитата(_Pasha @ Dec 16 2008, 12:19) Векто... Dec 16 2008, 10:23  _Pasha Цитата(aesok @ Dec 16 2008, 14:23) Компил... Dec 16 2008, 10:48  _Pasha Цитата(aesok @ Dec 16 2008, 14:23) Компил... Dec 16 2008, 18:10 733259 А в своем теле функция никакие регистры не использ... Dec 16 2008, 11:24 _Pasha Цитата(733259 @ Dec 16 2008, 15:24) А в с... Dec 16 2008, 11:38 ARV в некоторых случаях можно делать перезапись вектор... Dec 16 2008, 17:04 singlskv Господа, Вы занимаетесь просто какой-то х.р..й ...... Dec 16 2008, 18:44 _Pasha Цитата(singlskv @ Dec 16 2008, 22:44) Гос... Dec 16 2008, 19:50  singlskv Цитата(_Pasha @ Dec 16 2008, 22:50) Т.е. ... Dec 16 2008, 20:03 733259 ЦитатаСправедливости ради, такой подход имеет один... Dec 17 2008, 02:01 _Pasha Цитата(733259 @ Dec 17 2008, 06:01) прави... Dec 17 2008, 10:17  singlskv Цитата(_Pasha @ Dec 17 2008, 13:17) Следо... Dec 17 2008, 11:09  ReAl Цитата(_Pasha @ Dec 17 2008, 12:17) Есть ... Dec 20 2008, 16:00   _Pasha Цитата(ReAl @ Dec 20 2008, 20:00) посмотр... Dec 20 2008, 16:26 Rst7 Не знаю, можно ли все, что я тут напишу, реализова... Dec 17 2008, 07:42 733259 Что Ваш вариант в 20 тактов, что через icall в 21.... Dec 17 2008, 07:55 Rst7 ЦитатаЧто Ваш вариант в 20 тактов, что через icall... Dec 17 2008, 08:19 ReAl Я погонял компиляцию этого дела в разных режимах.
... Dec 20 2008, 16:34 _Pasha Цитата(ReAl @ Dec 20 2008, 20:34) что даё... Dec 20 2008, 16:49
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|