0

ブートローダー コードにあるベクトル テーブル (割り込みテーブル) に問題があり、アプリケーション コードからアクセスできませんでした。主な問題は、ISR のアドレスがブートローダーとアプリケーション コードで異なることです。そのため、アプリケーションが起動しません。アプリケーション コードを作成して、Vector テーブルから正しい ISR ルーチン アドレスを見つける方法について何か提案はありますか??

HCS08とコードウォリアーを使用しています。プログラマーが FLASH にロードし、さらに USB 経由で S19 ファイルをロードする USB ブートローダです。つまり、私の FLASH には 2 つのプログラムが横たわっています。

4

3 に答える 3

1

HCS08 はベクター リダイレクションをサポートしていますが、複数のベクター テーブルはサポートしていません (私の回答の最後にある引用を参照してください)。 このスレッドは興味深い議論を提供します。私が読んだところによると、HCS08 の FLASH で複数のベクター テーブルを使用する簡単な方法はありません。これにより、いくつかのオプションのみが残ります。

  1. RAM ベクター テーブル
  2. ブートローダーに割り込みはありません
  3. ベクターを保護されていないフラッシュに再配置し、ブートとアプリの両方でそのテーブルを使用する

RAM ベクター テーブル

割り込みベクトルに RAM 内のアドレスを強制的に検索させることができます。これを行うには、プライマリ ベクター テーブルの場所を使用します。各ベクトルは、RAM アドレスにジャンプする関数に設定されます。RAM アドレスは、割り込みコードの場所になります。

この戦略では、アプリケーションとブートローダー コードで異なる割り込み関数を指定できます。ベクターに RAM を使用するのは危険です。

ブートローダでの割り込みなし

別のオプションは、割り込みなしでブートローダーを実装することです。次に、ブートローダ メモリを保護し、ベクトルの場所をリダイレクトして、アプリケーション プログラムにベクトル テーブルを設定することができます。

ベクトルを保護されていないフラッシュに再配置する

この手法の説明については、AN2140を参照してください。

以下は、MC9S08EL/SLのデータシートからのものです。

4.5.8 ベクターリダイレクト

いずれかの FLASH がブロック保護されている場合は常に、リセットおよび割り込みベクトルが保護されます。ベクター リダイレクションを使用すると、ユーザーは、ブートローダーおよびリセット ベクター空間の保護を解除することなく、割り込みベクター情報を変更できます。ベクタ リダイレクションは、アドレス 0xFFBF にある NVOPT レジスタの FNORED ビットを 0 にプログラムすることで有効になります。リダイレクションを行うには、アドレス 0xFFBD にある NVPROT レジスタをプログラムして、フラッシュ メモリの少なくとも一部をブロック保護する必要があります。すべての割り込みベクトル (メモリ ロケーション 0xFFC0 ~ 0xFFFD) はリダイレクトされますが、リセット ベクトル (0xFFFE:0xFFFF) はリダイレクトされません。

たとえば、1024 バイトの FLASH が保護されている場合、保護されているアドレス領域は 0xFC00 から 0xFFFF までです。割り込みベクタ (0xFFC0–0xFFFD) は、ロケーション 0xFBC0–0xFBFD にリダイレクトされます。ベクター リダイレクションが有効で、割り込みが発生した場合、場所 0xFFE0:0xFFE1 の値の代わりに、場所 0xFBE0:0xFBE1 の値がベクターに使用されます。これにより、ユーザーは、デフォルトのベクトル位置を含む保護領域を変更せずに、新しい割り込みベクトル値を含む新しいプログラム コードで FLASH の保護されていない部分を再プログラムできます。

このマイクロ ファミリ用のシリアル ブートローダの実装については、このアプリケーション ノート (AN2295)も参照してください。

于 2010-11-20T19:36:05.913 に答える
0

私はHCS08の専門家ではありませんが、多くの場合、ブートローダーを邪魔することなくソフトウェアをロードして新しい割り込みベクターを使用できるように、ベクターを再マップまたはリダイレクトするメカニズムがあります。使用している正確なチップはわかりませんが、チップのリファレンスマニュアルで「VectorRedirection」を検索してみてください。

于 2010-11-20T19:01:19.653 に答える
0

私はここで正しいと思われるものを見つけましたが、機能していません:

** *ブートローダー Vector.c:** * ** * *

ISR(AS1_InterruptTx) { asm { pshh ldhx #$DFD4 pshx jmp DO_ISR } } .......アドレスが異なる他のベクトルについても同様............

................................................................... ...............

void DO_ISR() { asm { pulx ldhx ,x
cphx #$FFFF
beq DI1
jsr ,x

DI1:プルティ } }

** * ** * ** * ***アプリケーション内 Vector.c * ** * ** * ** * ** * ** * **

私が変更され:

ISR(AS1_InterruptTx)

{

…………

…………

}

に:

ボイド AS1_InterruptTx() {

..........

..........

}


それとは別に、ベクターをブートローダーのデフォルトの場所、つまり 0xFFC4 に保持し、アプリケーション コードのベクター テーブルを 0xDFC4 にリダイレクトしました。

NVPROT_INIT の値は 0xDE であり、NVOPT_INIT の値は 0x7E です。これはアプリケーション コード (リダイレクト用の NVOPT = 0x3E) と競合しますが、保護されているため、このレジスタに上書きすることはできません。ただし、割り込みが発生すると、割り込みは 0xFFC4 にあるベクター テーブルに送られ、さらに 0xDFC4 に送信されます。

これは、この問題に対処する良い方法だと思われますか?

于 2010-11-22T20:04:57.473 に答える