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

 
 
> С++, метод шаблонного класса как обработчик прерывания
_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
Ответов
_pv
сообщение Jun 12 2017, 20:33
Сообщение #2


Гуру
******

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



помойка нужна для, как мне казалось, упрощения кода.

Uart <UART0> pc;
Uart <UART1, 4> sensor;
Uart <UART2, 100> asdf;
...

sensor.read()
pc.write()

как похожее сделать некрасиво на С с препроцессором представляю
или что при объявлении в конструктор можно передавать указатель на структуру со всей кучей индивидуальных для каждого уарта регистров.

хотелось бы понять как можно сделать на плюсах.
Go to the top of the page
 
+Quote Post
conan
сообщение Jun 12 2017, 22:01
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 3-11-11
Пользователь №: 68 126



Цитата(_pv @ Jun 12 2017, 23:33) *
помойка нужна для, как мне казалось, упрощения кода.

Uart <UART0> pc;
Uart <UART1, 4> sensor;
Uart <UART2, 100> asdf;
...

sensor.read()
pc.write()

как похожее сделать некрасиво на С с препроцессором представляю
или что при объявлении в конструктор можно передавать указатель на структуру со всей кучей индивидуальных для каждого уарта регистров.

хотелось бы понять как можно сделать на плюсах.


Можно сделать шаблон для общего случая, и к нему специализации:
Код
template<int USARTx_BASE, int FIFO_SIZE>
class Uart
{};

template<int FIFO_SIZE>
class Uart<UART0, FIFO_SIZE>
{};

template<int FIFO_SIZE>
class Uart<UART1, FIFO_SIZE>
{};

...

template<int FIFO_SIZE>
class Uart<UART16, FIFO_SIZE>
{};


Если для какого-то USARTx_BASE нет специализации, то будет использоваться общий вариант. Можно сделать специализации не только по одному аргументу, но и по нескольким:
Код
template<>
class Uart<UART1, 32>
{};

Но типы полученные от одного шаблона с разными значениями шаблонных аргументов -- разные типы. Нельзя объект от Uart<UART0, 16> передать в функцию, которая ждет Uart<UART1, 16>& или Uart<UART, 32>& (но можно сделать функцию тоже шаблонной). Еще есть подход Type erasure
Go to the top of the page
 
+Quote Post
_pv
сообщение Jun 20 2017, 09:35
Сообщение #4


Гуру
******

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



Цитата(conan @ Jun 13 2017, 04:01) *
Можно сделать шаблон для общего случая, и к нему специализации:
...
Но типы полученные от одного шаблона с разными значениями шаблонных аргументов -- разные типы.

вот с этим и вопрос, как объявить обработчик прерывания, если тип этого конкретного уарта становится известным только при объявлении из-за шаблона.
Цитата(Forger)
Можно проще: базовый абстрактный класс (с несколькими чисто виртуальными методами), от него наследуется шаблонный класс, в котором реализуются эти виртуальные методы из базового класса.

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

Сообщений в этой теме
- _pv   С++, метод шаблонного класса как обработчик прерывания   Jun 12 2017, 16:45
- - conan   2. Нестатический метод класса можно вызывать тольк...   Jun 12 2017, 19:40
|- - AHTOXA   Цитата(_pv @ Jun 13 2017, 01:33) Uart ...   Jun 12 2017, 21:42
|- - Forger   Цитата(conan @ Jun 13 2017, 01:01) Нельзя...   Jun 19 2017, 18:32
|- - 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   Цитатавот с этим и вопрос, как объявить обработчик...   Jun 20 2017, 10:40
|- - _pv   Цитата(sigmaN @ Jun 20 2017, 16:40) Из об...   Jun 20 2017, 14:08
- - 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 Текстовая версия Сейчас: 27th June 2025 - 11:50
Рейтинг@Mail.ru


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