MC9S12XEP100。絶対アセンブラでコーディングしながら、XGATE を使用していくつかのコード実験を行いたいと思います。Code Warrior 5.9.0 Special Edition Build 5294 を使用してもこれは可能ですか?
よろしくお願いいたします。
ロバート・ヒーバート
こんにちは、ファストさん。
ああ、あなたから連絡をもらえて本当に嬉しいです!!
XEP100 をアセンブラでプログラミングするこの世界では、特に XGATE を混ぜると、かなり孤独を感じます。XEP100 は私が望むことすべて、そしてそれ以上のことを CAN します。私は「C」を話せませんが、絶対アセンブラが本当に好きです。私が relocatable を試している唯一の理由は、今のところそれが XGATE を動作させる唯一の方法だからです。
私は自分の目標を達成する方法のヒントを得るために、マニュアルや見つけられる限りのアプリケーションノートを研究するのに多くの時間を費やしてきました。行き詰まると非常にイライラしますが、何かがうまくいくととてもやりがいを感じます。それはほぼフルタイムの仕事です。
お時間を見つけて、私を正しい方向に導いていただけると嬉しいです。私のプロジェクトを皆さんと共有できればと思っています。かなり長くなりそうSO、もしよければフォーラム外でこれを続けて、良い結果が出たら他の人が使えるように投稿することもできます。
コミュニケーションを確立できるように、個人的にメッセージを送信してみます。
ご興味を持っていただきSOありがとうございます。
よろしくお願いいたします。
ロバート
私はXGATEアセンブラのみで書いています。たぶん私は助けることができるでしょう。私はそれが大好きなんです。コードを移動する理由が不明です。サブルーチンがない理由はないので、アセンブラで 32K を埋めることはほとんどありません。コード戦士はタスクに適さない可能性があります。良い.asmを見せてくださいファイル。私は 6502 と 8080 で経験を積みましたが、7 つのレジスタは贅沢です。
まあ、私の最善の努力にもかかわらず、絶対アセンブラで XGATE コードを書くことはできませんでした。ただし、再配置可能なアセンブラでコードを書く作業が少し進んだので、添付します。
次のステップは、絶対アセンブラで記述したコードをいくつか取得し、それを再配置可能に変換して、それに XGATE を追加することです。今のところ、それほど進んではいませんが、少なくとも動作する XGATE コードがいくつかできました。
助けてくれたLadislavに感謝します。
よろしくお願いいたします。
ロバート
こんにちは、ラディスラフさん。
それは大きな作品であり、「C」で書かれているため、私にはまったく理解できません。
AN 2734、HCS12X ファミリのメモリ構成は持っていますが、そこに XGATE についての記載はありません。もちろん、MC9S12XEP100RMV1 02/20/13 には XGATE メモリ マップが含まれています。両方をもう少し勉強して、物事がもっと明確になるかどうか確認してみます。
可能であれば、このThreadで以前に私が尋ねた質問(7/21/25)に戻ってもいいでしょうか。10.9.2 のリファレンス マニュアルに、コード例 (SCI で「Hello World!」を送信する) があることに気付きました。これは、絶対アセンブラで XGATE を利用するコードを記述できることを示しています。しかし、Code Warrior でコードを実行しようとすると、コードが失敗し、「CPU S12X」は hc12 命令ではないというメッセージが表示されます。
このコードを実行するには何をすればよいですか?
よろしくお願いいたします。
ロバート
こんにちは、
昔、私はあなたに記憶マップを送りました。これで、どのコアがどのアドレス指定モードを使用し、どのようにデータとコードにアクセスするかを理解できたはずです。
CPU は PPAGE_OFFSET で実行されますが、アクセスを簡素化するために、通常、データは GPAGE_offset を使用して読み書きされます。
XGATE はフラッシュまたは RAM のいずれからも実行CAN。RAM から CAN 実行する前に、フラッシュから対応するメモリ空間にコピーする必要があります。XGATE をフラッシュから実行したい場合は、プロジェクトの作成時にこれを設定する必要があります。そうすればコピーは不要になります。
私が提案するのは、常に正しいメモリ配置によって各モジュールにコードを導入することです…
例えば
#pragma CODE_SEG デフォルト
#pragma DATA_SEG デフォルト
#プラグマ CODE_SEG XGATE_CODE_FLASH
#pragma DATA_SEG SHARED_DATA
#プラグマ DATA_SEG XGATE_DATA
コピー プロセス (使用されている場合 - 確認しません) では、グローバル メモリ空間に簡単にアクセスできるように GLD/GST 命令を使用することをお勧めします。メモリ マップに示されているように、16 ビット アドレス指定を使用したデータにアクセスできるのは RAM の一部のみです (CPU の観点から)。16 ビット アドレス指定では表示されない RAM の部分に書き込むには、GPAGE または RPAGE アドレス指定モードを使用する必要があります。ただし、XGATE が実行中の場合、16 ビット アドレス指定を使用して RAM 全体を認識します。
もちろん、コードがフラッシュから実行される場合でも、CPU と XGATE の両方の変数を初期化する copyToRam 関数が存在するCAN。
動作をよりよく理解するために、テストには常にシミュレータまたはデバッガーを使用することを強くお勧めします。メモリ ウィンドウ内の異なるアドレス (つまり、同じアドレス空間内にあるが、異なるアドレス指定モードを使用しているアドレス) をテストして、それら全体で同じコンテンツが表示されるかどうかを確認することが重要です。
実を言うと、私は現在 XDT512 で趣味のプロジェクトを作成しており、すべてが期待どおりの場所にあり、結果が期待どおりであるかどうかを確認するために、多くのデバッグを行う必要があります。警告も読むことが重要です。私はCPUからSWIでそれらを呼び出すためにxgateにディスプレイ関数を配置しました。間違いを避けるために、私は常に整数を変数として使用します (char は適切な変数ではないため、xgate では配列や構造体で問題が発生する可能性があります)。ポインターの変換関数も作成する必要がありました。これは、conversion.c でCAN確認できます。また、CPUからxgateに渡す入力パラメータを初期化するための特別なアプローチを使用しました。たとえば、LCDcSetup(….)を参照してください。私は CPU を呼び出し、データ セットがモジュール lcd_comman_wrappers.c で準備された後、void LCDxSetup(tUI setup) によって使用される特定の構造体を入力し、データの準備後に SWI によって xgate が起動されます。もちろん、ある程度の共有データが用意され、異なるアプローチが使用される可能性もありますが、これは私が CPU から xgate 関数にパラメータを渡すために使用した方法です。
皆さんを混乱させたり怖がらせたりしたいわけではありません。組み合わせと期待が多ければ多いほど、解決すべき問題と複雑なタスクが増えるということを言いたいだけです。最初の努力の後は、すべてがより簡単かつ明確になります。すべては簡単にも複雑にもCAN。私はCPU用のLCDモジュールを持っていて、それをできるだけ簡単にxgateに組み込みたいと考え、このソリューションを使用しました。XGATE は小規模で高速なタスクに使用することを目的としているため、役に立たないとCAN考えられます。このCASE、私は長時間のデータ送信タスクから CPU を解放したいと考えました。
現在、いくつかバグがありますが、段階的に進めており、これも皆さんに提案します。
S12X デバイスは非常にシンプルなので、コンパイラによって生成されたすべてのファイルを完全に削除し、コードの最初の命令としてスタックをロードするだけで、すべてを制御できます。
よろしくお願いいたします。
ラディスラフ
こんにちは、ラディスラフさん。
ここのところ仕事が忙しすぎてプロジェクトに多くの時間を費やすことができませんでしたが、ようやくプロジェクトに戻ることができました。あなたが送ってくれたコード、私自身、そして Code Warrior で作成できる例を研究してきました。本質的には、RAM に XGATE が追加された再配置可能なアセンブラの Fibo 計算プログラムです。
私はそれがどのように機能するかをかなりよく理解しているつもりですが、1つ疑問に思うことがあります。
コードをステップ実行してレジスタとメモリを追跡すると、「CopyToRam」マクロがあまり意味をなさないことがわかります。PPAGE は $FE、GPAGE は $7F、RPAGE は $F8 です。
フラッシュ内の XGATE コードは論理アドレス $7F8000 から始まり、論理アドレス $F81100 の RAM にコピーされると予想しました。しかし、実際には、XGATE コードは論理アドレス $FE8000 から始まり、予想される RAM アドレスに非常にうまくコピーされます。
ここで何が見逃されているのでしょうか?
よろしくお願いいたします。
ロバート
こんにちは、
a) クリーニングされたプロジェクトは元の場所に取り付けられます。古いものは削除されました。機能面では問題はありませんでしたが、古いバージョンでもいくつか誤って追加されたものがありました。
今なら大丈夫のはずです。
b) ポインターが空のウィンドウ上にあるときにマウスの右ボタンを押し、ソース ファイルを開いて xgate.dbg を選択し、PIT0_Handler にブレーク ポイントを設定します。
実行後にxgateで停止することがわかります
CPUも同様
よろしくお願いいたします。
ラディスラフ
こんにちは、ラディスラフさん。
.asmを実行できましたUSBDM にスイッチするとボード上のコードが機能しなくなりますが、次のメッセージが表示されます。これらはプログラムの作成や実行を妨げるものではありません。
*************
プロジェクト「XP100-PIT_XGATE_SEMAPHORES-ASM-C52.mcp」のターゲット「standard」内の次のアクセスパス見つかりません:
(プロジェクト)..\XP100-PIT_XGATE_SEMAPHORES-ASM-C51
ターゲット「Standard」に「XP100-PIT_XGATE_SEMAPHORES-ASM-C51.mcp」が見つかりませんでした
********
source1 ウィンドウでブレークポイントを設定し、ソース コードをステップ実行できます。ブレークポイントを設定して XGATE コードをステップ実行したいのですが、source2 ウィンドウに表示されません。これを実行するために欠けている設定はありますか?
よろしくお願いいたします。
ロバート
こんにちは、ラディスラフさん。
あなたの助力にとても感謝しています、ありがとう。できれば「C」でコーディングしたいのですが、その言語を話せません。自分で学ぼうとしましたが、私には難しすぎます。デバッガでレジスタやメモリを観察CANのでアセンブラが好きです。それは私には意味が分かります。私のプログラムはそれほど大きくなく、作成しているのは私だけです。そのため、私は絶対アセンブラを好みます。
とにかく、私はあなたの添付ファイルを研究し、それを使って何をCANか調べます。改めて、感謝申し上げます。
よろしくお願いいたします。
ロバート
こんにちは、
さて、私が忘れていないかどうかを確認するために、今作成した別の例(c プロジェクトに基づき、逆アセンブルして asm プロジェクトに移植)です。
…RTI ではなく 2 つの PIT によって期間が生成されます。1 つは CPU (PIT1) に、もう 1 つは XGATE (PIT0) にあります。どちらのモジュールも、PIT 割り込みで変更される共有 8 ビット変数 XGATE_diodes を使用し、この変数へのアクセスはセマフォによって制御されます。
それはすべてを示しています。また、異なるアドレス指定スタイルも使用しました。1 回はレジスタ定義で、もう 1 回は直接数値で使用しました。これは単なる例です。
私が何度も表明したように...このCASE、私は xgate で asm プログラミングを使用しません。C コーディングの方がはるかに簡単で、これにより、発生する可能性のある多くの問題も自動的に解決されます。
ASM と C の両方のプロジェクトが添付されています。
よろしくお願いいたします。
ラディスラフ
こんにちは、ラディスラフさん。
私は数日かけてコードを詳細に研究し、ステップ実行して、各ステップで関連するレジスタと変数の状態を記録しました。変数 XGATE_Counter はアドレス $2100:2101 にあり、変数 Counter はアドレス $2102:2103 にあり、変数 FiboRes はアドレス $2104:2105 にあることがわかりました。
あなたの指示に従って XGATE コードをステップ実行し、RAM メモリを監視しました。そのとき、私はこのコードがどのように動作するのかを完全に理解していなかったことに気づきました。カウンターの更新には XGATE が使用されていると想定していましたが、そうではないようです。これは XGATE_Counter を増分するだけであり、フィボナッチ数列の計算とはまったく関係ありません。
これが正しいと仮定すると、これはかなりの学習経験となっていますが、XGATE をどのように使用すればよいのかまだわかりません。
まず、RTI を使用して短いルーチンでこれを使用し、いくつかの時間レートを確立し、いくつかのフラグを設定して、プログラムがメイン ループでさまざまなルーチンに使用できるようにしたいと思います。この目標に近づくのに役立つサンプル コードはありますか?
ありがとうございます
よろしくお願いいたします。
ロバート
こんにちは、
SWIは例の中でのみ有効になっている、SOブレークポイントを設定することをお勧めします。
そして、XGATE ウィンドウ (画像では濃い青色) を選択し、実行を押します。割り込みが終了し、割り込みマシンに渡されるたびに、保留中の割り込みとして評価され、SO再度起動されます。
…。すべての変更を確認できる
…数ステップ後…。
異なるアプローチの小さな例を示すだけです…現在、LCDドライバをXGATEに移行する作業 (趣味のアクティビティ) をCで行っています。SWトリガーを使用して、次のようにLCDのサービス ルーチンを起動します…たとえば…
私には定義があります。
#define SET_SW_TRIG_LCD XGSWT=(0x0101 << SWI_LCD) // SWI_LCDは0です…SWI_0が選択されています
#define REL_SW_TRIG_LCD XGSWT=(0x0100 << SWI_LCD)
それからHD44780.cがあります共有データを準備し、SWI によって LCD サービス ルーチンを起動します。
tUC LCDcOutTextLC(tUC 行, tUC 列, tSC *文字列) {
LCD_IS_BUSYの場合、C_LCD_IS_BUSYを返します。
xgateCmdBlock.func_id = LCD_OUT_TEXT_LC;
xgateCmdBlock.params.lineColText.line = 行;
xgateCmdBlock.params.lineColText.col = col;
xgateCmdBlock.params.lineColText.str = str;
SET_SW_TRIG_LCD; <<<<<<<<<<<<<<<<< ここでLCDサービスを開始します
}
…そして、xgate.cxgate でそれを解放して次のアクションに備えます…。XGSWT値はLCDビジーのフラグとしても使用される。
割り込み void SoftwareTrigger0_Handler(void)
{
LCDxコマンド実行();
REL_SW_TRIG_LCD; // SWトリガー0を解放する
}
コードは次のように変換されます… ( XGSWT = (0x0100 << 0) ; )
12: REL_SW_TRIG_LCD; // SWトリガー0を解放する
0008 f200 LDL R2,#0
000a aa01 ORH R2、#1
000c f300 LDL R3,#%XGATE_8(_XGSWT)
000e ab00 ORH R3,#%XGATE_8_H(_XGSWT)
0010 5a60 STW R2,(R3,#0)
よろしくお願いいたします。
ラディスラフ
これでは、あまり先に進めません。ご提案どおり、再配置可能なアセンブラと XGATE を使用して新しいサンプル プロジェクトを作成しました。実行して再度停止すると、カウンターとフィボナッチの結果が更新されていることがわかります。停止すると、XGATE R1、R2、R7、PC、MCTL、CHIP、および VBR が変更されたか、少なくとも一部が変更されたことがわかります。
main.asm コードをステップ実行すると、コードに沿って進み、数値とレジスタが更新されるのを確認できますが、XGATE コードが実行される場所はわかりません。
XGATE コードは、ソフトウェア割り込みがトリガーされたときにカウンターを更新するだけのように見えますが、XGATE のソフトウェア割り込みを開始するものが何なのかわかりません。
こんにちは、ラディスラフさん。
はい、試してみましたが、成功しませんでした。おそらく、一度に転送するコードが多すぎたのでしょう。もう一度ゆっくりやってみます。ありがとう。
よろしくお願いいたします。
ロバート
こんにちは、
sw トリガーの例を使用してデフォルトの構造を作成する新しいプロジェクトを作成しようとしましたか。また、共有変数のプロセッシング(セマフォではない)についても説明します。これを入手したら、コードを使用して拡張 CAN。ただし、段階的に進んですべてを確認することをお勧めします。
よろしくお願いいたします。
ラディスラフ
こんにちは、ラディスラフさん。
私は XGATE アセンブラ マニュアル .PDF を勉強しており、あなたが示した場所を見つけましたが、そこに書かれている説明が私にはよく分かりません。
MC9S12XEP100RMV1 のマニュアルを(何度も)読んでいると、S12X CPU と XGATE のコードを絶対アセンブラで記述することが可能だということが分かる記述を見つけました。これはマニュアルのセクション 10.9.2 にあり、「コード例 (SCI で「Hello World」を送信)」というタイトルが付けられています。
しかし、Code Warrior で実行しようとすると、すぐに動作が停止してしまいました。最初のエラーは、「CPU S12X」が hc12 命令またはディレクティブではなかったことです。
このプログラムを実行するには何をすればよいですか?
ありがとう、ラディスラフ。そこで答えが見つかるCANかどうか見てみましょう。
よろしくお願いいたします。
ロバート
こんにちは、
特に XGATE を使用して絶対アセンブリに取り組んでいる人を私は知りません。マルチコア (CPU + XGATE) で再配置可能なアセンブリ プロジェクトを作成する可能性があります。
一部の情報は、CW のインストール フォルダー (ファイル Assembler_XGATE.pdf) にあります。たとえば、私の PC では...
c:\Program Files (x86)\Freescale\CWS12v5.2\Help\pdf\
よろしくお願いいたします。
ラディスラフ