まず最初に。MTM06では多くの方にご来訪いただき、ありがとうございます。次回はもうちょっと何とかしますので宜しくお願いします(ちなみにMTM06レポートも既に完成しているのですが、現在チェック中ですので、もう少しお待ちを)。

ということで以下本題。MCUのデメリットは? というとこれまた一杯ある。

  • 開発環境は別途: MCU単体で開発・実行を行うことはまず不可能(CPUパワー・メモリ容量・etcで制約が大きすぎる)なので、WindowsやMac、LinuxなどのいわゆるPCを別に用意、ここで開発作業を行い、プログラムをMCU側にダウンロードする形になる。
  • デバッグが面倒: これは次の項目とも絡むのだが、PCの上だと例えばステップ動作(命令を1命令づつ進めながら、その時にどんな事が起きているかを確認する)とかブレーク(プログラムのある時点に到達した、あるいはプログラム中のある変数が書き換わったら動作を止める)、ウォッチ(プログラムのある場所をどう通過したか確認する、あるいはある変数の値を継続的に監視する)といった事がデバッガで簡単に実施できる。ところがMCU単体でこれを行うのは極めて難しい。
  • 開発環境が高価: これは前項と絡む。デバッグできません、で済ませるわけにはいかないので、どうするかというとICE(In Circuit Emulator)を使ったり、あるいはJTAG(Joint Test Action Group)経由でデバッガを繋いだり、という方法が取られる。これはもう少しちゃんと説明が必要であろう。まずICEであるが、例えば図1の様にMCUを搭載したボードを作ってデバッグ中だと、プログラムのデバッグだけでなくボード自体のデバッグも必要になるわけだが、その場合は単にプログラムの動作だけでなくI/Oポートの監視とかメモリの監視など、様々な機能が必要になってくる。ところがMCUそのものはそんな機能が無い(というか、そんな機能を搭載していたらえらく高価になってしまうし小さく収まらない)。そこで、MCUと全く同じ動作をしてくれるハードウェアのエミュレータを作り、これを図2の様にMCUと差し替えてボードに装着するというものだ。ICE本体は横に結構な大きさ(これは昔は弁当箱などと呼ばれていたが、その後縦型の製品も出てきたりしたので今ではあまり言われなくなった)で、そこからケーブル経由でターゲットのMCUと同じパッケージ形状のプローブが出ており、これをボードに装着するというものだ。ICE本体はMCUの動作を完全エミュレートするので、プログラムの動作のみならずI/Oなどの様子も全部監視することが可能で、効果的に開発が進むというものである。ただ言うまでもなくこのICEは高価である。汎用のものはお値段が数十万~、MCUメーカーが自社製品専用に出しているものでも数万のオーダーだったりするから、個人用途で利用するのにはまるで向いていない。
    一方のJTAGは? というとこれはもともと実装後のテストに考案されたものである。パッケージが小型化されたり、あるいはBGAなどを利用するようになると、一度基板の上にMCUを実装してしまうと後からピンにプローブを当てて検査するというのが非常に難しい(場合によっては不可能)ため、完成検査が出来なくなってしまう。これに対応するため、MCU内の各回路ブロック毎にテスト回路を細かく入れ、これをディジーチェーン式に繋ぎ、まとめて外部からアクセスできるようにして、完成後にこのポートにテスト機材を繋いで内部確認が出来る仕組みを作った(図3)。この仕組みがJTAGと呼ばれるもので、1990年にはIEEE1149.1として標準化されている。
    さて、もともとのJTAGはこの仕組みを使って、各回路ブロックの内部状態を読み出せるというだけのものだったが、折角あるのだからこれをデバッグに使おうというアイディアが出てきた。これが通常JTAG ICEなどと呼ばれるもので、JTAGポート経由でICE的な動作をさせられるというものだ。通信のスピードがICEほどには高くないこともあり、なのでリアルタイムの処理には向かないとか機能面で制約があるといった問題はあるにせよ、本来のICEよりは遥かに安価に利用できるようになった。といっても数十万が数万、あるいは数万が数千円に落ちた程度で、やはりデバッグ環境がやや高価であることそのものは変わらないのだが。

図1

図2

図3

  • 単体では基本的に何も無い: PCだったら当たり前の様に外部ストレージが利用できるし、ファイルシステムもある。画面表示もコンソールが使えるし、マウスとGUIもある。こうしたものは当たり前だがMCUには一切ない。必要ならば自分でそれを接続し、しかも利用できるようにするためのプログラムも書かなければいけない。勿論前回も紹介したとおりメーカーからライブラリなどで提供されるケースが多いので、完全に自分だけで全部作る必要はないのだが、そうしたものの組み込みは自分の仕事である。
  • ハードウェアを理解する必要がある: 簡単なサンプルならばそれほど考えずにプログラミング可能だが、ある程度凝ったことをしようとすると、例えばA/Dのサンプリング周期とか解像度、あるいはPWMの利用できる周波数などの制限を理解し、またそれらを利用するためのレジスタ操作などは勿論理解していないと話にならない。これらは何れもマニュアルで提供されるものなので、まぁ読んで理解すればいいといえばその通りなのだが、APIだけ理解していればプログラミングが出来るPCとは全く異なる世界である。
  • リソース制限がきつい: 当たり前だが、潤沢にメモリが使えるわけではない。最近は大分増えてきたが、昔はSRAMが256Bytes(考えずにlongの変数を64個取ると、それで満杯になるレベル。実際はスタックとかもあるから、もっと制約は厳しい)とか、Flash Memoryが4KB(コンパイラで最適化が甘いとか、ライブラリを色々リンクしたりすると、あっという間にプログラムが収まらなくなる)なんて製品も珍しくなかった(今でも低価格品にはこうしたものがある)から、こうした事に気をつけてプログラミングを心がける必要がある

というあたりはぱっと思いつく部分だ。

(続く)