-1

私は、設計グループのハードウェアと直接やり取りするいくつかのルーチンを作成しています。このシナリオをできるだけ簡潔に説明しようと思います。

私たちのハードウェアは、私が説明しているファームウェアを実行する組み込み CPU に対してさまざまな種類の割り込みを生成します。デバッグ計画の性質上、処理される割り込みの数を制限したい場合があります。この割り込み制限は、外部レジスタ インターフェイスを介して実行中のファームウェアに渡されます。

それで!と の 2 つの機能がinthandler()ありlimit_interrupts()ます。それらは基本的に次のようになります。

ファイル interrupt_handler.cpp:

void inthandler(){
    if (num_ints_serviced < int_limit)
    { 
        ...handle interrupt...
        num_ints_serviced++;
    }
}

ファイル external_command_handler.cpp:

void limit_interrupts(){
    int_limit = <read int limit from external register>;
}

現在、私はグローバル変数として宣言していますint_limitnum_ints_servicedこれにグローバルを使用しないようにする方法があるかどうか知りたいです。

私はこれを行う方法について漠然とした考えを持っています:

  • 呼び出されるnum_ints_servicedたびにその値がリセットされないように、静的 int として宣言します。inthandler()(ただし、これにより別の問題が発生します。これは、テストのある時点で、そのカウンターを 0 にリセットしたいからです。現在reset_in_counter()、グローバルを変更する別の関数を呼び出すだけです。)
  • 何らかの方法でスコープをいじって、int_limitinterrupt_handler.cpp 内でローカルに宣言できるようにしますが、external_command_handler.cpp から変更します。多分名前空間を使用していますか?詳細はわかりません。

グローバルの使用を避けるべきであるというベスト プラクティスがあることは知っていますが、いくつかの用途があります。これはそれらの用途の 1 つにすぎないのでしょうか。おそらく、この問題を難しくしすぎているのかもしれません (結局のところ、この場合はグローバルの使用が有効です)。

アドバイスをよろしくお願いします。

4

2 に答える 2

1

多くの人は私に同意しないでしょうが、これが私の見解です。

表現しているものが実際にグローバルである場合は、プログラムでグローバルとして表現する必要があります。

  • この情報は、CPU のプロパティを表します
  • あなたは1つしか持っていません(CPU)
  • 再設計 (したがって、コードのリファクタリング) を行わなければ、複数あることはまずありません。
  • 複数の CPU 構成を処理できるようにプログラムを柔軟にすることによって得られるものはほとんどありません。遅くなり、大きくなり、エラーが発生しやすくなり、デバッグが難しくなります。

私の仮定の1つが間違っていない限り、それは合法的にグローバルです。

于 2013-09-19T20:12:45.713 に答える
1
void inthandler() {
    static int limit = limit_interrupts();
    static int n = 0;
    if (n++ < limit) {
        // do something
    }
}

しかし、おそらく n をリセットする何らかの方法が必要ですが、これは提供されません。また、メソッドが最初に呼び出されたときに一度だけ制限を設定することもできます。

于 2013-09-19T20:01:54.877 に答える