要旨

  PICマイコンを用いたUSBデバイスの自作に関する記事である。本記事は前回うまく動作させることができなかったUSBマイクロフォンのサンプルプログラム(USB Device - Audio - Microphone)について動作させる方法がわかったのでその結果を記した。


背景と目的

  前回の記事で『PICで動かすUSB』で取り上げられているUSBマイクのサンプルプログラム(USB Device - Audio - Microphone)を動かしてみたが、うまく動作させることができなかった。しかし、その後いくつかの検証を得て動かすことができた。そこで、その検証により得た知見をまとめる。


活動の詳細
1.動作しなかった原因

 動作しなかった原因はリンカスクリプトをプロジェクトに追加していなかったことである。リンカスクリプトは、プログラムのメモリ配置を決めるための記述であり目的の処理内容を特定位置に配置するために重要である。図1.1は今回のサンプルで追加しない場合と追加した場合の比較結果でありメモリ配置が異なっていることがわかる。ちなみに、これはビルド時に生成される.mapファイルの中身を比較したものである。
ただし、今回の場合プログラムの配置に違いは無く、データの配置の違いのみであった。ではなぜデータの配置の違いで正しく動作しなくなるのかというと、PIC18F14K50では、データRAMの一部領域はUSB機能が使用するデータRAM領域と共用のため、その領域に目的データを配置し、目的データ以外は避けるようにリンカスクリプトで指示する必要があるからである。当デバイスのデータシート4ページを見ると、図1.2に共用している旨の記載があり、図1.3ではDPRAMという記述で共用領域が示されている。さらに、リンカスクリプトrm18f14k50.lkrには、

DATABANK NAME=usb2 START=0x200 END=0x2FF PROTECTED

という記述があり、共用領域である0x200~0x2FFまでをusb2という名前で定義してある。これにより、USB機能で使用するデータ以外は配置されないようになっているのである。この状態でビルドすれば、USB機能は正しく動作することになる。図1.1を見返してみると、リンカスクリプトを追加した場合ではオーディオデータのPCとの入出力用バッファReceivedDataBufferおよびToSendDataBufferが0x200~0x2FFに配置されていることがわかる。おそらく追加しないときにはUSB関連のモジュールがこれらのバッファにアクセスできずデータを送受信できなかったのではないかと思われる。


map比較
図1.1 .mapファイルの比較(左がリンカスクリプトを追加しない場合、右が追加した場合。データの配置が異なっている。)

USBと共用
図1.2 USB機能で使用するRAM領域に関する記述(PIC18F14K50のデータシート4ページより抜粋)

DPRAM
図1.3 USB機能で使用するRAM領域に関する記述(PIC18F14K50のデータシート35ページより抜粋)

2.新たに遭遇した問題

 実は、今回1の問題解決を探っている間にビルドがうまくいかない問題に直面したのだが、その原因はコンパイラの使用期限切れで最適化機能が働かずプログラムサイズが大きくなり配置しきれなくなったことであった。そこで、ブートローダを使用する前提で書かれているリンカスクリプトの記述を一部変更しプログラムを配置しきれるようにした。具体的には、『PICで動かすUSB』の103ページ相当の記述である。これによりうまくビルドできた。ちなみに、当書籍はブートローダを使わないならば無駄なのでプログラムを詰めて配置するという理由で変更していて、最適化が働かなくなった場合については触れていない。つまり、書籍どおりの変更をはじめから適用すればビルドはできるが最適化が働かなくなっていることに気づけなかっただろう。


3.コンパイラ使用期限が切れるとブートローダに対応しづらくなる

 ところで、最適化が働かなくなるとどの程度プログラムサイズが大きくなるのかという点が知りたかったので調べようとしたが、残念ながら最適化が働いている状態での実験がすでにできなくなってしまったため調べられなかった。しかし、働かなくなった後のプログラムサイズは.mapファイルのprogram memory usageという部分のパーセンテージで知ることができる。今回のUSBマイクのサンプルでは4kbyte中の77%なので3kbyte強である。
これは実は、ブートローダを使用できないということでもある。なぜなら、ブートローダを使用するには少なくとも1kbyteの空きが必要だからである。つまり、最適化が働かないせいでプログラムサイズが大きくメモリの空き領域が1kbyte以下になってしまう場合には、ブートローダを使用するプログラムは作れないということである。残念かつ当然であるが、無料で使っている以上仕方ないことである。


まとめと今後の課題

  USBによる仮想マイクのサンプルプログラムを正しく動作させることができた。そして、その原因についても検証し明らかにすることができた。しかし、まだまだ動かしていないサンプルプログラムがあるので今後はそちらにもチャレンジしたい。