CS+ .objファイルを特定のアドレスで.motを作成したいのですが

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.これは失敗と判断しました。

良い方法を提案いただけませんでしょうか?

Parents
  • わわいです
    見た限りでは、
    sub_proc関数はPSUBセクションですが、標準関数のpriintf はおそらくPセクションのままなので、それでコケているんでしょう。
    printf関数のアドレスにはなにが入ってるかを確認してみましょう。

    対策としては、
    ・sub_proc関数もPセクションとして、Pセクションの開始アドレスを0x10000とする
    ・ツールチェインのライブラリジェネレータのオプションで、標準関数のセクションをPSUBとするオプションを付けてビルド
    ・標準関数を全く使わずにすべてを自作の関数とする
    ぐらいでしょうか
  • わわいさん
    いつもありがとうございます、一応これまでのでマップ情報を出力してみました
    B_1 5008 Uninitialized Data 0x00000004 0x00001393 1
    R_1 934 Data 0x00001394 0x00001739 1
    B_2 5030 Uninitialized Data 0x0000173A 0x00002ADF 2
    R_2 100 Data 0x00002AE0 0x00002B43 2
    B   1308 Uninitialized Data 0x00002B44 0x0000305F 4
    R   1580 Data 0x00003060 0x0000368B 4
    SU   512 Stack 0x0000368C 0x0000388B 4
    SI   1536 Stack 0x0000388C 0x00003E8B 4
    PSUB  28 Program 0x00010000 0x0001001B 4
    DSUB  4  Initialized Data 0x0001001C 0x0001001F 4
    PResetPRG  72 Program 0xFFF00000 0xFFF00047 4
    C_1 490   Constant 0xFFF00100 0xFFF002E9 1
    C_2 1068  Constant 0xFFF002EA 0xFFF00715 2
    C  1920  Constant 0xFFF00718 0xFFF00E97 4
    C$DSEC 36 Others 0xFFF00E98 0xFFF00EBB 4
    C$BSEC 24 Others 0xFFF00EBC 0xFFF00ED3 4
    C$VECT 1024 Others 0xFFF00ED4 0xFFF012D3 4
    D_1 934  Initialized Data 0xFFF012D4 0xFFF01679 1
    D_2 100  Initialized Data 0xFFF0167A 0xFFF016DD 2
    D 1580  Initialized Data 0xFFF016E0 0xFFF01D0B 4
    P 25269  Program 0xFFF01D0C 0xFFF07FC0 4
    PIntPRG 523  Program 0xFFF07FC1 0xFFF081CB 1
    W_1 90 Constant 0xFFF081CC 0xFFF08225 4
    W_2 0 Constant 0xFFF08226 0xFFF08226 2
    W 0 Others 0xFFF08228 0xFFF08228 4
    L 1101 Constant 0xFFF08228 0xFFF08674 4
    $ADDR_C_FFFFFF80 4 Others 0xFFFFFF80 0xFFFFFF83 1
    $ADDR_C_FFFFFFA0 16 Others 0xFFFFFFA0 0xFFFFFFAF 1
    FIXEDVECT 48 Others 0xFFFFFFD0 0xFFFFFFFF 4
    よく見たらPSUB/DSUBが4と思っていたのが28と4でした
    sub.c内は
    #pragma section SUB
    char *string="12345678";
    int sub_proc(char *str)
    {
    printf("sub_procのアドレスは%08lX\r",(long)&sub_proc);
    return CMD_OK;
    }
    ですので、妥当な線なんでしょうか?DSUBが4なのは4Byte×4で16Byteという意味?
  • sub.c内は
    #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の部分を削除すれば良いのではないかと思った次第です。

  • 文字列リテラル領域をセクション分割したい
    japan.renesasrulz.com/.../thread
    やっぱり難しそうですね。
  • わわいです
    なるほど、RXでは文字列リテラルは別扱いになるんですねえ。なんだこりゃ
    これをどーにかするには、
    ・アセンブラソースで文字列を定義する
     わざわざファイルを分離しなけりゃいけないってのは筋が悪いですねー。。

    ・文字列変数を定義したブロックに、別のセクション名をつける
    #pragma  section STR_S
    char string1[]="abcde";
    char string2[]="fghijk";

    とすれば、string1 とstring2はDSTR_S セクションとなりますな
    これをC(定数)セクション扱いにするという手ですねー

    #って、
    #const char string1[]="abcde";
    #って書いたらどういうセクションになるんでしょうか?
  • わわいです
    >#って、
    >#const char string1[]="abcde";
    >#って書いたらどういうセクションになるんでしょうか?
    ああ、すでにfujitaさんが書かれていましたね
    まあ、分離したい場合はこれでいけってことなんでしょうね
  • 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 のみとなりました。

  • わわいさん
    #const char string1[]="abcde";
    やってみました、すると
    (E) E0520011 sub.c(57):E0520011:Unrecognized preprocessing directive sub.c 57 gen.mtpj
    でエラーになりました、どうやら私の想像するところですがROM用とRAM用にロードモジュールを分割はできないのではと思います、もちろん実行を移すことはできます、スタックレベルでは問題ないと思われます、printfのような高次関数は埋め込み文字列の位置などがコンパイルするたびに違って来るのでできないし、Lセクション(リテラル領域)等は自分で定義した個所に持ってくることはできないみたいです、printfに限らずSCIの文字出力等も無理でした、何回も途中で止まることもあれば、帰ってくることもあります、なかなか難しいです、解決策があればいいのですが。
  • わわいです
    先頭の#は削除してやってみてください
    const char string1[]="abcde";
  • わわいさん
    いつもお世話になります、「先頭の#は削除」するとコンパイルは通りました。
  • 皆様、やっと念願の内容がかないました、つまり毎回ROMに書き込むのではなくRAM上でUSBによって高速な実行環境を構築して、ソフト開発をスピードアップするというような、今日第一歩を開始できました、苦労しました、全ては皆さまが教えてくださったおかげです、改めて感謝いたします、やりかたとしては、YRDKRX63N評価ボードはRAM実装できないため、諦めました、RX631ですが手元にあったのでこれのCS1にRAM512KByteを実装いたしました、外部バスが外に出るようにしてRAMが中から見えるようにいたしました、プロジェクトにDebugBuildを追加いたしました、同時にPResetPRGのデフォルトセクション0xFFF00000をCS1セクション07000000 に変更いたしました、そして分割出力ファイルを.mot=07000000-0707FFFFに設定いたしました、USBによりCS1に.motを転送後、制御をsubコマンドで07000000移しますと問題なく動作いたしました(下記画面)後はロード後に自動的にジャンプするように作りこめば、出来上がりとなります

    これから十分なスピードで開発できます、重ねて感謝いたします。

Reply
  • 皆様、やっと念願の内容がかないました、つまり毎回ROMに書き込むのではなくRAM上でUSBによって高速な実行環境を構築して、ソフト開発をスピードアップするというような、今日第一歩を開始できました、苦労しました、全ては皆さまが教えてくださったおかげです、改めて感謝いたします、やりかたとしては、YRDKRX63N評価ボードはRAM実装できないため、諦めました、RX631ですが手元にあったのでこれのCS1にRAM512KByteを実装いたしました、外部バスが外に出るようにしてRAMが中から見えるようにいたしました、プロジェクトにDebugBuildを追加いたしました、同時にPResetPRGのデフォルトセクション0xFFF00000をCS1セクション07000000 に変更いたしました、そして分割出力ファイルを.mot=07000000-0707FFFFに設定いたしました、USBによりCS1に.motを転送後、制御をsubコマンドで07000000移しますと問題なく動作いたしました(下記画面)後はロード後に自動的にジャンプするように作りこめば、出来上がりとなります

    これから十分なスピードで開発できます、重ねて感謝いたします。

Children
  • RXの難しいことばかり、書き込みましたが、使用してみるとRXの優れていることに気が付いてきます、H8やSHでは多くの場合モード端子で外部バスを設定するのですが、起動時に他のデバイスのバスと競合して起動が失敗することがあり、CPUの他にWDTのIC等で監視して再リセットを掛けるようなことが必要でした、このRX631の場合はそんなことは一切必要ないようですね、なぜなら初期起動時は外部バスは解放されていないから、何回も簡単なリセット回路で操作してみてこの利点に気が付きました。