FX2 / FX2LP SDCC Eclipseプロジェクト:割り込みが処理されない - KBA231372 - Community Translated (JA)

Version 1

    Community Translated by NoTa_4591161 Expert     Version: **

     

    Translation - English: FX2/FX2LP SDCC Eclipse Project: Interrupt not Serviced - KBA231372

     

    質問:
    SDCCベースのFX2 / FX2LP Eclipseプロジェクトの使用中にそれぞれの割り込みがトリガーされたときに、割り込みサービスルーチン(ISR)が実行されないのはなぜでしょうか?

     

    回答:

    SDCCベースのFX2 / FX2LP Eclipseプロジェクトを使用している場合、次の2つの理由により、割り込みがトリガーされた後でもISRが実行されないことがあります。

     

    A. SDCCリンカ:

    SDCCリンカは、アドレス0x0003から始まる割り込みベクターテーブルを配置します。このアドレスが上書きまたは破損した場合、対応するISRへのジャンプは実行されず、割り込みは処理されません。これは避けてください。

     

    xdata変数の不適切な初期化は、割り込みベクターテーブルが上書きされる一般的な理由の1つです。

     

    デフォルトでは、初期化されたxdata変数は8051外部RAM、つまりFX2LPのオンチップRAMの先頭に配置されます(EZ-USBテクニカルリファレンスマニュアルセクション5.3外部プログラムメモリと外部データメモリを参照)。

     

    これにより、内蔵RAMのアドレス0x0003から始まる割り込みベクターテーブルが上書きされる可能性があります。その結果、割り込みベクトルテーブル内のISRへのljmp命令が上書きまたは破損するため、ISRは実行されません。

     

    上書きを回避するには、次のいずれかの方法に従います。

     

    1. xdata変数の絶対アドレス指定:xdata変数は、__ at <address>キーワードを使用して特定のアドレスで初期化できます。コード領域と重複しないように<address>を選択します。

    例:__xdata __at(0x3000)unsigned int testVar;

    これは__xdata変数の初期化ごとに行う必要があります。初期化する変数が多数ある場合、これは面倒な作業になる可能性があります。その場合は、方法2に従ってください。

     

    2. XSEGの配置XSEGはコード領域の後に配置できるため、初期化時にxdata変数がコードと重複しません。

    これは、-xram-loc <value>リンカーコマンドラインオプションを追加することで実行できます。

    ことを注意<> XSEGを配置する必要がありますアドレスです。

    --code-size <limit> MSC51コマンドラインオプションを使用してコードサイズを制限することもできるため、xstackをコード領域の後に重複なしに配置できます。

    <limit> コードサイズの制限であることに注意してください

    リンカは、コードメモリの使用量が指定された制限(<>)内にあるかどうかを確認し、コードサイズの制限を超えると、ROM / EPROM / FLASHメモリが不足していることを示すエラーを生成します

     

    次の手順を実行して、EclipseプロジェクトのSDCCリンカにコマンドラインオプションを追加します。

    1. 対応するEclipseプロジェクトのプロパティに移動します(プロジェクトを右クリックして[ Properties ]をクリックします)。
    2. プロパティウィンドウの左側のペインで、[ C/C++ Build ]セクションから[Settings]を選択します。
    3. [ Tool Settings ]タブで[ SDCCリンカ ]選択します。
    4. コマンドテキストボックスで、sdcc後にコマンドラインオプションを追加します。1参照してください。
    5. [ Apply ]をクリックし、[ OK ]をクリックして変更を適用します。

     

    1. SDCCリンカへのコマンドラインオプションの追加

         

    1では、コードサイズは0x2FFFに制限され、XSEGxdata)はFX2 / FX2LPオンチップRAM0x3000の位置に配置されます。。

     

    B. XPAGEの場所:デフォルトのFX2LP Bulkloop_SDCCプロジェクトでは、XPAGEはデフォルトで0x00A0なりますSDCCユーザーガイド SFRによるセクション4.1.1 pdataアクセスに従って、EZ-USBファミリの場合、プロジェクトのfx2regs.hファイルに次のコード行を追加して、XPAGEをアドレス0x92で定義する必要があります。

    __sfr __at(0x92)_XPAGE;  /* サイプレスEZ-USBファミリ、テキサスインスツルメンツ(チップコン)、別名MPAGE */

     

    リンカコマンドの変更(Aで説明)とXPAGEの場所(Bで説明)を変更してプロジェクトをビルドします。

     

    :それでもISRの問題が発生する場合は、開発者コミュニティUSB Low-Full-High Speed Peripherals下にスレッドを作成してください。

     

    添付のサンプルプロジェクト:

     

    このナレッジベースの記事で入手できるFX2LP SDCC Eclipseプロジェクト(FX2LP_Project_ISR.zip)には、変更点が含まれています。

     

    プロジェクトには、Eclipse IDE上のSDCCによるFX2LP I2Cベースのデバッグ-KBA229648、および外部割り込み0INT0#)と外部割り込み1INT1#)のISRが定義されて使用されるisr.cファイルも含まれます。 ポートBピンを切り替えるには:

     

    • INT0#:このピンのハイからローへのトランザクションは、ポートBピンを1回トグルします。
    • INT1#:このピンでのハイからローへのトランザクションは、ポートBピンを2回トグルします。