2192227_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2192227_ja-JP

2192227_ja-JP

XGATE警告A22011オペランドが範囲外です

MC9S12XEP100、CW スペシャル エディション、再配置可能アセンブラ、デュアル プロセッサ、RAM 内の XGATE。

私のプロジェクトでは、XGATE で割り込みの一部を処理することに成功していますが、興味深い問題に遭遇しました。共有変数をさらに追加し始めるまでは、すべてうまく機能していました。ある時点で、「A22011 オペランドが範囲外です」という警告が表示されました。

私のプロジェクトはかなり大きく複雑になってきたSO、問題を再現するための短いテスト プログラムを作成しました。このプログラムは、ウィザードがいくつかの共有変数を追加して作成した Fibo プログラムです。16 ワードまでの変数は問題ありませんが、それを超えると警告が表示され、プログラムを実行しても 16 を超える変数は更新されません。

これをどう修正すればいいのか分かりません。ご提案があれば、ぜひお聞かせください。

よろしくお願いいたします。

ロバート

Re: XGATE Warning A22011 Operand out of range

こんにちは、Ladisalvさん。

素晴らしい!それが私に必要なことでした。あなたのコードを勉強して、意味が分かりました。これを基本的なテスト コードに組み込んだところ、期待どおりに動作しました。少し実験してみましたが、これも期待通りに機能しました。

パズルのヒントを教えてくれてSOありがとう。

さて、XGATE セマフォに関してもう 1 つ関連する質問がありますが、新しいThreadを開始する方がよいプロトコルだと思うので、そうすることにします。

もう一度お礼を申し上げます。自分で解決できたかどうか分かりません。

よろしくお願いいたします。

ロバート。

Re: XGATE Warning A22011 Operand out of range

こんにちは、

忘れてました…。指定された形式で使用する命令は、5 ビットのオフセットを持ち、バイト数を表し、ワードを使用します。
M[RB, #OFFS5] ⇒RD
SO、最大オフセットは 32 バイトまたは 16 ワードです。

変数インデックスによってアドレス指定された 256 ワードの配列を書き込む簡単な例を見てみましょう。
R0 は常に 0 であることに注意してください。
XGATE_DATA: セクション

; 変数をここに入力してください
アライン2
編曲 DS.W 256
索引 DS.W 1

XGATE_CODE: セクション

; ソフトウェアトリガー0の割り込みハンドラ
アライン2
ソフトウェアトリガー0_ハンドラー:

; インデックスに値をロードする
LDW R2、インデックス; インデックスへのアドレス
LDL R3、#17;
STW R3, (R2,R0) ; インデックス値を保存
;-------------------------- Arr[5] = 0x1234 を書き込み
LDW R3, Index ; インデックスのアドレスを取得する
; R3 = インデックスのアドレスを取得
LDW R2, (R3, R0) ; R2 = インデックス
LSL R2, #$1 ; インデックスをバイト単位で計算します。R2 = インデックス*2 データセットはワードのサイズです。
; Arr[Index]の位置を取得する
LDW R3, Arr ; Addrのベースアドレス
ADD R4, R2,R3 ; Arr[Index]の位置を計算する = Arr + Index*2
LDW R3、#$1234
STW R3, (R4, R0) ; Arr[Index] = $1234 を書き込む

注意:メモリウィンドウにはArr[0..512]が表示されます(Arr DS.W 256を定義した場合でも)。SO、arrインデックス17にワードを書き込むと、実際にはメモリウィンドウのArr[34]とarr[35]にワードが書き込まれます。

配列から同様のものが読み取られることに注意してください。


#OFF5 命令を使用する場合は、要素 [x,16] を持つ 2 次元のワード配列をアドレス指定するようなものを作成できます。しかし、これは少し複雑だと思います。


よろしくお願いいたします。

L.

Re: XGATE Warning A22011 Operand out of range

こんにちは、ラディスラフさん。

私のコードをご覧いただき誠にありがとうございます。

このテストコードでは、XGATE_CounterXXの内容を読み込み、インクリメントしてXGATE_CounterXXに格納するだけです。コードはXGATE_Counter_17に達するまでは正常に動作しますが、それ以降は範囲外エラーが発生します。

.data の先頭からのオフセットを使用して、XGATE_Counter_17 (およびそれ以上の変数) から値を取得できれば望ましいでしょう。コマンドラインは

LDW R2,(R1,#(XGATE_CounterXX - MyData)) はまさにそれを行いましたが、.data の先頭から最大 32 バイトまたは 16 ワードに制限されるようです。

LDW R2,(R1,#(XGATE_CounterXX - MyData)) コマンドは一体何を実行するのでしょうか?私が持っている情報の中にそれに関する説明は見つかりません。

私のマニュアルの解釈が正しければ、フラッシュではなく RAM から XGATE を実行する方が高速 (より効率的?) であり、それが割り込みを処理するために XGATE を使用する主な目的ではないでしょうか?

私にとって、「C」言語を何にでも使用することは選択肢ではありません。なぜなら、その言語を話せないからです。

Re: XGATE Warning A22011 Operand out of range

こんにちは、

前回の更新を読んで、さらに混乱し始めました。
開発プラットフォームとして C コードの例を準備するのは簡単ではないだろう。

さらに、フラッシュと RAM 内の xgate について考えたり、xgate 上で基本関数を処理してから CPU の割り込みで呼び出す (続行する) ことも考えられます (可能です)。

BR

ラディスラフ

Re: XGATE Warning A22011 Operand out of range

こんにちは、

私の質問は、「あなたは何をしたいのですか...」です。


LDW R2,(R1,#(XGATE_CounterXX - MyData)) ; カウンタをロード
インクR2
STW R2,(R1,#(XGATE_CounterXX - MyData)) ; カウンタを保存

XGATE_CounterXX から値を取得し、それを増分してから元に戻したいということですか?
または、MyData から XGATE_CounterXX のオフセットを取得し、それを増分して、その値を XGATE_CounterXX に設定しますか?
または....?

よろしくお願いします、
ラディスラフ

Re: XGATE Warning A22011 Operand out of range

おっと。最後の投稿にエラーが発生しました。16 個の変数ではなく、32 個の変数 (16 語) にする必要があります。

Re: XGATE Warning A22011 Operand out of range

私はこれについてさらにトラブルシューティングを行っており、マニュアルを読み、PRMと.mapを研究しています。ファイルとデバッガーの使用。非ページ RAM と非バンク フラッシュを使用しています。

マニュアルによれば、XGATE レジスタ R1 には、チャネルのサービス要求ベクトルの初期ポインタがプリロードされているとのことです。XGATE レジスタ R7 には、XG1SP74 または XG1SP31 のいずれかの内容がプリロードされます。

デバッガーを使用すると、リンカーがアドレス XGATE $E100 から共有変数を配置していることがわかります。アドレス XGATE $E100 ~ $FFFF は論理アドレス $2100 ~ $3FFF に対応します。

R1 に $E100 が含まれている場合、"範囲外" エラーが発生する前に 16 個の変数にしかアクセスできません。


私のプロジェクトでは、最終的には XGATE で 27 種類の割り込みルーチンを処理できるようにしたいと考えています。そのうちの 1 つは 256 バイトのルックアップ テーブルを使用する必要があります。

この問題に対処する方法についてのアドバイスがあれば、ぜひお願いします。

よろしくお願いいたします。

ロバート

タグ(1)
評価なし
バージョン履歴
最終更新日:
‎11-20-2025 10:18 AM
更新者: