マイコンとプロセッサでのソフト開発の違い:マイクロプロセッサQ&Aハンドブック(7)(4/5 ページ)
マイクロプロセッサ(MPU)を使用したボードを開発するユーザーが抱えるさまざまな悩みに対し、マイクロプロセッサメーカーのエンジニアが回答していく連載。今回は、「マイコンとプロセッサでのソフト開発の違い」について紹介します。
ソフト実装方法の違い:MMUによるカーネル/ユーザー空間の分離
マイコンはベアメタル(OSなし)やRTOSが中心で、プロトコルスタックや表示ライブラリはサードパーティーから購入し、OSや開発環境も有償なことが多いです。マイクロプロセッサでの開発は、OSはLinuxやAndroidなどの汎用OSが中心で、プロトコルスタックや表示ライブラリは無償のものが多いです。
マイクロプロセッサでの開発エコシステムは、MMUによってハードウェアの制御とアプリケーションの分離が可能なため、移植性が高い構造になっています。
例えば、LinuxではユーザーソフトウェアとデバイスドライバはMMUによってアドレス空間が分断されています。一方、ベアメタル/RTOS のハードウェア制御モデルでは、ユーザーソフトウェアとデバイスドライバはソフトウェア設計上の取り決めにより分離されているだけで、ユーザーソフトウェアとデバイスドライバのアドレス空間は分断されていません。
ソフト実装方法の違いからくる問題の事例
ソフト実装方法の違いからくる問題の事例として多いのは、マイコンで行っていたような外部ハードウェアの制御を行いたいが、組み込みLinuxでの実現方法が分からない、というケースです。ここではユーザーアプリケーションから外部ハードウェアの制御をGPIOで行う場合について紹介します。
具体例
ユーザーアプリケーションからGPIOのオン/オフやGPIOの変化を割り込みで受信するプログラムを作成したいのですが、直接GPIOのピン制御レジスタにアクセスできず、方法が分かりません。
問題点
ハードウェアを操作するためには、GPIOなどの周辺ペリフェラルのレジスタの物理アドレスを指定して、データの読み書きをする必要がありますが、ユーザープログラムからは該当アドレスを指定してもデータの読み書きはできません。割り込みに関しても、ユーザープログラムが直接、割り込み要因から呼び出されることはありません。
原因
GPIOなどの周辺ペリフェラルのレジスタの物理アドレスを指定してデータの読み書きが可能なのは、カーネルに限られるため、カーネルドライバを作成する必要があります。また、カーネルドライバでも、対象ペリフェラルのレジスタを直接、読み書きすることはせず、GPIOや割り込みなどハードウェア固有のリソースはデバイスツリーでデバイスドライバとの関連を記載する必要があります。
問題発生に至る背景
Linuxのような汎用OSを使用する場合、ハードウェア固有部分とユーザープログラム部分は分断されており、ハードウェア固有部分はデバイスドライバの作成が必要という認識がないと、ユーザープログラムのみでハードウェアの制御を実現しようと考えてしまいます。また、オープンソースソフトウェアはソフトウェアAPIの挙動を理解するには、開発の際にドキュメントを読むだけではなく、該当部分のソースコードを読む必要があります。
対策例
ソフト設計の際には、まず、デバイスドライバとユーザープログラムとでどのように役割分担するか、基本的なブロック図を作成することで、問題が見通しやすくなります。また、組み込みLinuxの開発では、最小限の機能のデバイスドライバの実装を通して、デバイスドライバとデバイスツリーの概要を理解することが重要です。
組み込みLinuxの開発においては、デバイスツリーを理解することが必須となります。STマイクロエレクトロニクスでは各種ペリフェラルのデバイスツリーの設定例や解説をSTM32MPU Wikiに掲載しています。デバイスツリーの設定に対して、詳細なドキュメントを提供している半導体ベンダーの製品を使用すると、開発でつまずくことが少なくなり、効率的に開発を進めることが可能になります。
Copyright © ITmedia, Inc. All Rights Reserved.