音声ファイル(.bin)を一緒にビルドしたい

stlと申します。

「音声ファイル(MIDIデータ)の再生をPWM機能を使って実現しようと試みています。

音声データを .bin ファイルに変換したものを、プログラムファイルと一緒にビルドする方法について教えていただけますか?

  • GCCならこれで行けると思います。
    FAQ - GCCプロジェクトでバイナリファイルをリンクする方法
    https://ja-support.renesas.com/knowledgeBase/20218363

  • お答えいただきありがとうございます。

    アセンブラを記述するための.Sファイルはどこにあるのでしょうか?

    また、リンカスクリプトというものに、ラベルを記述するのはどうすれば良いのでしょうか?

  • Anonymous
    Anonymous

    音声ファイルが例えば「ぺいぺい」とか「わおーん」とか提供されたものを改変せず使う(=開発中に更新される頻度が極めて少ない)のであれば、開発中のプログラムに直接組み込む必要はないわけです。プログラムとは離れた固定アドレスに格納するだけ。そういう場合、ウチでは次の手順としています。

    1. マイコン内 CodeFlash のどこにその音声データを置くか決める

    2. bin ファイルを当該アドレスに配置された mot / hex 形式に変換する。

    3. 開発環境上、ポストビルド工程でプログラムの mot / hex と音声の mot / hex を単純に結合する

    (begin / end レコードだけ特別扱いしないといけません)

    RX671 2MiB マイコンだと FFE0000H-FFFFFFFFH が CodeFlash ですから

    音声データを FFE00000H から配置する(ような mot に変換する)

    プログラムは FFF00000H から配置する(ようにリンカスクリプトを書く)

    mot と mot を結合する

    こうしておくと音声データが最大 1MiB まで格納できます。コンパイラやリンカに音声データを食わせなくてよくて、ビルド時間が短縮できてハッピーになれそうです。

  • > アセンブラを記述するための.Sファイルはどこにあるのでしょうか?
    なければファイルを作れば良いでしょう。
    最低限必要なのは .section 、 .incbin 、 .end だけです。

    (参考)How to Embed Binary Data in Program Code
    http://elm-chan.org/junk/32bit/binclude.html

    > また、リンカスクリプトというものに、ラベルを記述するのはどうすれば良いのでしょうか?
    GCCやGNUリンカについてはここで尋ねるより自分で調べた方が良いです。
    (参考) FAQ - GCC/LLVMプロジェクトでセクションの配置を定義する方法(リンカスクリプトの記述方法)
    https://ja-support.renesas.com/knowledgeBase/19549765

    もっと解り易いものが色々とあります。
    Everything You Never Wanted To Know About Linker Script
    https://mcyoung.xyz/2021/06/01/linker-script/
    The most thoroughly commented linker script (probably)
    https://blog.thea.codes/the-most-thoroughly-commented-linker-script/

    アセンブラを使わずリンカスクリプトに直接INCLUDE(ファイル名)で配置する方法は
    固定アドレスに配置する方法と相性が良いかもしれません。
    何が正解かはどういう使い方をしたいかによるので、色々見て検討してください。

  • 固定番地に配置するのであればリンカスクリプトでバイナリファイルを直接突っ込む方法が適しているかもしれません。
    (参考) Include .bin Binary Files in a GNU Linker File
    https://mcuoneclipse.com/2022/06/17/include-bin-binary-files-in-a-gnu-linker-file/

  • > アセンブラを記述するための.Sファイルはどこにあるのでしょうか?
    なければファイルを作れば良いでしょう。
    最低限必要なのは .section 、 .incbin 、 .end だけです。

  • >>2. bin ファイルを当該アドレスに配置された mot / hex 形式に変換する。

    これはobjcopyで出来ますでしょうか?

    >>3. 開発環境上、ポストビルド工程でプログラムの mot / hex と音声の mot / hex を単純に結合する

    この結合はツールなどを使用するのでしょうか?

  • > また、リンカスクリプトというものに、ラベルを記述するのはどうすれば良いのでしょうか?
    GCCやGNUリンカについてはここで尋ねるより自分で調べた方が良いです。
    (参考) FAQ - GCC/LLVMプロジェクトでセクションの配置を定義する方法(リンカスクリプトの記述方法)
    https://ja-support.renesas.com/knowledgeBase/19549765

  • アセンブラファイルは、ユーザプログラムのあるsrcフォルダに作成しても良いのでしょうか?

    また、リンカスクリプトはfsp.idというファイルがあるのですが、この内容を変更するのでしょうか?

  • > アセンブラファイルは、ユーザプログラムのあるsrcフォルダに作成しても良いのでしょうか?
    はい。そこに置けばビルド対象になってくれると思います。

    > また、リンカスクリプトはfsp.idというファイルがあるのですが、この内容を変更するのでしょうか?
    そうですね。コンフィグレータで書き換えられてしまうかもしれないので適宜バックアップを取りながら進めてください。ちなみに拡張子は *.ld (小文字のL)です。