54

誰かがジャンプテーブルの仕組みを説明できますか、そしてなぜ組み込みシステムで必要になるのでしょうか?

4

7 に答える 7

56

ジャンプテーブルは、関数へのポインタの配列またはマシンコードのジャンプ命令の配列のいずれかです。比較的静的な関数のセット(システムコールやクラスの仮想関数など)がある場合は、このテーブルを1回作成し、配列への単純なインデックスを使用して関数を呼び出すことができます。これは、使用されるテーブルのタイプに応じて、ポインタを取得して関数を呼び出すか、マシンコードにジャンプすることを意味します。

組み込みプログラミングでこれを行う利点は次のとおりです。

  1. インデックスはマシンコードやポインタよりもメモリ効率が高いため、制約のある環境ではメモリを節約できる可能性があります。
  2. 特定の関数の場合、インデックスは安定したままであり、関数を変更するには、関数ポインターを交換するだけです。

テーブルにアクセスするためのパフォーマンスが少し低下する場合でも、これは他の仮想関数呼び出しよりも悪くはありません。

于 2008-09-07T01:54:54.547 に答える
25

ジャンプテーブルは、分岐テーブルとも呼ばれ、一連の命令であり、すべて無条件にコード内の別のポイントに分岐します。

それらは、すべてのケースが満たされるスイッチ(または選択)ステートメントと考えることができます。

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つほどの命令があります。

-アダム

于 2008-09-07T01:57:57.490 に答える
2

ウィキペディアから

コンピュータプログラミングでは、分岐テーブル(ジャンプテーブルとも呼ばれます)は、プログラム制御(分岐)をプログラムの別の部分(または動的にロードされた可能性のある別のプログラム)に転送する効率的な方法を説明するために使用される用語です。分岐命令の表。ブランチテーブルの構築は、アセンブリ言語でプログラミングするときに一般的に使用されますが、コンパイラによって生成される場合もあります。

分岐テーブルは、無条件分岐命令のシリアルリストで構成され、シーケンシャルインデックスに命令長(各分岐命令が占めるメモリ内のバイト数)を掛けて作成されたオフセットを使用して分岐します。分岐用のマシンコード命令は固定長であり、ほとんどのハードウェアで非常に効率的に実行できるという事実を利用しており、シーケンシャルインデックス値に簡単に変換できる生データ値を処理する場合に最も役立ちます。このようなデータがあれば、ブランチテーブルは非常に効率的です。通常、次の手順で構成されます。オプションで、入力データを検証して、受け入れ可能であることを確認します。データをブランチテーブルへのオフセットに変換し、これには通常、命令の長さを考慮して乗算またはシフトすることが含まれます。テーブルのベースと生成されたオフセットで構成されるアドレスに分岐します。これには、多くの場合、プログラムカウンタレジスタへのオフセットの追加が含まれます。

于 2008-09-07T01:47:53.113 に答える
2

ジャンプ テーブルは、有限ステート マシンでデータ駆動型にするために一般的に (排他的ではありませんが) 使用されます。

ネストされたスイッチ/ケースの代わりに

  switch (state)
     case A:
       switch (event):
         case e1: ....
         case e2: ....
     case B:
       switch (event):
         case e3: ....
         case e1: ....

2次元配列または関数ポインターを作成して呼び出すことができますhandleEvent[state][event]

于 2015-03-16T14:28:56.617 に答える
1

ここではジャンプテーブルについて説明しますが、簡単に言うと、特定の条件に基づいてCPUがジャンプする必要があるアドレスの配列です。例として、Cスイッチステートメントは、各ジャンプエントリが特定の「ケース」ラベルに移動するジャンプテーブルとして実装されることがよくあります。

メモリ使用量が非常に重要な組み込みシステムでは、メモリを大量に消費する方法(大規模なif-else-ifなど)ではなく、ジャンプテーブルを使用することで、多くの構成がより適切に処理されます。

于 2008-09-07T01:48:59.757 に答える
1

ウィキペディアはそれをかなりうまくまとめています:

コンピュータプログラミングでは、分岐テーブル(ジャンプテーブルとも呼ばれます)は、プログラム制御(分岐)をプログラムの別の部分(または動的にロードされた可能性のある別のプログラム)に転送する効率的な方法を説明するために使用される用語です。分岐命令の表。ブランチテーブルの構築は、アセンブリ言語でプログラミングするときに一般的に使用されますが、コンパイラによって生成される場合もあります。

...メモリが高価で、CPUが低速でコンパクトなデータ表現であり、代替案を効率的に選択することが重要だったコンピューティングの初期には、ブランチテーブルやその他の生データエンコーディングの使用が一般的でした。現在、これらは組み込みプログラミングやオペレーティングシステムの開発で一般的に使用されています。

言い換えると、組み込みプラットフォームでよくあることですが、システムのメモリやCPUが極端に制限されている場合に使用すると便利です。

于 2008-09-07T01:52:13.150 に答える
0

ジャンプテーブルは、多くの場合、ブランチテーブルと呼ばれ、通常はマシンによってのみ使用されます。

コンパイラは、アセンブリプログラム内のすべてのラベルのリストを作成し、すべてのラベルをメモリ位置にリンクします。ジャンプテーブルは、ほとんどの場合、関数や変数、またはラベルがメモリに保存されている場所への参照カードです。

したがって、関数が実行されると、終了時に前のメモリ位置にジャンプしたり、次の関数にジャンプしたりします。

そして、私があなたが何であるかについて話すなら、あなたはそれらを組み込みシステムだけでなく、あらゆるタイプのコンパイルされた/解釈された環境で必要とします。

ブライアン・ジャンフォルカロ

于 2008-09-07T01:53:40.057 に答える