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

 
 
 
Reply to this topicStart new topic
> С++, указатель на метод класса
Troll
сообщение Jul 21 2008, 11:41
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 104
Регистрация: 30-06-05
Из: С-Петербург
Пользователь №: 6 406



Добрый день.

Решил описать периферию контроллера ARM при помощи классов.

Есть желание включить в качестве метода класса функцию обработки прерывания.

Создать указатель на метод класса не проблема:
void (cPIT::*pm) (void);
pm = &cPIT::int_handler;

А вот указать этот адрес в качестве обработчика события уже проблема:
AIC->AIC_SVR[AT91C_ID_SYS] = ??? smile3046.gif

Как можно указать обработчику прерывания адрес метода класса???

Спасибо.


--------------------
Hemos Pasado
Go to the top of the page
 
+Quote Post
fantex
сообщение Jul 21 2008, 12:00
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 54
Регистрация: 4-11-05
Пользователь №: 10 480



Здраствуйте!!!
Отвечаю на Ваш вопрос - никак.
Обработчик прерывания должен быть типа static.
Но можно организовать статическую функцию класса, указать её в качестве обработчика прерывания и из неё уже вызывать метод класса.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 21 2008, 13:06
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Troll @ Jul 21 2008, 14:41) *
AIC->AIC_SVR[AT91C_ID_SYS] = ???

Как можно указать обработчику прерывания адрес метода класса???

(unsigned)pm;

только вот работать вероятно не будет, т.к. разные соглашения вызова.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 21 2008, 18:34
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Тут неплохо расписано, почему это не покатит : http://www.rsdn.ru/article/cpp/fastdelegate.xml
Go to the top of the page
 
+Quote Post
Troll
сообщение Jul 22 2008, 03:15
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 104
Регистрация: 30-06-05
Из: С-Петербург
Пользователь №: 6 406



Цитата(fantex @ Jul 21 2008, 15:00) *
Обработчик прерывания должен быть типа static.
Но можно организовать статическую функцию класса, указать её в качестве обработчика прерывания и из неё уже вызывать метод класса.


Если объявить метод статическим, то он по сути становится обычной функцией и его можно указать как обработчик прерывания. smile.gif

Объясните пожалуйста следующее:
- Если метод статический (то есть одна функция на все экземпляры класса), как определяется метод какого экземпляра класса будет вызываться в обработчике прерывания. Вызов нужного метода происходит автоматически, или необходимо вводить какие-либо дополнительные флаги.

PS: В данный момент не могу проверить на практике, поэтому и задаю этот вопрос.

Спасибо.


--------------------
Hemos Pasado
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Jul 22 2008, 03:22
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(Troll @ Jul 22 2008, 09:15) *
PS: В данный момент не могу проверить на практике, поэтому и задаю этот вопрос.


В свое время кидал пример в каком-то из обсуждений. Вот посмотрите, как сделано у меня:
[attachment=15014:attachment]

смотрите файлы async_cpp


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
fantex
сообщение Jul 22 2008, 04:26
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 54
Регистрация: 4-11-05
Пользователь №: 10 480



Цитата(Troll @ Jul 22 2008, 07:15) *
Объясните пожалуйста следующее:
- Если метод статический (то есть одна функция на все экземпляры класса), как определяется метод какого экземпляра класса будет вызываться в обработчике прерывания. Вызов нужного метода происходит автоматически, или необходимо вводить какие-либо дополнительные флаги.

PS: В данный момент не могу проверить на практике, поэтому и задаю этот вопрос.

Спасибо.


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

object->IntHandler();
Go to the top of the page
 
+Quote Post

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

 


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


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