GAと申します。表題の通り、RX660シリーズを使用したソフトを作成しております。以前別スレッドにてご相談させていただき、無事アセンブラコードが動き始めたのですが、一部どうしても解決出来ない事項があり、ご相談させていただきました。
◎状況取引先様から頂いた、元々H8Sシリーズにて使用されていたソフトを、CPU変更に伴い、RX660シリーズで作り直しています。その処理の中に、外部変数(別ファイルで定義されている変数)を参照する必要があるのですが、上手くビルドが出来ません。(該当部分をコメントアウトするとビルドが通るので、ここが原因となっているのは間違いありません。)
◎開発環境
・使用マイコン移植前:HD64F2145B移植先:R5F56609EDFP
・開発環境 CS+(移植前の開発環境は不明ですが、恐らくHEWだと思われます)
◎該当箇所(社外秘の為、詳細な内容を書くことが出来ないことをご了承ください)
・global.h(外部参照する変数・関数をまとめたファイル)#define GLOBAL extern#define GLOBAL_VAL(V)GLOBAL int gaibu_hensu GLOBAL_VAL( 0 );//他の宣言
・sorce1.c(関数実体のファイル)//その他の処理#pragma inline_asm AsmCodeextern void AsmCode(void){ .GLB _gaibu_hensu ;E0552029 アセンブラコードに使用できない記述がある .IMPORT _gaibu_hensu ;E0552004 無効なオペランドがある ;アセンブラのコード}//その他の処理
エラー内容から、.GLBは使用できず、.IMPORTを使用する為に宣言のやり方を変える必要があるのではないかと予想していたのですが、RXシリーズのコンパイラの資料では、.GLBを使用するように記載されており、混乱しております。参照する変数のアセンブラ内の書き方をいろいろと変えたり、([]でくくったり#や@を付けたり)sorce1.c内部にグローバル変数を作ってそれを呼び出してみたりといろいろと試しているのですが、どれも全て上記コメント内のエラーを返してくるため、何が原因かが分からない状態です。また、この件に関する資料やブログ等の情報が少ないうえに、今回アセンブラコードを触るのが初めてなこともあり、何が間違っているのかがつかみ切れていない状態です。お知恵をお貸しいただけますと、幸いです。
> 今回アセンブラコードを触るのが初めてなこともあり、何が間違っているのかがつかみ切れていない状態です。 どうしてもアセンブラで書く事情がある、という前提であればイチから書き方を考えるよりコンパイラに吐かせたリスティングファイルを参考にするのが良いです。https://tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/latest/CS+.chm/Compiler-CCRX.chm/Output/ccrx02c0501y0301.html似たようなことをするものをCソースで作っておいてビルドしてみればおおよそ見当が付くのでは。色々やっているうちに、Cでも良いか、となる気はしますが。
ほやさん
ご返信ありがとうございます。コンパイルオプションから、「アセンブリ・ソース・ファイルを出力する」設定で、アセンブラ(.srcファイル)を生成させて、それを参考にアセンブラコードを書くという形でやっておりましたが、リスティングファイルを吐き出させるというのは初めて知りました。ありがとうございます。参考にさせていただきます。
GAさまのやりたい事と違うかも知れませんが。
global.h(外部参照をまとめたファイル)
extern int gaibu_hensu(void);
source2.c(関数実体)
int gaibu_hensu(void) { return 0; }
source1.c(今回作りたいインラインアセンブラのファイル)
#include "global.h" //C言語版 void func1(void) { gaibu_hensu(); } //アセンブラコード版 #pragma inline_asm func2 void func2(void) { BSR _gaibu_hensu }
上記の様なファイルを作ってビルドしてみました。
func2()がインラインアセンブラのコードで、外部関数を呼ぶコードが含まれています。func1()は、比較のためのC言語版[参考]です。
上記をビルドして、アセンブラコードを吐き出させてみると、(オリジナルのファイル名は source1.lst)
source1_lst.txt * RX FAMILY ASSEMBLER V3.06.00.01 [13 Oct 2023] * SOURCE LIST Thu Mar 28 13:26:41 2024 LOC. OBJ. 0XMDA SOURCE STATEMENT ;RX Family C/C++ Compiler (V3.06.00 [28 Nov 2023]) 28-Mar-2024 13:26:41 ;*** CPU TYPE *** ;-ISA=RXV3 ;*** COMMAND PARAMETER *** ;src\user\source1.c ;-isa=rxv3 ;-fpu ;-lang=c99 ;-include=src\user ;-include=src\smc_gen\r_pincfg ;-include=src\smc_gen\r_config ;-include=src\smc_gen\r_bsp\mcu\rx660\register_access\ccrx ;-include=src\smc_gen\r_bsp\mcu\rx660 ;-include=src\smc_gen\r_bsp\mcu\all ;-include=src\smc_gen\r_bsp\board\user ;-include=src\smc_gen\r_bsp\board\generic_rx660 ;-include=src\smc_gen\r_bsp ;-include=src\smc_gen\general ;-output=obj=DefaultBuild\source1.obj ;-debug ;-g_line ;-listfile=DefaultBuild\source1.lst ;-optimize=0 ;-tfu=intrinsic ;-map=DefaultBuild\1st\RX660.bls ;-nologo ;-asmopt=-bank .glb _func1 .glb _gaibu_hensu .glb _func2 .SECTION P,CODE 00000000 _func1: .STACK _func1=4 .LINE "C:\xxx\src\user\source1.c",6 00000000 05rrrrrr A BSR _gaibu_hensu 00000004 02 RTS 00000005 _func2: .STACK _func2=4 ._LINE_TOP inline_asm 00000005 05rrrrrr A BSR _gaibu_hensu ._LINE_END inline_asm 00000009 02 RTS .END Information List TOTAL ERROR(S) 00000 TOTAL WARNING(S) 00000 TOTAL LINE(S) 00048 LINES Section List Attr Size Name CODE 0000000010(0000000AH) P Cpu Type -ISA=RXV3 -FPU Command Parameter -subcommand=C:\xxx\AppData\Local\Temp\$ccrx5386267\$ccrx\source1.src.cmd -nologo -isa=rxv3 -fpu -fint_register=0 -endian=little -debug -bank -listfile=C:\xxx\DefaultBuild\source1.lst -output=C:\xxx\DefaultBuild\source1.obj
* RX FAMILY ASSEMBLER V3.06.00.01 [13 Oct 2023] * SOURCE LIST Thu Mar 28 13:26:41 2024 LOC. OBJ. 0XMDA SOURCE STATEMENT ;RX Family C/C++ Compiler (V3.06.00 [28 Nov 2023]) 28-Mar-2024 13:26:41 ;*** CPU TYPE *** ;-ISA=RXV3 ;*** COMMAND PARAMETER *** ;src\user\source1.c ;-isa=rxv3 ;-fpu ;-lang=c99 ;-include=src\user ;-include=src\smc_gen\r_pincfg ;-include=src\smc_gen\r_config ;-include=src\smc_gen\r_bsp\mcu\rx660\register_access\ccrx ;-include=src\smc_gen\r_bsp\mcu\rx660 ;-include=src\smc_gen\r_bsp\mcu\all ;-include=src\smc_gen\r_bsp\board\user ;-include=src\smc_gen\r_bsp\board\generic_rx660 ;-include=src\smc_gen\r_bsp ;-include=src\smc_gen\general ;-output=obj=DefaultBuild\source1.obj ;-debug ;-g_line ;-listfile=DefaultBuild\source1.lst ;-optimize=0 ;-tfu=intrinsic ;-map=DefaultBuild\1st\RX660.bls ;-nologo ;-asmopt=-bank .glb _func1 .glb _gaibu_hensu .glb _func2 .SECTION P,CODE 00000000 _func1: .STACK _func1=4 .LINE "C:\xxx\src\user\source1.c",6 00000000 05rrrrrr A BSR _gaibu_hensu 00000004 02 RTS 00000005 _func2: .STACK _func2=4 ._LINE_TOP inline_asm 00000005 05rrrrrr A BSR _gaibu_hensu ._LINE_END inline_asm 00000009 02 RTS .END Information List TOTAL ERROR(S) 00000 TOTAL WARNING(S) 00000 TOTAL LINE(S) 00048 LINES Section List Attr Size Name CODE 0000000010(0000000AH) P Cpu Type -ISA=RXV3 -FPU Command Parameter -subcommand=C:\xxx\AppData\Local\Temp\$ccrx5386267\$ccrx\source1.src.cmd -nologo -isa=rxv3 -fpu -fint_register=0 -endian=little -debug -bank -listfile=C:\xxx\DefaultBuild\source1.lst -output=C:\xxx\DefaultBuild\source1.obj
の様なコードとなります。
.glb _gaibu_hensu
は、生成コード内に含まれているので、ユーザ側で記載しなくても良いのかと思います。
func1(), func2()どちらも
BSR _gaibu_hensu
RTS
となっており、「目的がインラインアセンブラコードの中から外部関数を呼ぶという事であれば」source1.cの様に書けば良いのではないかと思います。やりたい事がイマイチ良く判らなかったので、質問の意図に合っていない場合は申し訳ないです。
tf さん
ご返信ありがとうございます。また、外部関数の呼び出し方のご展開ありがとうございます。勉強になりました。今後の修正作業の参考とさせていただきます。