Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Хватаем прерывания в ДОСе / 7 сообщений из 7, страница 1 из 1
18.07.2005, 17:55
    #33172072
matsic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хватаем прерывания в ДОСе
В ДОСе создаем объект, который должен подменить функцию прерывания.
Это класс виртуальный. С него хочу наследовать и создавать другой класс со своей функцией прерывания. Объект класса при создании заменяет указанное в конструкторе прерывание.
Компилятор Borland 5.
Библиотеки все включил в другом файле. Проблема именно в этом коде. Т.е. если без объектов делать, то все работает.
Жаль, что не компилируется(
Как правильно с объектами записать?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
#ifndef INTERRUPT_INCLUDED
#define INTERRUPT_INCLUDED

class Interrupt
{
 	int portID;
   int interruptNo;
   unsigned char maskOpen,oldMask;//Маска разрешения прерываний
   virtual void interrupt handler(...)= 0 ;//Прерывание
   void far interrupt (*oldhandler)(...);//Старое прерывание
 public:
 	Interrupt(unsigned int, unsigned char, int);
   ~Interrupt();
   void Disable(void);
   void Enable(void);
};

Interrupt::Interrupt(unsigned int port, unsigned char mask, int vec_id)
{
 portID=port;
 maskOpen=mask;
 interruptNo=vec_id;
 oldhandler=getvect(vec_id);
 setvect(vec_id,handler);// Здесь то и ошибка!!!
 // Error:  INTERRUPT.CPP(25,25):Type mismatch in parameter '__isr' in call to 'setvect(int,void (far interrupt *)(...))'
 //Error:  INTERRUPT.CPP(25,25):Member function must be called or its address taken
 Enable();//пишем разрешение в вектор прерываний
}

Interrupt::~Interrupt()
{
 setvect(interruptNo,oldhandler);//восстанавливаем функцию прерывания
 Disable();//Оно больше не нужно. Запрещаем. 
}

void Interrupt::Disable(void)
{
 outportb(portID,inportb(portID)|~maskOpen);
}

void Interrupt::Enable(void)
{
 outportb(portID,inportb(portID)&maskOpen);
}

#endif
...
Рейтинг: 0 / 0
18.07.2005, 18:07
    #33172094
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хватаем прерывания в ДОСе
во-первых, ваш пример, судя по всему, не полный
во-вторых, скорее всего вы упускаете из внимания различия между обычным указателем на функции и указателем на метод класса. Нестатические функции методы имеют обязательный параметр - указатель на объект класса (this)
...
Рейтинг: 0 / 0
18.07.2005, 18:15
    #33172118
matsic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хватаем прерывания в ДОСе
Скажите пожалуйста в чем его неполность. Если в заголовочных файлах, то тут беды нет.
Как лучше заменить функцию-член, чтоб не было ошибок? Или это принципиально невозможно, что бы функция-член подменила прерывание?
...
Рейтинг: 0 / 0
18.07.2005, 18:43
    #33172156
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хватаем прерывания в ДОСе
Принципиально возможно, но ... У вас к стати компилятор Borland C++ 5.0 или Borland C++ Builder 5? Ключевое слово __closure есть? А так - почитайте http://www.sql.ru/forum/actualthread.aspx?tid=140106&hl=%f3%ea%e0%e7%e0%f2%e5%eb%fc+%f4%f3%ed%ea%f6%e8%fe
...
Рейтинг: 0 / 0
19.07.2005, 12:42
    #33173203
matsic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хватаем прерывания в ДОСе
Компилятор не Билдер. __closure слова там не встречал.

А функция может быть одновременно virtual и static?
...
Рейтинг: 0 / 0
19.07.2005, 13:48
    #33173463
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хватаем прерывания в ДОСе
Один раз под дос, попросил один борландист до ума довести прерывание...
Так же не хотела логика работать. категорично. При разборках данных завалов отладчиком выяснилось, что борланд по умолчанию сохраняет на стэке регистры, подготавливает среду исполнения и прочее. Т.е. то ли нуна было на уровне флагов (обьявлений) компилятора ему явно задать...то ли фиг его знает. Короче говоря - только проанализировав что получаеться - он начирикал обработчик.

Рекомендую решать задачу следующими шажками.
1) Заменить любой "свободный" вектор прерывания.
2) Позвать данный вектор "ручками". И проверить стэп бай стэп весь обработчик под отладчиком.

1) Кстати говоря, в инициализации вектора не видел аналогичные телодвижения командам типа CLI, STI ? Возможно они внутри "потрохов" setvect(...)
2) Лучше перед вызовом setvect(...) так же делать disable. Это спасёт Вас от многих неприятностей.
3) Думаю не стоит (хотя бы по первости) обьединять виртуал и вектор. Никто Вам не мешает сделать локальным обработчик прерывания и из него позвать перекрытые виртуал методы. Кстати в нём тогда мона инкапсулировать настройки окружения внутри обработчика.
4) Не забывайте о скорости обработки векторов. Особенно если они аппаратные.

удачи Вам
(круглый)
...
Рейтинг: 0 / 0
19.07.2005, 19:57
    #33174604
www.fun4me.narod.ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хватаем прерывания в ДОСе
Сделайте обработчики статическими и вызывайте из них виртуальные методы объектов хранящихся в статических переменных.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Хватаем прерывания в ДОСе / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]