MC9S12XEP100、CW スペシャル エディション、再配置可能アセンブラ、デュアル プロセッサ、RAM 内の XGATE。
私のプロジェクトでは、XGATE で割り込みの一部を処理することに成功していますが、興味深い問題に遭遇しました。共有変数をさらに追加し始めるまでは、すべてうまく機能していました。ある時点で、「A22011 オペランドが範囲外です」という警告が表示されました。
私のプロジェクトはかなり大きく複雑になってきたSO、問題を再現するための短いテスト プログラムを作成しました。このプログラムは、ウィザードがいくつかの共有変数を追加して作成した Fibo プログラムです。16 ワードまでの変数は問題ありませんが、それを超えると警告が表示され、プログラムを実行しても 16 を超える変数は更新されません。
これをどう修正すればいいのか分かりません。ご提案があれば、ぜひお聞かせください。
よろしくお願いいたします。
ロバート
こんにちは、Ladisalvさん。
素晴らしい!それが私に必要なことでした。あなたのコードを勉強して、意味が分かりました。これを基本的なテスト コードに組み込んだところ、期待どおりに動作しました。少し実験してみましたが、これも期待通りに機能しました。
パズルのヒントを教えてくれてSOありがとう。
さて、XGATE セマフォに関してもう 1 つ関連する質問がありますが、新しいThreadを開始する方がよいプロトコルだと思うので、そうすることにします。
もう一度お礼を申し上げます。自分で解決できたかどうか分かりません。
よろしくお願いいたします。
ロバート。
こんにちは、
忘れてました…。指定された形式で使用する命令は、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.
こんにちは、ラディスラフさん。
私のコードをご覧いただき誠にありがとうございます。
このテストコードでは、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」言語を何にでも使用することは選択肢ではありません。なぜなら、その言語を話せないからです。
こんにちは、
前回の更新を読んで、さらに混乱し始めました。
開発プラットフォームとして C コードの例を準備するのは簡単ではないだろう。
さらに、フラッシュと RAM 内の xgate について考えたり、xgate 上で基本関数を処理してから CPU の割り込みで呼び出す (続行する) ことも考えられます (可能です)。
BR
ラディスラフ
こんにちは、
私の質問は、「あなたは何をしたいのですか...」です。
LDW R2,(R1,#(XGATE_CounterXX - MyData)) ; カウンタをロード
インクR2
STW R2,(R1,#(XGATE_CounterXX - MyData)) ; カウンタを保存
XGATE_CounterXX から値を取得し、それを増分してから元に戻したいということですか?
または、MyData から XGATE_CounterXX のオフセットを取得し、それを増分して、その値を XGATE_CounterXX に設定しますか?
または....?
よろしくお願いします、
ラディスラフ
おっと。最後の投稿にエラーが発生しました。16 個の変数ではなく、32 個の変数 (16 語) にする必要があります。
私はこれについてさらにトラブルシューティングを行っており、マニュアルを読み、PRMと.mapを研究しています。ファイルとデバッガーの使用。非ページ RAM と非バンク フラッシュを使用しています。
マニュアルによれば、XGATE レジスタ R1 には、チャネルのサービス要求ベクトルの初期ポインタがプリロードされているとのことです。XGATE レジスタ R7 には、XG1SP74 または XG1SP31 のいずれかの内容がプリロードされます。
デバッガーを使用すると、リンカーがアドレス XGATE $E100 から共有変数を配置していることがわかります。アドレス XGATE $E100 ~ $FFFF は論理アドレス $2100 ~ $3FFF に対応します。
R1 に $E100 が含まれている場合、"範囲外" エラーが発生する前に 16 個の変数にしかアクセスできません。
私のプロジェクトでは、最終的には XGATE で 27 種類の割り込みルーチンを処理できるようにしたいと考えています。そのうちの 1 つは 256 バイトのルックアップ テーブルを使用する必要があります。
この問題に対処する方法についてのアドバイスがあれば、ぜひお願いします。
よろしくお願いいたします。
ロバート