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

 
 
> Замена обработчика прерывания в WinAVR
PhX
сообщение Dec 16 2008, 04:23
Сообщение #1


Местный
***

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



Нужно использовать различные обработчики прерывания в зависимости от случая. Например в начале программы
обработчик_пр = функция 1
Код
ISR(INT1_vect)
{
обработчик_пр
}

а затем где-то по далее необходимо заменить его на
обработчик_пр = функция 2
Как это грамотно сделать в WinAVR?


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
singlskv
сообщение Dec 16 2008, 18:44
Сообщение #2


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Господа, Вы занимаетесь просто какой-то х.р..й ... smile.gif smile.gif smile.gif
Вот это обертка в асм файле isr.s :
Код
.extern curr_isr
.global TIMER1_COMPA_vect; прерывание с переключаемым обработчиком
TIMER1_COMPA_vect:
  push  r30
  push  r31
  lds   r30, curr_isr
  lds   r31, curr_isr + 1
  icall
  pop   r31
  pop   r30
  reti


а вот это сам файл с обработчиками и примером:
Код
#include <avr/io.h>
#include <avr/interrupt.h>

volatile unsigned char tmp;

void INT0_vect(void) __attribute__((interrupt)); // свободный вектор прерывания
void INT0_vect(void)
{
  tmp = 0; // тело обработчика 0
}

void INT1_vect(void) __attribute__((interrupt)); // свободный вектор прерывания
void INT1_vect(void)
{
  tmp = 1; // тело обработчика 1
}

//Указатель на функцию обработчик
void (* curr_isr)(void) = INT1_vect;

int main(void)
{
  curr_isr = INT1_vect;
  asm("sei");
  while (1);
}

Накладные расходы примерно 16МЦ... на фсе...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 16 2008, 19:50
Сообщение #3


;
******

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



Цитата(singlskv @ Dec 16 2008, 22:44) *
Господа, Вы занимаетесь просто какой-то х.р..й ... smile.gif smile.gif smile.gif

Кому х.р.я, а кому - сын ошибок трудных. smile.gif
Т.е. получается, что __attribute__((interrupt)) и заставляет все call-used регистры сохранять внутри функции?
Цитата
Кстати Ваш ужас ...

Как приятно иногда сказать: знатоки, блин. lol.gif
Go to the top of the page
 
+Quote Post
singlskv
сообщение Dec 16 2008, 20:03
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(_Pasha @ Dec 16 2008, 22:50) *
Т.е. получается, что __attribute__((interrupt)) и заставляет все call-used регистры сохранять внутри функции?
Справедливости ради, такой подход имеет один побочный эфект,
прерывания будут разрешены еще до окончательного выхода из нашего
главного обработчика, НО, если прерывания идут с таким темпом что это
может вызвать переполнение стека, при других вариантах обработки мы просто
будем пропускать прерывания, так что такой вариант ИМХО вполне адекватный...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- PhX   Замена обработчика прерывания в WinAVR   Dec 16 2008, 04:23
- - 733259   ИМХО никак, т.к. в AVR адреса векторов фиксированы...   Dec 16 2008, 04:35
- - MrYuran   Определить указатель на функцию и поставить его в ...   Dec 16 2008, 05:59
|- - PhX   Цитата(MrYuran @ Dec 16 2008, 09:59) Опре...   Dec 16 2008, 06:13
|- - ReAl   Цитата(PhX @ Dec 16 2008, 08:13) Кодint m...   Dec 16 2008, 07:49
|- - PhX   Цитата(ReAl @ Dec 16 2008, 11:49) Оно, ко...   Dec 16 2008, 09:19
|- - 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
- - 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


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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 05:19
Рейтинг@Mail.ru


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