CS+初心者のIKUZOです、先ほど来からRX63NのUSBでターミナル動作とブロック転送ができるようになりましたので、下記のようなことをやろうとしましたが失敗しました
1.DebugBuildを追加します
2.sub.c とsub.h を追加します
3.セクションPSUB,DSUB,0x10000を追加します
4.sub.c中で#pragma section SUBを宣言します
5.sub.c中でint sub_proc(char *str){printf("*");}を作成します
6.これでDebugBuildをビルドします、結果ビルドエラー無し
7.出来上がった.mot 部分から 0x10000 ~0x18000までをバイナリ化してロードモジュールにする
8.DefaultBuildに切り替えてビルド(sub.c関連は無効)
9.DefaultBuildの.motをFDTでROMにプログラム
10.基板を起動、ターミナル起動、USBターミナルからSRAMの0x10000へロードモジュールを転送
11.本プログラムのコマンドラインから0x10000のロードモジュールを呼び出し
12.暴走はしないもののそれらしい動作はいたしません
13.DebugBuildマップ情報を出力させますと、PSUB,DSUBは4Byte程しか出力されていませんでした。
14.これは失敗と判断しました。
良い方法を提案いただけませんでしょうか?
わわいさん
ご指摘ありがとうございます、そうでした、私の間違いです、文字列の位置を示しているのですね、ちゃんと動作しているの?ということで現在printfは無理みたいなので、下記のようにしてみました
///////////////////////////////////////////////////////////////////////
//_sub_proc 27 Program 0x00010000 0x0001001A Function Global PSUB SubBuild\sub.obj
int sub_proc(char *str)
{
// printf("sub_procのアドレスは%08lX\r",(long)&sub_proc);
while(1){}
return CMD_OK;
}
ダウンロードしてsubを呼び出したところ
ちゃんと無限ループになっていました、リングLEDも停止しましたので、ちゃんと動作してると確認できました。
sub.c内は #pragma section SUB char *string="12345678"; int sub_proc(char *str) { printf("sub_procのアドレスは%08lX\r",(long)&sub_proc); return CMD_OK; } ですので、
#pragma section SUB char *string="12345678"; int sub_proc(char *str) { printf("sub_procのアドレスは%08lX\r",(long)&sub_proc); return CMD_OK; }
文字列 "12345678" はリテラル領域である Lセクションに配置され、期待した動作とならないと思います。
#pragma section SUB const char string[]="12345678";
とすると CSUB_1 に置かれるようです。
fujita nozomuさん 有益な情報を調べていただきまして感謝します、CSUB_1のセクションも追加してありましたのでprint_f(string);これもやってみましたが表示はしないです、昨日はもう諦めかけていましたが、 昨日までのやり方は 1.DefaultBuild →最初からいじらないROMのみsub.cは除外 2.DebugBuild→全てのセクションをRAMに割り付けたものsub.cは除外(ロードサイズ大) 3.SubBuild→DefaultBuildからsub.cをRAMに割り付けたもの(ロードサイズ小) にしていますがDefaultBuildの生成.motをFDTで書き込み、SubBuildのsub.cを転送実行していました 今日の新しいアイデアはSubBuildをFDTで書き込み、SubBuildのsub.cを転送実行すればprintfのアドレスを探したりせず、そのままできるのではないかと、FDTがエラーになるなら.motのRAMの部分を削除すれば良いのではないかと思った次第です。
printf() の第 1引数の文字列もあるので
#pragma section SUB const char string[]="12345678"; #define CMD_OK 0 int sub_proc(char *str) { static const char fmt[]="sub_procのアドレスは%08lX\r"; printf(fmt,(long)&sub_proc); return CMD_OK; }
としてコンパイルしたところ、使用されるセクションは PSUB と PCSUB_1 のみとなりました。