質問
誰かがジャンプ テーブルの仕組みと、組み込みシステムでジャンプ テーブルが必要になる理由を説明できますか?
解決
ジャンプ テーブルは、関数へのポインターの配列またはマシン コードのジャンプ命令の配列のいずれかになります。比較的静的な関数のセット (システム コールやクラスの仮想関数など) がある場合は、このテーブルを一度作成し、配列への単純なインデックスを使用して関数を呼び出すことができます。これは、使用されるテーブルのタイプに応じて、ポインターを取得して関数を呼び出すか、マシンコードにジャンプすることを意味します。
組み込みプログラミングでこれを行うことの利点は次のとおりです。
- インデックスはマシン コードやポインターよりもメモリ効率が高いため、制約のある環境ではメモリを節約できる可能性があります。
- 特定の関数については、インデックスは安定したままであり、関数を変更するには関数ポインタを交換するだけで済みます。
テーブルにアクセスするためにパフォーマンスがわずかに低下しますが、これは他の仮想関数呼び出しよりも悪くありません。
他のヒント
分岐テーブルとも呼ばれるジャンプ テーブルは一連の命令であり、すべてコード内の別のポイントに無条件に分岐します。
これらは、すべてのケースが満たされた switch (または select) ステートメントと考えることができます。
MyJump(int c)
{
switch(state)
{
case 0:
goto func0label;
case 1:
goto func1label;
case 2:
goto func2label;
}
}
リターンがないことに注意してください。ジャンプ先のコードがリターンを実行し、myjump が呼び出された場所にジャンプして戻ります。
これは、状態変数に基づいて特定のコードを実行するステート マシンに役立ちます。他にもたくさんの用途がありますが、主な用途の 1 つがこれです。
スタックをいじるのに時間を無駄にしたくない、コードスペースを節約したい場合に使用されます。これは、速度が非常に重要であり、割り込みを引き起こしたペリフェラルが単一の変数によってのみ認識される割り込みハンドラーで特に役立ちます。これは、割り込みコントローラを備えたプロセッサのベクタ テーブルに似ています。
1 つの用途は、0.60 ドルのマイクロコントローラーを使用して、ビデオ アプリケーション用のコンポジット (TV) 信号を生成することです。マイクロは強力ではありません。実際、各走査線を書き込むのに十分な速さしかありません。メモリからビットマップをロードし、for() ループを使用してビットマップを追い出すには時間がかかりすぎるため、文字の描画にはジャンプ テーブルが使用されます。代わりに、文字とスキャン ラインへの個別のジャンプがあり、その後、実際にデータをポートに直接書き込む 8 つほどの命令があります。
-アダム
ジャンプテーブルについて説明します ここ, しかし簡単に言えば、これは CPU が特定の条件に基づいてジャンプする必要があるアドレスの配列です。例として、C switch ステートメントは、各ジャンプ エントリが特定の「case」ラベルに移動するジャンプ テーブルとして実装されることがよくあります。
メモリ使用量が非常に重要な組み込みシステムでは、多くの構造は、メモリを大量に使用するメソッド (大規模な if-else-if など) の代わりにジャンプ テーブルを使用する方が適切に処理されます。
ウィキペディア かなりうまくまとめています:
コンピュータープログラミングでは、ブランチテーブル(ジャンプテーブルと呼ばれることもあります)は、プログラム制御(分岐)をプログラムの別の部分に転送する効率的な方法(または動的にロードされた可能性のあるプログラム)を使用して使用される用語です。枝の指示の表。ブランチテーブル構造は、アセンブリ言語でプログラミングするときに一般的に使用されますが、コンパイラによって生成される場合もあります。
...ブランチテーブルやその他の生データエンコードの使用は、メモリが高価なときのコンピューティングの初期には一般的でした。CPUはより遅く、コンパクトなデータ表現であり、代替の効率的な選択が重要でした。現在、それらは埋め込まれたプログラミングおよびオペレーティングシステムの開発で一般的に使用されています。
言い換えれば、これは、組み込みプラットフォームでよくあることのように、システムのメモリや CPU が極度に制限されている場合に使用すると便利な構造です。
コンピュータープログラミングでは、ブランチテーブル(ジャンプテーブルと呼ばれることもあります)は、プログラム制御(分岐)をプログラムの別の部分に転送する効率的な方法(または動的にロードされた可能性のあるプログラム)を使用して使用される用語です。枝の指示の表。ブランチテーブル構造は、アセンブリ言語でプログラミングするときに一般的に使用されますが、コンパイラによって生成される場合もあります。
ブランチテーブルは、命令長(各ブランチ命令で占有されているメモリのバイト数)を乗算することによって作成されたオフセットを使用して分岐する無条件のブランチ命令のシリアルリストで構成されています。分岐のマシンコード命令は固定された長さであり、ほとんどのハードウェアで非常に効率的に実行できるという事実を利用しており、シーケンシャルインデックス値に簡単に変換できる生データ値を扱う場合に最も役立ちます。そのようなデータを考えると、ブランチテーブルは非常に効率的です。通常、次の手順で構成されています。オプションで入力データを検証して、受け入れられるようにします。データをオフセットに分岐テーブルに変換すると、これには通常、命令の長さを考慮に入れるようにそれを乗算またはシフトすることが含まれます。テーブルのベースと生成されたオフセットで構成される住所に分岐します。これには、多くの場合、プログラムカウンターレジスタにオフセットを追加することが含まれます。
ジャンプ テーブル (ブランチ テーブルとして知られることの方が多い) は、通常、マシンによってのみ使用されます。
コンパイラは、アセンブリ プログラム内のすべてのラベルのリストを作成し、すべてのラベルをメモリの場所にリンクします。ジャンプ テーブルは、関数や変数、あるいはラベルが何であれ、メモリ内のどこに格納されているかを示す参照カードです。
したがって、関数が実行されると、終了時に前のメモリ位置に戻るか、次の関数にジャンプします。
そして、私があなた自身について話しているのであれば、それらは組み込みシステムだけでなく、あらゆるタイプのコンパイル/インタープリタ環境でも必要です。
ブライアン・ジャンフォルカロ
ジャンプ テーブルは一般的に (ただし排他的ではありません) で使用されます。 有限状態マシン データドリブンにするためです。
ネストされたスイッチ/ケースの代わりに
switch (state)
case A:
switch (event):
case e1: ....
case e2: ....
case B:
switch (event):
case e3: ....
case e1: ....
2次元配列または関数ポインタを作成して呼び出すだけです handleEvent[state][event]