5

ISR を 1 か所に書き込めるようにしたいと思います。

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


明らかに、 a に似たものを使用してこれを実装できvector<void(*)()>ますが、これらのハンドラーの数はコンパイル時にわかっているため、コンパイル時に配列 (またはテンプレート リンク リスト) を生成する方法はありますか? に伴う動的メモリ割り当てを避けたいと思いvectorます。

template<>この目標を達成するために、#define、 、さらには GCC 固有の属性を使用することにオープンです。

4

3 に答える 3

4

足場は少し面倒ですが、一度完了すると、使用法はこれ以上簡単にはなりません:

// 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私の内なる衒学者を満たすために宣言/定義を移動しました

于 2013-02-28T18:30:33.037 に答える
1

絶対に。私の理解が正しければ、ハンドラーへの関数ポインターの固定配列が必要なだけです。C++11 構文を使用し、例のために 3 つのハンドラーを想定すると、

#include <array>

const std::array<HandlerPtr, 3> handlers= {&ledTimerHandler1, &ledTimerHandler2, &ledTimerHandler3};

または、より古典的な C/C++ 構文を使用する

const HandlerPtr handlers[] = {&ledTimerHandler1, &ledTimerHandler2, &ledTimerHandler3};
于 2013-02-28T17:53:53.193 に答える
0

jthillの回答に基づいて、おそらくこれを使用することになります(一般的なフォームは必要ないため)。

struct timer_handler {
    static timer_handler *first = 0;
    timer_handler *next;
    void (*f)();
public:
    timer_handler(void (*f)()) : next(first), f(f) { first = this;}

    // connect this to the interrupt vector
    static inline void executeAll() {
        auto p = first;
        while(p) {
            p->f();
            p = p->next;
        }
    }
};
//a.cpp
void foo() {

}
timer_handler tfoo = foo;
//b.cpp
void bar() {

}
timer_handler tbar = bar;
于 2013-02-28T18:48:17.517 に答える