みなさんこんにちは、、
私は現在、SPC563XX(Power Architecture e200Z3)用のCodeWarrior 2.9を使用しています。これはMCP563xxマイクロコントローラと同等のものです。
MCP56xxファミリ向けにERIKA RTOSを統合しようとした際に、以下のコンパイルエラーが発生しました。
mwldeppc: 未定義: 'EE_hal_terminate_savestk'
mwldeppc: ee_tstub.o 内の 'EE_oo_thread_stub' から参照されています
調査の結果、関数EE_hal_terminate_savestk()はアセンブリ(.S)ファイルで定義されていることがわかりましたが、このファイルはコンパイルプロセスに含まれていないようです。
私のツールチェーンは.cファイルをコンパイルできますファイルの問題だったので、.S ファイルを .c に名前変更することで問題を回避しようと試みました。ファイルを作成し、アセンブリコードをCスタイルの関数でラップします(例:asm void Fun(){})。
当初の私の意図は、同じアセンブリ実装を再利用し、関数定義をC言語の構文に合わせるだけで、Makefileの変更を避けることでした。しかしながら、この方法を用いると複数のコンパイルエラーが発生し、これは予想外の結果です。
以下に、私が遭遇しているエラーの一部を示します。
不正な関数定義
未定義の識別子「rlwinm」
未定義の識別子「addis」
未定義の識別子「stw」
未定義の識別子「stmw」
未定義の識別子「mtlr」
未定義の識別子「bl」
未定義の識別子「lwz」
未定義の識別子「addi」
宣言構文エラー
';' 期待される
CodeWarriorコンパイラが、Cファイル内のいくつかのPowerPCアセンブリ命令を認識していないようです。
理解できるよう手伝っていただけますか?
再開まで今しばらくお待ちください。
よろしくお願いします、
ナゲンドラ・ポトゥラ
ソフトウェアアーキテクト
AVL ITCインド
表示されているコンパイルエラーは、PowerPCアセンブリコードがCコードとしてコンパイルされていることが原因です。元の .S ファイルの名前を .c に変更し、アセンブリを C 関数内に埋め込むことで、コンパイラは rlwinm、addis、stw などのアセンブリ命令を C 構文として解釈しようとしますが、その結果、「未定義の識別子」や「不正な関数定義」などのエラーが発生します。この方法はCodeWarriorには適用できません。なぜなら、これらの命令はアセンブラによって処理された場合にのみ認識されるからです。
正しい解決策は、元の.Sファイルを保持し、ビルドシステムに適切に含まれるようにして、アセンブラによってコンパイルされ、プロジェクトの他の部分とリンクされるようにすることです。この形式のインラインアセンブリは、RTOSで使用される完全なアセンブリモジュールを置き換えることはできません。
ERIKA Enterpriseはサードパーティ製のオープンソースRTOS(OSEK/AUTOSARに類似)であり、NXP製品ではないため、その統合およびビルド構成はNXPの管轄外であり、お客様側で対応していただく必要がありますのでご注意ください。
参考までに、以下の資料が役立つかもしれません。
Freescale PPC e200 (MPC56xx) サポートページ: https://erika.tuxfamily.org/wiki/index.php?title=Freescale_PPC_e200_ %28MPC_56xx% 29
ご理解いただきありがとうございます。
返信ありがとうございます。
NXPのスタートアップコードがどこで見つかるか教えていただけますかMPC5634M ???
こんにちは、チームの皆さん、
あなたが正しいです。質問を投稿した後、ファイル名を単に*.sから*.cに変更しただけで間違いを犯していたことに気づきました。
そこで、以下に示すようにインラインアセンブリを使用して同じ機能を実装したところ、コンパイラとリンカのエラーがすべて解消されました。
void Func(void)
ヤージュ
アセンブリー
ヤージュ
/* ここにアセンブリコードが入ります */
}
}