PIC32MX コード削減方法

2016年9月26日

Microchip サンプルプログラム。からの続き。Flash に入りきらない。話。
いずれにしても、Debug は PIC32MX250F128B 必要かと。完成品を Flash にねじ込む話。
追加で書き直していたりするので、話が微妙に噛み合っていないですが、間違いはないと思います。


以下長いので、話の流れ(2重線で区切ってます)。適当に読み飛ばしてください。
・最適化で Flash に入ったとしても、最適化無しで Debug できない。
・USB プログラムが入ると Flash に入りきらない。
・他のコンパイラを探す。→ コンパイラではないがフリーの開発環境 「Pinguino」。「Arduino」 系の開発環境と似ているらしい。
コンパイラは特にいいのが無い。
・XC の コンパイルオプションを見直す。→ 結局これが現実的。リンカのオプションを変えるだけですごい事に。



→最適化で Flash に入ったとしても、最適化無しで Debug できない。
→USB プログラムが入ると Flash に入りきらない。
USB 関係、特に HOST 関係は秋月で売っている PIC32MX220F032B で Free 版のコンパイラでは Flash に入りきらないと思います。→一番最後のコンパイルオプションでいけそう。
「Android Accessories\Audio Demo with controls」がそのままだとバイト単位できわどく入りませんが↑なら。
HOST 以外は PIC18F(HOST に対応していない) でも動くはずなのでもしかしたら Flash の関係上こっちを使った方がいいかもしれません。コンパイルオプションで入るかも。
Device で使う場合でもちょっとプログラムを追加すると途端に Flash が足りなくなるので複数 inline とか #define 展開とかしない方がいいです。
HOST はさらに malloc を使っているのでヒープエリアの確保が必要です。どのくらい使っているのか分かりませんが、SRAM の多い PIC を採用した方がいいと思います。
とりあえず 2k あてがっています。流石にこれ以上は使っていないだろうと。使っていても 全体的には 8k あるので増やせばいいだけです。MPLAB IDE で作られているのでその開発環境の設定を見れば完璧です。
PIC18F と PIC32MX 以外は何処にも USB 付きは売っていない(少なくとも秋月では)ので関わることはないと思いますが。仕事以外は。
PIC32MX250F128B を「マイクロファン」という通販業者で売っているので、Free 版最適化1のビルドで入るけど、最適化なしの Debug 設定では入りきらないときに使います。最適化しても入らないのであればそれを使うと。
最適化1設定で Flash に入りきらないとリンクすらできないので全体でどのくらい Flash が必要か分かりません。PIC32MX250F128B で全部進めます。そうすると最適化1の時の使う Flash の量が分かります。
あとは ターゲットデバイスの設定を PIC32MX220F032B に設定したものでビルドすれば本気で入らないのかが分かります。書き込みの時「Device ID が違うよ」と言われますが、128B に書き込んでも問題ありません。上位互換です。
そして、128B を持っていなくても設定だけ変えてビルドだけなら当然問題ないので買う前に調べるとか。



→他のコンパイラを探す
結局、開発環境を変えるしかないと。
こっちは最近の話。
PIC32MX – AVR etc -> 「Pinguinoは、Arduinoに良く似た、無料の、お手軽プロトタイピング開発ツールです。」と。
Arduino 使ったこと無いんですがね。Flash 容量関係なくサクサクつくるなら、こっちの方が簡単そうですが。
Arduino のデバッグは厳しい
さくっと調べた感じこっちもステップ実行とかできないんですね。全部シリアルで出力して確認しながらですか。
なんか、ちょろっと Microchp のサンプルの使い方とか書いてあります。
シリアルのプログラムとかサクッと追加できますが、割り込みとかどうなってるんでしょう。使う使わないとか。
ん~~~、完全にローレベルなことは出来なそう? ステップ実行とか出来ないし、書き込み用・Debug にシリアルか USB 使うので最低でもいきなり 5k プログラムメモリ取るとか。毎回 HEX が生成されているなら毎回 PICKIT の書き込みツールで行けばいいのかな。
ちょっと考えていることと違うかな~、余計に Flash に入りきらなそう。ん~~


→他のコンパイラを探す
結局のところ無いみたいです。買うしかないのかな。とか思って Microchip の HP で対応しているコンパイラを見ようと思ったら、


とりあえず英語サイト。
Third Party Partners
J-TAG とかセット製品ぽい。
CCS C Compiler
PIC32 未満、dsPIC33 とか。
mirkoC
2万円。体験版 PIC32 で 6k まで。
・XC32
6万円。体験期間あり。
GNU PIC
Cではない。


→XC の コンパイルオプションを見直す
代替えの物が無いので、XC32 Free のコンパイルオプションで更に何とかならないかと。
PIC32: MPLAB(X)でmips16オプションを使うときのメモ 2013
コンパイルオプションの事が書いてあります。
「USB\Host – HID – Keyboard」が Total : 37272byte だったのですが、上記の通りオプションを変えたところ、


kseg1 Boot-Memory Usage
section                    address  length [bytes]      (dec)  Description
-------                 ----------  -------------------------  -----------
.reset                  0xbfc00000          0x1c4         452  Reset handler
.bev_excpt              0xbfc00380           0x10          16  BEV-Exception
Total kseg1_boot_mem used  :       0x1d4         468  40.1% of 0x490
--------------------------------------------------------------------------
Total Program Memory used  :      0x7c10       31760  24.0% of 0x20490
--------------------------------------------------------------------------
kseg1 Data-Memory Usage
section                    address  length [bytes]      (dec)  Description
-------                 ----------  -------------------------  -----------
.sbss                   0xa0000000           0x98         152  Small uninit data
.bss                    0xa0000098           0x30          48  Uninitialized data
.bss.deviceRptInfo.devi 0xa00000c8           0x68         104
.bss.itemListPtrs.itemL 0xa0000130           0x20          32
.bss.deviceInfoHID.devi 0xa0000150           0x20          32
.bss.usbDeviceInfo.usbD 0xa0000170           0x20          32
.data.usbClientDrvTable 0xa0000190           0x20          32
.bss                    0xa00001b0           0x1c          28  Uninitialized data
.data.usbTPL.usbTPL     0xa00001cc           0x10          16
.bss                    0xa00001dc           0x10          16  Uninitialized data
.bss.BDT.BDT            0xa0000200          0x200         512
Total kseg1_data_mem used  :       0x3ec        1004  3.1% of 0x8000
--------------------------------------------------------------------------
Total Data Memory used  :       0x3ec        1004  3.1% of 0x8000
--------------------------------------------------------------------------

Total : 31,769byte
15%位。めちゃんこ減りました。
オプションで変えたところは、リンカの「Genarate 16-bit code」を追加しただけです。
リンクで 16bit とか訳分からないのですが、これで PIC32MX220F032B にプログラムが入るようになりました?
またバイト単位で入ってません。余計なコードをさらに減らせば。
いや、確かに 16bit と -OS が指定できるのは知っていたのですが、リンクだから変わらないだろとかおもっていたのですが、全然違いました。
リンカだから、ジャンプアドレス位? わから~ん。が、ものすごく減りました。
リンカの設定
Total : 37,272byte : 最適化サイズ -OS
Total : 31,769byte : Genarate 16-bit code、最適化サイズ -OS
Total : 31,876byte : Genarate 16-bit code、最適化1 -O1
Total : 55,640byte : Debug 用。コンパイラも。16bit 無し。最適化無し。
組み合わせ的には、「Genarate 16-bit code最適化1 -O1」ですね。
MIPS16 だと実行速度が 30% 位落ちるとか書いてありますがそもそも早いので気にすることはないかも。
ジャンプ命令のアドレスが 16bit になっているだけなら、速度は何も変わらないはずですが、良くわかりません。32bit変数の処理が遅いのかな?
さらに Debug は最適化しないので、いずれにしても PIC32MX250F128B が必要かと。完成品を Flash にねじ込む話ですから。ちなみに私は「XC32 v1.30」

* XC32コンパイラ
以下はXC32 v1.20の場合です。
mips16オプションは無効。ただし、"リンク時のみ"「-mips16」オプションが有効になる

PIC32

Posted by saba