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

 
 
> с++ и прерывания
Sirko
сообщение Jan 23 2012, 12:16
Сообщение #1


Местный
***

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



Есть желание написать класс USART для XMega, благо строение ядра способствует. Но вот как быть с прерываниями?
Не хочется для каждого объекта прописывать обработчики в ручную, а как реализовать шаблонно или с макросами, не представляю.

Есть идеи?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
prottoss
сообщение Jan 23 2012, 13:37
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Может так?

Код
class clUSART
    {
   public:    
        usart_t *c;
        
        void Init(usart_t *p){ c = p;};
        ...
        static void isr(usart_t *p);
   }
  
   clUSART u0, u1, u2;
  
    static void clUSART::isr(clUSART *p)
   {
        ...
   }
  
   __interrupt void u0_isr()
   {
        clUSART::isr(u0.c);
   }
   __interrupt void u1_isr()
    {
         clUSART::isr(u1.c);
    }
   __interrupt void u2_isr()
    {
         clUSART::isr(u2.c);
    }
   ...
   main()
   {
       u1.Init(p_usart1);
       u2.Init(p_usart2);
       u3.Init(p_usart3);
       ...
   }
   }


sm.gif Чет туплю после работ... редактирую 5-ый раз. Ну, надеюсь смысл понятен.

Сообщение отредактировал prottoss - Jan 23 2012, 13:53


--------------------
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 23 2012, 14:14
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(prottoss @ Jan 23 2012, 15:37) *
Может так?

Так конечно можно, но есть недостатки:
Код
class clUSART
    {
   public:    
        usart_t *c;

Обращение будет по указателю, а хотелось бы через STD/LDD (не путаю команды?)



Код
   __interrupt void u0_isr()
   {
        clUSART::isr(u0.c);
   }
   __interrupt void u1_isr()
    {
         clUSART::isr(u1.c);
    }
   __interrupt void u2_isr()
    {
         clUSART::isr(u2.c);
    }
   ...
   }

Каждый вектор отдельно прописывать?
И ещё вызов функции делать?
P.S. Не понял где вектор указывается.


Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 23 2012, 14:59
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(_Артём_ @ Jan 23 2012, 20:14) *
P.S. Не понял где вектор указывается.

Ну так
__interrupt void u0_isr();
__interrupt void u1_isr();
__interrupt void u2_isr();

и есть обработчики (векторы), которые подставляют указатель конкретного USART в общий для объектов обработчик clUSART::isr

Я просто не знаю, какие в xmega имена обработчиков определены в IAR.


--------------------
Go to the top of the page
 
+Quote Post



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

 


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


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