- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi, Kenshow-san
Confirm to work this KBA.
Thanks
Jenna
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Jenna-san,
Japanese translation was over.
Please check below.
Original KBA:
FX2/FX2LP SDCC Eclipse Project: Interrupt not Serviced - KBA231372
Thanks.
==============================
タイトル: FX2 / FX2LP SDCC Eclipseプロジェクト:割り込みが処理されない - 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リンカにコマンドラインオプションを追加します。
- 対応するEclipseプロジェクトのプロパティに移動します(プロジェクトを右クリックして[ Properties ]をクリックします)。
- プロパティウィンドウの左側のペインで、[ C/C++ Build ]セクションから[Settings]を選択します。
- [ Tool Settings ]タブで[ SDCCリンカ ]を選択します。
- コマンドテキストボックスで、sdccの後にコマンドラインオプションを追加します。図1を参照してください。
- [ Apply ]をクリックし、[ OK ]をクリックして変更を適用します。
図1. SDCCリンカへのコマンドラインオプションの追加
図1では、コードサイズは0x2FFFに制限され、XSEG(xdata)はFX2 / FX2LPオンチップRAMの0x3000の位置に配置されます。。
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、および外部割り込み0(INT0#)と外部割り込み1(INT1#)のISRが定義されて使用されるisr.cファイルも含まれます。 ポートBピンを切り替えるには:
- INT0#:このピンのハイからローへのトランザクションは、ポートBピンを1回トグルします。
- INT1#:このピンでのハイからローへのトランザクションは、ポートBピンを2回トグルします。
==============================
24-Sept-2020