如何在C++中生成编译时的中断处理程序数组?

Eri*_*ric 5 c++

我希望能够在一个地方写我的ISR:

some_collection TimerHandlers;    

// added to ISR table in linker script
void rawTimerIRQHandler() {
    call_each_handler_in(handlers);
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以在其他文件中注册处理程序了

// file1.cpp
void ledTimerHandler1() {

}
register(ledTimerHandler1); //or in an init function if not possible here
Run Code Online (Sandbox Code Playgroud)
// file2.cpp
void ledTimerHandler2() {

}
register(ledTimerHandler2); //or in an init function if not possible here
Run Code Online (Sandbox Code Playgroud)

而当硬件跳转到rawTimerIRQHandler,它执行ledTimerHandler1以及ledTimerHandler2在一些任意顺序.


显然,我可以使用类似于a的东西来实现它vector<void(*)()>,但由于这些处理程序的数量在编译时是已知的,有没有什么方法可以在编译时生成数组(或模板链表)?我想避免随附的动态内存分配vector.

我愿意使用template<>,#define甚至是GCC特定的属性来实现这一目标.

jth*_*ill 4

脚手架有点乏味,但一旦完成,用法就再简单不过了:

// example.h:
#include "Registered.h"
struct example : Registered<example> {};
Run Code Online (Sandbox Code Playgroud)
// main.cc:
#include <iostream>
#include "example.h"

int main ()
{
    for ( auto p = example::registry; p; p=p->chain )
        std::cout << p << '\n';
}
Run Code Online (Sandbox Code Playgroud)
// Registered.h : 
template<class registered>
struct Registered {
     static registered *registry;
     registered *chain;
     Registered() : chain(registry) {registry=static_cast<registered*>(this);}
};
Run Code Online (Sandbox Code Playgroud)
// example.cc:
#include "example.h"
template<> example *Registered<example>::registry = 0;

static struct example first, second, third;  // these can be defined anywhere w/ static duration
Run Code Online (Sandbox Code Playgroud)

编辑:移动first,second,third声明/定义以满足我内心的学究