Я абстрагирую таблицу векторов прерываний на нескольких микроконтроллерах. Я использую шаблонные классы в форме (InterruptVectorTable.hpp (определение, включенное в реализацию))
template<class Device, class ResultType>
InterruptVectorTable
{
enum class IRQType : ResultType;
}
Device
- это своего рода фиктивный класс, который используется для специализации шаблона.
class DeviceAtMega328p
{
public:
static const int s_NumInterruptVectors = {26};
};
(Здесь я все еще думаю о том, передавать ли 26 в качестве параметра шаблона или в этой форме.)
Поскольку у каждого микроконтроллера есть свои собственные типы и значения прерываний, которые следует проверить во время компиляции (из-за класса enum) я хотел бы также специализировать указанные прерывания c в этой форме (InterruptVectorTable.hpp (Реализация):
template<>
InterruptVectorTable< DeviceAtMega328p, uint8_t>
{
enum class IRQType : ResultType
{
//RESET_IRQn = 0, // Not available.
INT0_IRQn = 1,
INT1_IRQn = 2,
PCINT0_IRQn = 3,
PCINT1_IRQn = 4,
PCINT2_IRQn = 5,
WDT_IRQn = 6,
// .....
};
}
Этот подход, кажется, не работает как ожидается (в настоящее время слишком много ошибок, чтобы указать, который явно указывает на эту часть).