mips16導入
先日届いた3代目LEDコントローラ基板を組み立て動作を確認した。さらにVS1011eで音声出力ボードを試作、いろいろ苦労しながらmp3ファイルを再生できるようになった。端子が足りないので、音出力時には、使えない機能がある。もう少し工夫すればそれもなんとか出来そうなので、考え中。ところで、いろいろと機能を追加しているとプログラムサイズが、どんどん大きくなって行き、PIC32MX250の128Kbyteのプログラムメモリーをほぼ使い尽くしている感じ。まさか128KbyteものROMをプログラムだけで使い切るとは思っていなかった。今後、不要な機能を探して削っていくつもりだが、mips16命令セットを使用すれば、コード全体のサイズを減らせそうなのでこれも使ってみたい。 いろいろ調べてみると以下のことがわかった。
- gccに -mips16をつければ mips16のコードが生成される。
- だが、mips16にないアセンブラ命令などがあるとエラーになる
- mips32/mips16の切り替えは jal命令などでやってくれて、復帰も自動らしい。
- リンカーがmips32/mips16を認識し、jal命令の部分は自動で調整してくれるらしい。
- つまり、mips32/mips16は関数単位で混在し放題。
- 例外(reset,割込み等)時はmips32になる。
- mips16の命令ではコプロを読み書きできない。割込み禁止/許可ができない
- attributeでも関数ごとにmips32/mips16を指定できる。
- gccは-mips16オプション指定時、__mips16というマクロを定義する
割込み関係をイジっている部分は __mips16マクロで処理を切り替えるようにして、プログラム全体をmips16/mips32両対応にできた。プログラムサイズを調べてみると mips32で 103,744byteだったtext領域がmips16では76,116byteとなり 25%程度プログラムが短くなった。
pic32mx2xxシリーズだと、どのCPUでもROMのサイズが小さめなので、なかなか使えるオプションだと思う。
最近のコメント