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という意味?
  • わわいです
    Dと言うのは初期値付き変数ですんで、
    >char *string="12345678";
    がそれに当たります。
    string ってのはchar のポインタ変数ですんで4バイトですね。
    んで、CSUBセクションに、"12345678"が配置されているはずです
  • わわいさん

    ご指摘ありがとうございます、そうでした、私の間違いです、文字列の位置を示しているのですね、ちゃんと動作しているの?ということで現在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_proc 27 Program 0x00010000 0x0001001A Function Global PSUB SubBuild\sub.obj

    ///////////////////////////////////////////////////////////////////////

    ダウンロードしてsubを呼び出したところ

    ちゃんと無限ループになっていました、リングLEDも停止しましたので、ちゃんと動作してると確認できました。

Reply
  • わわいさん

    ご指摘ありがとうございます、そうでした、私の間違いです、文字列の位置を示しているのですね、ちゃんと動作しているの?ということで現在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_proc 27 Program 0x00010000 0x0001001A Function Global PSUB SubBuild\sub.obj

    ///////////////////////////////////////////////////////////////////////

    ダウンロードしてsubを呼び出したところ

    ちゃんと無限ループになっていました、リングLEDも停止しましたので、ちゃんと動作してると確認できました。

Children
No Data