таблица векторов прерываний c ++ 14 с помощью шаблонов - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь создать таблицу прерываний для STM32 с c ++ 14.Настройка этой таблицы с атрибутом section и соответствующим сценарием ld работает нормально:

[[gnu::section(".interrupt_vector_table")]]
static const InterruptHandle interrupts[66] = {
  nullptr,
  ResetHandler,
  nullptr,
  ...
};

Также я реализовал некоторую переносимость с помощью таких шаблонов, как:

enum MCU {F103x6, F103x8, ...};

template<MCU T> class stm;
template<> class stm<F103x8> {
  void set_pin(...);
  ...
};

Что яхочу сделать таблицу прерываний более гибкой (разрешить определять только используемые прерывания и оставить другие по умолчанию) и переместить ее в класс stm, чтобы можно было использовать его следующим образом:

stm<F103x8, interrupt<TIM2_IRQ, my_handler>> cpu;

int main() {
  cpu.init_clock();
  ...;
}

Но я не могунайти клей, как заставить его работать - я не могу определить статический член класса и инициализировать его массивом - много разных вариантов кода, таких как следующий, дает мне constexpr needed for in-class initialization of static data member:

template <MCU T> class stm {
  [[gnu::section(".vector_table")]]
  static const uint32_t interrupts[Interrupts<T>::size] = InterruptsTable<T>::value;
};

Заранее спасибо за любые предложения.

UPD Я хочу реализовать библиотеку только для заголовков, если это возможно ..

...