// --------------------------------------------------------------------------
//Определим интерфейс:
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);
// ...
}
После таких мероприятий реализации можно менять "как перчатки".
-
- Предположим я сделал объект-comm port. Tyмблep(300 знак., 06.08.2022 00:42)