ВходНаше всё Теги codebook PARTS Поиск Опросы Закон Пятница
19 августа
1229682 Топик полностью
Tyмблep (06.08.2022 00:27, просмотров: 110) ответил Tyмблep на Предположим, решаем важный вопрос - делаем логгер.
Однажды возник вопрос - как обрабатывать прерывания в классе. Конечно же так: 

// --------------------------------------------------------------------------

//Определим интерфейс:

class I_interrupt

{

public:

virtual void work (int intNum)=0;

};

// --------------------------------------------------------------------------

// определим указатель на интерфейс

I_interrupt* pInt=NULL;

// --------------------------------------------------------------------------

// установим адрес интерфейса:

void Set_I_interrupt(I_interrupt* p)

{

pInt = p;

}

// --------------------------------------------------------------------------

//Далее короткие функции прерываний в стиле С:

// не знаю, как для ARDUINO. Пусть для определённости будет так:

interrupt [TIMER1_COMPB_vect] void t1_compb (void)

{

if(pInt) pInt->work(TIMER1_COMPB_vect);

}

// --------------------------------------------------------------------------

interrupt [TIMER1_COMPA_vect] void t1_compa (void)

{

if(pInt) pInt->work(TIMER1_COMPA_vect);

}

// --------------------------------------------------------------------------

//Пишем реализацию интерфейса для конкретного проекта:

class IntProject : virtual public I_interrupt

{

public:

virtual void work (int intNum);

virtual void routine_TIMER1_COMPB_vect();

virtual void routine_TIMER1_COMPA_vect();

};

// --------------------------------------------------------------------------

void IntProject::work (int intNum)

{

// тут возможно что-то общее для всех, если нужно

switch(intNum)

{

case TIMER1_COMPB_vect: routine_TIMER1_COMPB_vect(); break;

case TIMER1_COMPA_vect: routine_TIMER1_COMPA_vect(); break;

}

// тут возможно что-то общее для всех, если нужно

}

// --------------------------------------------------------------------------

void IntProject::routine_TIMER1_COMPB_vect()

{

// ...

}

// --------------------------------------------------------------------------

void IntProject::routine_TIMER1_COMPA_vect()

{

// ...

}

// --------------------------------------------------------------------------

// В результате работаем с прерываниями используя классы.

// Возможны варианты.

// используем:

void main (void)

{

// ...

IntProject intObject; Set_I_interrupt(&intObject);

// ...

}



После таких мероприятий реализации можно менять "как перчатки".