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

 
 
> С++, метод шаблонного класса как обработчик прерывания
_pv
сообщение Jun 12 2017, 16:45
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



есть базовый класс, пусть будет уарта, которому через шаблон задаётся базовый адрес регистров и размер фифо.
template <int USARTx_BASE, int fifoSize = 32> class UartBase{
void ISRBase();
};

теперь делаем классы под каждый uart, так как немного разная инициализация (как минимум клоки включаются отдельно), и статический обработчик прерывания.

template <int fifoSize = 32> class Uart0 : UartBase<LPC_USART0_BASE, fifoSize>{
Uart0(){...}
static void ISR() { UartBase<LPC_USART0_BASE, fifoSize>::ISRBase(); }
};

вопрос1: как теперь сделать Uart0::ISR() обработчиком прерывания? с шаблоном-то тип у него тип теперь к размеру FIFO привязан.
void UART0_IRQHandler() { Uart0<?????????>::ISR(); }

кроме как убрать шаблон можно по другому это как-то по-человечески сделать?
class Uart0 : UartBase<LPC_USART0_BASE, UART0_FIFO_SIZE>

вопрос2: метод базового класса UartBase<LPC_USART0_BASE, fifoSize>::ISR(); тоже вызываться не хочет из статического метода.
error: cannot call member function 'void UartBase<USARTx_BASE, fifoSize>::ISR() [with int USARTx_BASE = 1074151424; int fifoSize = 32]' without object

наверняка не раз уже обсуждалось, но что-то сходу не нашлось, ткните как с однотипной периферией на плюсах правильно работать.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sigmaN
сообщение Jun 20 2017, 10:40
Сообщение #2


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
вот с этим и вопрос, как объявить обработчик прерывания
В соответствии с мануалом на компилятор и HAL выбранного вами процессора.
Для AVR обработчик прерывания объявляется вот так.
Код
ISR( TIM0_OVF_vect )
{
}

В этом обработчкие вы вольны делать всё что хотите. В том числе вызвать либо статический метод вашего шаблонного полностью статического класса. Либо инстанциировать класс и вызвать не статический метод.

Цитата
а что делать с обработчиком прерывания? как получить статический метод шаблонного класса?

Из обработчика прерывания вы можете вызвать любой метод, хоть статичный хоть нет.
Код
ISR( TIM0_OVF_vect )
{
    SomeInstance.CallFromISR();
    SomeFullyStaticClass::SomeStaticMethod();
}



Вы немного путаетесь, вам надо теорию почитать что есть шаблон что статик что не статик.
Шаблон не обязан быть стататиком.

Всё что было сказано выше про виртуальные функции подразумевает не статичные методы и работу именно с экземплярами класса по ссылке(указателю) на родительский класс.
Это называется полиморфизм. Опять же надо теорию почитать.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
_pv
сообщение Jun 20 2017, 14:08
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(sigmaN @ Jun 20 2017, 16:40) *
Из обработчика прерывания вы можете вызвать любой метод, хоть статичный хоть нет.
Код
ISR( TIM0_OVF_vect )
{
    SomeInstance.CallFromISR();
    SomeFullyStaticClass::SomeStaticMethod();
}

спасибо, капитан.

хотелось немного красоты, то есть просто объявить
Uart0 <64> pc;
и после этого не лезть потом в обработчик прерывания чтобы указать там ещё разимя этого конкретного экзэмпляра этого uarta, он ведь всё равно один единственный. ну и ещё размер фифо, если сделать метод статическим

ISR( TIM0_OVF_vect ){
Uart0<64>::pc.CallFromISR();
}

в результате сделал просто глобальный указатель на функцию Uart0CallFromISR, который зовётся из прерывания и инициализируется как this->isr в конструкторе uart0.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- _pv   С++, метод шаблонного класса как обработчик прерывания   Jun 12 2017, 16:45
- - conan   2. Нестатический метод класса можно вызывать тольк...   Jun 12 2017, 19:40
- - _pv   помойка нужна для, как мне казалось, упрощения код...   Jun 12 2017, 20:33
|- - AHTOXA   Цитата(_pv @ Jun 13 2017, 01:33) Uart ...   Jun 12 2017, 21:42
|- - conan   Цитата(_pv @ Jun 12 2017, 23:33) помойка ...   Jun 12 2017, 22:01
|- - Forger   Цитата(conan @ Jun 13 2017, 01:01) Нельзя...   Jun 19 2017, 18:32
|- - _pv   Цитата(conan @ Jun 13 2017, 04:01) Можно ...   Jun 20 2017, 09:35
|- - Forger   Цитата(_pv @ Jun 20 2017, 12:35) вот с эт...   Jun 20 2017, 10:40
- - sigmaN   Ну там в зависимости от везения может появляться н...   Jun 19 2017, 21:35
|- - Forger   Цитата(sigmaN @ Jun 20 2017, 00:35) Ну та...   Jun 20 2017, 05:34
- - sigmaN   ну вот это вот Uart0<64> то зачем по всей пр...   Jun 20 2017, 15:42
|- - Forger   Цитата(sigmaN @ Jun 20 2017, 18:42) Какое...   Jun 21 2017, 06:24
- - Lagman   Вот посмотрите видео https://www.youtube.com/watch...   Jun 21 2017, 06:50
- - sigmaN   ЦитатаСтатические методы в классе нужны крайне ред...   Jun 21 2017, 09:49
|- - Forger   Цитата(sigmaN @ Jun 21 2017, 12:49) И как...   Jun 21 2017, 10:21
|- - Сергей Борщ   QUOTE (Forger @ Jun 21 2017, 13:21) Стран...   Jun 21 2017, 11:07
|- - Forger   Цитата(Сергей Борщ @ Jun 21 2017, 14:07) ...   Jun 21 2017, 11:14
|- - Сергей Борщ   QUOTE (Forger @ Jun 21 2017, 14:14) Ооо...   Jun 21 2017, 11:23
|- - Forger   Цитата(Сергей Борщ @ Jun 21 2017, 14:23) ...   Jun 21 2017, 11:44
- - sigmaN   Ну таки если бы это противоречило ООП то я бы с ва...   Jun 21 2017, 10:30
|- - Forger   Цитата(sigmaN @ Jun 21 2017, 13:30) Ну та...   Jun 21 2017, 10:45
- - sigmaN   Во-первых там 200Кб текста, а не мегабайт(вы внима...   Jun 21 2017, 11:32


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

 


RSS Текстовая версия Сейчас: 12th August 2025 - 09:58
Рейтинг@Mail.ru


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