|
С++, метод шаблонного класса как обработчик прерывания |
|
|
|
Jun 12 2017, 16:45
|
Гуру
     
Группа: Свой
Сообщений: 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
наверняка не раз уже обсуждалось, но что-то сходу не нашлось, ткните как с однотипной периферией на плюсах правильно работать.
|
|
|
|
|
 |
Ответов
|
Jun 12 2017, 22:01
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 20 2017, 09:35
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(conan @ Jun 13 2017, 04:01)  Можно сделать шаблон для общего случая, и к нему специализации: ... Но типы полученные от одного шаблона с разными значениями шаблонных аргументов -- разные типы. вот с этим и вопрос, как объявить обработчик прерывания, если тип этого конкретного уарта становится известным только при объявлении из-за шаблона. Цитата(Forger) Можно проще: базовый абстрактный класс (с несколькими чисто виртуальными методами), от него наследуется шаблонный класс, в котором реализуются эти виртуальные методы из базового класса. а что делать с обработчиком прерывания? как получить статический метод шаблонного класса? завести отдельный глобальный указатель на функцию, которая передаётся обработчику прерывания, и в конструкторе pUART0ISRfunc = this->isr
|
|
|
|
Сообщений в этой теме
_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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|