gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:30:22 24 4
gpt4 key购买 nike

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

some_collection TimerHandlers;    

// added to ISR table in linker script
void rawTimerIRQHandler() {
call_each_handler_in(handlers);
}

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

// file1.cpp
void ledTimerHandler1() {

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

}
register(ledTimerHandler2); //or in an init function if not possible here

当硬件跳转到rawTimerIRQHandler时, 它执行 ledTimerHandler1ledTimerHandler2以某种任意顺序。


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

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

最佳答案

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

// example.h:
#include "Registered.h"
struct example : Registered<example> {};
// main.cc:
#include <iostream>
#include "example.h"

int main ()
{
for ( auto p = example::registry; p; p=p->chain )
std::cout << p << '\n';
}
// Registered.h : 
template<class registered>
struct Registered {
static registered *registry;
registered *chain;
Registered() : chain(registry) {registry=static_cast<registered*>(this);}
};
// 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

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

关于c++ - 如何在 C++ 中生成中断处理程序的编译时数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15142266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com