もうだいぶ前の話になるのだが、現在、開発中のプログラムで、
RAM展開するプログラムのコードをROM化して格納する設定を行ったが、
どうにも思ったような生成物が作れずにコンパイラのメーカーとやりとりしていたことがあった。
わりと難航して行き着いた先が2つのプロジェクトに分けるという方法だった。
だいたいこんな感じですね。
- RAMコード用のプロジェクトでビルド
- RAMデータのbinファイルを出力する
- ローダーのプロジェクトで2.のbinデータをセクションに配置させる
- ROM上で動くローダーのコードをビルド
- ROMデータをIntel Hex形式で出力
といったフローである。
これで2つのプロジェクトを連続して実行すればよくて、
それはバッチビルドで2つのプロジェクトを指定した順序で実行するようにすればOKと。
で、最近いろいろ手を加えていたら、RAMコードのプロジェクトを2分割することになった。
このマイコンのかなり特有の事情によるものなので詳細は書かないが、
特定部分のコードを生成したら一旦binファイルに出力して、
同じアドレスで別プロジェクトに貼り付ける方法がよいだろうと。
結果として3つのプロジェクトを連続してビルドすることとなった。
上記を見てもわかるのだが、各プロジェクトの最後にはbinファイルで出力するとか、
Intel Hex形式で出力するという処理が入っている。
このあたりの出力はビルド後に実行するコマンドの中でやっている。
出力範囲を指定したり、オフセットがあったり、単純な出力機能では対応できないことも理由である。
この出力ファイルの拡張子なのだが、あまり定まったものがないのだなと最近気づく。
というのもIntel Hex形式の拡張子について、
あるプログラムでは.hexで、あるプログラムでは.ihexで、あるプログラムでは.ihxで、
わりとバラバラでどの拡張子で出力するのか錯綜していた。
同じような話はモトローラのSフォーマット、従来よく使っていた形式で、
.mot という拡張子で見ることが多かったが、.srecとか.sとか他の拡張子も使われている。
.sってのはアセンブラ言語の拡張子で見ることが多いから、出力ファイルで使うのはどうかと思うが。
拡張子はなんでもいいんでしょうけどね。