Easyelectronics.ru

Электроника для всех
Текущее время: 17 сен 2019, 01:36

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: C++. Передача вызова прерывания в объект.
СообщениеДобавлено: 08 янв 2015, 22:59 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1797
Откуда: Новокузнецк
Здравствуйте.
Например, создаю класс UART, который должен работать на прерываниях.

Код:
Class Uart
{
public:
    Uart(UartId_t UartId);
}

Каждый экземпляр этого класса будет привязываться к своему аппаратному уарту, в зависимости от передаваемого в конструктор значения. Но как привязать определенные прерывания к определенным объектам УАРТа?
Сейчас сделал так: сразу создаю глобальные объекты, и в функциях прерывания вызываю соответствующий метод соответствующего объекта:
Код:
Class Uart
{
public:
   Uart(UartId_t UartId);
   void onTxCompleate();
}

Uart Uart1, Uart2, Uart3;

void USART1_Handler()
{
   Uart1.onTxCompleate();
}

void USART2_Handler()
{
   Uart2.onTxCompleate();
}

void USART3_Handler()
{
   Uart3.onTxCompleate();
}

Это весьма неудобно, так как связывать прерывание можно только с глобальным статическим объектом. Хотелось бы как-то связать прерывание динамически при создании объекта. Пока в мыслях написать "менеджер прерываний", в котором регистрировать объекты к определенным прерываниям контроллера.
Кто что посоветует? Заранее спасибо.

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++. Передача вызова прерывания в объект.
СообщениеДобавлено: 09 янв 2015, 01:20 
Старожил

Зарегистрирован: 21 дек 2013, 18:00
Сообщения: 210
а чем глобальные объекты не подходят? на каждый UART свой глобальный объект. всеже количество UART-ов в устройстве константа и не варьируется в рантайме.

аааа... щас в меня помидоры полетят...
вот как в ардуине сделано:
https://github.com/arduino/Arduino/blob ... reSerial.h
https://github.com/arduino/Arduino/blob ... Serial.cpp

если всеже хочется привязывать обработчики в рантайме - можно подсмотреть идею в mbed.
класс менеджера прерываний из mbed:
https://github.com/mbedmicro/mbed/blob/ ... tManager.h
https://github.com/mbedmicro/mbed/blob/ ... anager.cpp


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++. Передача вызова прерывания в объект.
СообщениеДобавлено: 09 янв 2015, 05:49 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2618
Откуда: Санкт-Петербург
Глобальные статические _указатели_ на объекты, всего делов.

Ну а дальше можно совершенствовать в духе c++ - наследовать классы-обработчики от единого абстрактного класса с виртуальным методом-обработчиком ("наследование от интерфейса"), или завести делегаты (делегат в c++ - пара из конкретного объекта и его метода, актуально, если объект может обрабатывать несколько прерываний; конкретные реализации гуглятся по словам fast c++ delegate или просто берётся std::function, но вам, наверное, такие навороты пока не нужны)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB