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

 
 
> call back, обменяемся мнениями
HEX
сообщение Oct 25 2007, 10:25
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 54
Регистрация: 25-11-04
Из: Тула
Пользователь №: 1 228



Как известно в С++ можно получить адрес функции члена только конкретного класса, что не затрудняет реализовать обмен событиями между объектами через callback. Обсуждений этой темы было уже много, повторяться не буду:
http://www.rsdn.ru/article/cpp/fastdelegate.xml
http://forum.developing.ru/showthread.php?p=12952#post12952
http://alenacpp.blogspot.com/
http://www.newty.de/fpt/index.html
http://dobrokot.nm.ru/cpp/CppMethodsCallback.html

Из специфики встраиваемых вытикают следующие ограничения: мин. потребление памяти, минимальное время вызова, использование кучи не жалательно, переносимость.
Я лично остановился на варианте интерфейсов, плюсы и минусы:
+ прозрачная реализация в стиле ООП
+ для вызова храним только один указатель, для 32бит проц. соответственно 4 байта
+ не использем кучу
+ можно объеденить однотипные события в один интерфейс (экономим память)
- нужна потдержка множественного наследования в компиляторе
- дополнительные расходы на размер кода при множественном наследовании (но вполне допустимые)
- для каждого типа/группы событий приходиться описывать класс интерфейса
- обработка событий от разных объектов и классов получается в одном методе, приходиться использовать switch (если это кретично, то можно обрабатывать события во вложенном классе слушателе который объявлен как друг)

Выглядет это примерно так:
//Интерфейс события мыши
class IMouseEvent {
private:
protected:
public:
virtual void OnMouseDown(void);
virtual void OnMouseUp(void);
virtual void OnClick(void);
};

//Интерфейс события клавиатуры
class IKeyEvent {
private:
protected:
public:
virtual void OnKeyDown(void);
virtual void OnKeyUp(void);
virtual void OnKeyPress(void);
};

//Базовый класс
class TControl {
private:
protected:
public:
IMouseEvent* OnMouseEvent;
IKeyEvent* OnKeyEvent;
};

//Окно
class TWindow: public TControl {
private:
protected:
public:
};

//Конкретное окно, добавлены инетерфейсы для обработки события
class TConcreteWindow: public IMouseEvent, public IKeyEvent, public TForm{
private:
protected:
public:
void OnClick(void);
virtual void OnKeyPress(void);
};
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Shkn
сообщение Oct 26 2007, 06:14
Сообщение #2


Участник
*

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



Цитата(HEX @ Oct 25 2007, 14:25) *
Как известно в С++ можно получить адрес функции члена только конкретного класса, что не затрудняет реализовать обмен событиями между объектами через callback.


Захотел сделать работу с периферией посредством классов. Но возникло два вопроса: как написать один код для каждого типа периферии, но чтоб он работал независимо от ее количества (к примеру UART0, UART1..) и как потом прерывания обрабатывать. Ответ был найден в параметризации шаблона класса базовым адресом в памяти. что-то вроде template<unsigned Adr> class CUart {..}; Соответственно в нем уже работать только по смещению.

Но тут возник интересный ньюанс: а как делать обработчик прерывания? Ведь его адрес надо записать в контроллер? Сделал так: все наследуются от одного базового сласса с виртуальной функцией Isr. В конструкторе все экземпляры регистрируются в глобальном массиве. Для каждого класса (читай номера устройства) делается статическая функция, которая и регистрируется в контроллере прерываний. А уже она по своему вызову выбирает из массива адрес соответствующего ей экзепляра и дергает его Isr.

Так к чему все это? Казалось бы работает, и не надо трогать.. Но нет! Ведь можно же еще уменьшить текст кода! А именно: сделать эту статическую функцию параметризируемой номером периферии и записать всего один раз template<unsigned N> void IsrExe(){ Array[N]->Isr();} Так вот мой Keil Arm не хочет адрес так описанной функции помещать в котроллер, а под MS VC проверяю - все в порядке.

Так что речь, пока, к сожалению, можно вести не о том, как хотелось бы, а о том, что позволяет выбранный инструментарий..
Go to the top of the page
 
+Quote Post
Alex03
сообщение Oct 26 2007, 07:37
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(Shkn @ Oct 26 2007, 12:14) *
template<unsigned Adr> class CUart {..};

Или я чёта не понимаю или это оверхед по коду экономящий по одному слову RAM-a на экземпляр...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- HEX   call back   Oct 25 2007, 10:25
- - DASM   Замечательно. Я так понял вопроса в посте не содер...   Oct 25 2007, 12:55
|- - HEX   ну да это не вопрос, я предлагую обсудить возможны...   Oct 25 2007, 13:16
|- - Tahoe   Цитата(HEX @ Oct 25 2007, 17:16) ну да эт...   Oct 25 2007, 14:55
|- - defunct   Дурное дело нехитрое - вызвать функцию по указател...   Oct 25 2007, 15:17
- - alexander55   Цитата(HEX @ Oct 25 2007, 14:25) class TC...   Oct 26 2007, 05:07
|- - alexander55   Цитата(Shkn @ Oct 26 2007, 10:14) Захотел...   Oct 26 2007, 06:26
||- - grau   Цитата(Alex03 @ Oct 26 2007, 11:37) Или я...   Oct 26 2007, 09:12
|- - SpiritDance   Цитата(Shkn @ Oct 26 2007, 09:14) Захотел...   Feb 19 2008, 11:04
|- - grau   Цитата(SpiritDance @ Feb 19 2008, 14:04) ...   Feb 20 2008, 06:17
- - Alex03   Вот я и не понимаю зачем для 3-х одинаковых UART-о...   Oct 29 2007, 08:10
|- - grau   Цитата(Alex03 @ Oct 29 2007, 12:10) Вот я...   Oct 29 2007, 08:28
|- - Alex03   Цитата(grau @ Oct 29 2007, 13:28) А какая...   Oct 29 2007, 09:25
- - scout   Читал архивы и наткнулся... Стало интересно, прочи...   Nov 30 2007, 10:48
- - landrey   Цитата(scout @ Nov 30 2007, 13:48) Читал ...   Feb 17 2008, 13:09
- - grau   Цитата(scout @ Nov 30 2007, 13:48) Читал ...   Feb 18 2008, 08:54
- - landrey   Цитата(grau @ Feb 18 2008, 11:54) Для нач...   Feb 23 2008, 12:45


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

 


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


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