C言語ライブラリーモージュルだけをROMにするのは可能でしょうか?

現在CS+でRX63Nでソフトを作成しております

なにぶんRAMが128K Byteのようで、これをまだまだ先になりそうですが

SDカードやLANやUSBからファームを転送してRAM上で動作させるといいんじゃないかと

その場合ROMは大容量なのでC言語ライブラリーモージュルだけをROMにもたせることができれば

いいのじゃないかと素人考えで、そんなことは可能なんでしょうか?

  • わわいです
    可能です。
    お使いのツールチェインのライブラリ生成ツールのオプションにライブラリのセクションの指定をして、そのセクションをリンカのオプションにてROMのアドレスに割り当て、そして、ビルドした生成物からROMのアドレスのモジュールを抜き出し、それをROMに書き込む、という手順になります。
  • わわいさん
    高度な技術を教えてください
    1.ライブラリ生成ツールのオプションとは「ライブラリ・ジェネレート・オプション」タブの内容のことでしょうか?
    2.リンカのオプションにてROMのアドレスに割り当て
    これは「リンク・オプション」のタブの中であると思いますが
    3.ビルドした生成物からROMのアドレスのモジュールを抜き出し
    これはコピー用のファームを別途用意して
    RAM実行用のファームを後で使用というような内容なんでしょうか?
  • わわいです
    >1.ライブラリ生成ツールのオプションとは「ライブラリ・ジェネレート・オプション」タブの内容のことでしょうか?
    RXのツールチェーンのマニュアルを見てるわけでないのでちとアレですが、おそらくそうだと思います。マニュアルになんか記述はないでしょうか。
    >3.ビルドした生成物からROMのアドレスのモジュールを抜き出し
    SH+HEWの場合だと、リンカオプション>出力>出力ファイルの分割、という項目があり、アドレス範囲あるいはセクション名指定で、バイナリファイルで分割出力できるようになってます。RXの場合でも、それに類似するようなオプションが有ると思われますんで、そこら辺調べてみてください。
    まー、LANやUSBメモリからブートアップさせるためには、そこからブートコードを読み出すスタートアップコードもROMに配置しておく必要があるので、それをするつもりがあるなら、そこら辺は必須となりますんで、これができないと話にはなりませんね
  • わわいさん
    「リンカオプション>出力>出力ファイルの分割」教えていただきありがとうございます、なるほどそれについてはこれまでHewについては長く使用してきましたがやったことがありません、最近はHewではデバックとリリースに区分けして別のメモリマッピングでデバッグをROMに割り当て、リリースでSDRAMに割り当てるというようなことをやっていました、今回まさかライブラリが別出力できるなんて想像できませんでした、ちゃんと用意がしてあったんですね、うーん深い。
  • たいていリンカでライブラリをモジュールにリンクして使用します、パソコンの場合はライブラリDLL等をリンクして使用します、これをRXで実現するためには、ライブラリとジャンプテーブルのようなものをROMに書き込んで置き、RAMのC言語のモジュールからこれを呼び出すような方式ではないかと思います、一昔前ににも似たようなことをしている人を見かけました、あれはどうしてたのかなと思います、もしやって見たことのある人がおられましたらご教授いただけませんか、これが出来ると画期的だと思うのは自分だけでしょうか?
  • 今少し思い出しました、DLLのように別に扱うのではなく
    ROM:ブートモジュール
    ROM:ファンクションテーブル
    ROM:コマンドラインモジュール(ここから一時実行ファイルを起動する)
    ROM:ライブラリモジュール
    RAM:ワーキングRAM
    RAM:一時実行ファイル(これは別ビルドでブートモジュールやコマンドラインでロードする)
    のようなやり方なら実現できそうです、一時実行ファイルはファンクションテーブルを
    参照してライブラリ機能を呼び出す
    これが一昔前のやりかたでしたね、ただこれではファンクションテーブルを作るのがたいへんそう。
  • >もしやって見たことのある人がおられましたらご教授いただけませんか

    一度書いたんだけど、書いている途中で横幅が狭くなり、ついに1行の幅になった。
    Replyボタンを押したけど投稿できなかった。
    2度も書くのは大変だから、簡潔に書きます。
    アセンブラで次のように書きます。

    .GLB _isalnum ; 3-1 アルファベット又は数字かを判定
    .GLB _isalpha ; 3-2 アルファベットかを判定

    .LWORD _isalnum ; 3-1 アルファベット又は数字かを判定
    .LWORD _isalpha ; 3-2 アルファベットかを判定

    ROMに書いた後でLWORDの中身を見て、コピーして次のヘッダーに貼り付けます。

    #define _3_1_ 0xFFFE11A5
    #define _3_2_ 0xFFFE11B5

    #define isalnum ((long (*)(long )) _3_1_ ) // 英字または10進数字かどうか判定
    #define isalpha ((long (*)(long )) _3_2_ ) // 英字かどうか判定


     懇切丁寧に説明している暇は無いから、これだけでは分からないと思います。
     どうしてもやりたい人は、読み解いてください。
  • リカルドさん
    回答ありがとうございます、たぶんこれはライブラリROMの中身のアドレスを推定するようなことですよね、LWORDは32ビツトの関数のアドレスポインタですよね、それを沢山並べて置き、それを関数オーバーライト再定義して使用するのですね、大体このCS+RXのライブラリの関数ポインタテーブルの位置を作らなくても、持っていると思うのでこれが解れば特に新規に配置する必要もないですね、作り方を教えていただき参考になりました。
  • わわいです
    これができたらいい、と思うならいっぺんやってみよう。
    で、その実現方法が自分で思いつけないなら、それが実行できるようになるまで経験を積もう、としかいいようがないですねー
    他人におんぶでだっこでその方法を聞いたところで、実際に実行できるわけもない、とおもったりなんかします

    がんばって実現しましょう。そしてそれを公開してくださればみんながハッピーに。

    #まあ、、、、だれしもが通る道だったりするんですが
  • わわいさん
    やっぱりそれが出来ると、少しは便利になるかもですね、現状ですがとりあえずSCI2が送信/受信がうまく行っているのでUSBにかかろうかと思いましたが、わわいさんの応答でそうだなー、それならSCIの受信がDMACで高速だしSCIでやれるようにしようかな!そうすれば複雑なUSBやLANを組み込むのが容易になるんじゃないかな、ということで次USBやろうと思っていましたが、USB無しのマイコンにも対応できるしSCIを使用してファーム転送できるように開発順序を変えたいと思います(初心者ですからいつできるかわかりません)、とりあえずプロジェクトビルドの種類は1つ追加しました。