mips16導入

組み立た3代目ボード(右)と音出力ボード(左)

組み立た3代目ボード(右)と
音出力ボード(左)

先日届いた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のサイズが小さめなので、なかなか使えるオプションだと思う。

Leave a Reply

メールアドレスが公開されることはありません。