マイコン&FPGA開発の流れと開発ツール ―― 組み込みシステム開発の基礎知識(前編)
tag: 組み込み 半導体 ディジタル・デザイン
技術解説 2010年4月19日
4.詳細設計とマイコン開発ツール
マイコン開発では,マイコン内部のCPUや周辺機能の設定を行うため,マイコン独自の処理をコーディングする必要があります.
また,コーディングのルールに関してもマイコン特有の注意が必要です.
●開発言語はC言語が主流
マイコン開発で使用する言語は,かなり以前はマイコンが実行できる機械語と1対1で対応しているアセンブリ言語が主流でした.しかし現在では,Windowsのアプリケーション・ソフトウェア開発にも使用されるC,C++言語が主流になっています.
C言語は,アセンブリ言語に比べ,人間が理解しやすく,移植性に優れている特徴を持ちます.ほかの高級言語と比べると,アセンブリ言語に近い記述ができます.さらに,ソース・コードの中にアセンブリ言語による処理を埋め込むことやアセンブリ言語で記述したソフトウェアとのリンクもできます.このような理由で,マイコン開発の主流となっています.
最近では,C言語をオブジェクト指向プログラミング言語として拡張したC++言語を使用することもあります.
●スタートアップ・ルーチンの作成
マイコンが起動した直後やマイコンがリセットされた直後は,マイコン内部のCPUや周辺機能に対して,開発対象のソフトウェアを正常に実行させるために必要な設定をする必要があります.
この設定をする処理を「スタートアップ・ルーチン」と呼びます.スタートアップ・ルーチンの例をリスト1に示します.
リスト1 スタートアップ・ルーチンの例
(1)変数の初期化
ソフトウェアで扱うデータには,固定の値である「定数」と,値を変更できる「変数」があります.
定数は変更されることがないため,ソフトウェア本体と同じROM領域に書き込まれます.変数はソフトウェアから読み書きができるRAMの領域を使用します.
変数には,「グローバル変数」と「ローカル変数」があります.
グローバル変数は,ソフトウェア全体で有効な変数です.RAMの領域に変数が読み書きする場所を永久的に確保します.
ところでマイコンの起動直後,変数が利用するRAMは,どのような値になっているか分かりません.そこでスタートアップ・ルーチンで,初期化する必要があります.
初期化では,多くの場合は変数の値を0にします.しかし変数の中には0以外の値を初期値とすることがあります.この場合,初期値はROMに書き込まれているので,スタートアップ・ルーチンの中で,RAMに書き込みます.
(2)スタック・ポインタの設定
ローカル変数は,ソフトウェアの一部分の処理(例えばC言語の関数)の中でのみ有効な変数です.グローバル変数と同じように永久的に確保をしてしまうと,RAM領域が無駄に消費されてしまいます.そこで,ローカル変数が有効な間のみRAM領域に変数として確保し,それ以外では解放します.
これを実現するために,「スタック」と呼ばれる仕組みが用いられます.スタックは,後に書き込んだデータが先に読み出されるメモリ構造です(図10).C言語では,関数の引き数や戻り先アドレスのほか,ローカル変数の保持にも使われます.こうすることで,関数が終了した段階で使用したメモリはすべて解放されることになります.
図10 スタック
後に書き込んだデータが先に読み出されるメモリ構造.
スタックを実現するためには,最後に書き込んだデータの位置(アドレス)を保存しておく必要があります.これが「スタック・ポインタ」で,初期値をスタートアップ・ルーチンで設定します.
(3)ハードウェア,CPU内蔵レジスタの初期化
ソフトウェアからの初期化が必要なハードウェアや,マイコンのレジスタの中に初期化が必要なものがあります.これらをスタートアップ・ルーチンで初期化します.
(4)割り込みベクタの設定と割り込み許可
マイコンには,割り込みが発生したときに,割り込み要求に応じた処理を実施する仕組みがあります.このために,割り込み要求と実行すべき処理との関係を示した情報である「割り込みベクタ」をスタートアップ・ルーチンで設定します.
割り込みは必ず使用するわけでありませんし,一部の割り込みだけを使用することもあります.そのため,マイコンには割り込みごとに割り込みを許可する設定ができるようになっています.一般にマイコンが起動した直後は,割り込みを許可しない設定になっているので,割り込みを許可する設定もスタートアップ・ルーチンで行います.
(5)対象ソフトウェアの呼び出し
スタートアップ・ルーチンの最後に,本来の処理を行うソフトウェア(メイン・ルーチン)を呼び出します.
●ソフトウェア・コードの自動生成
スタートアップ・ルーチンで設定する情報や,設定の方法は基本的に決まっています.そして,これらの情報の中には,コンパイラやアセンブラ,リンカでも設定するものがあります.従って,これらのツールが統合された統合開発環境であれば,割り込みなどの一部の情報をGUIベースで設定するだけで,スタートアップ・ルーチンのすべて,もしくはほとんどを自動生成できます(図11).
図11 スタートアップ・ルーチンの自動生成
統合開発環境の場合,割り込みなどの一部の情報をGUIベースで設定するだけで,スタートアップ・ルーチンのすべて,もしくはほとんどを自動生成できる.
また,マイコンの周辺機能(タイマ,インターフェースなど)を制御するソフトウェアである「デバイス・ドライバ」を生成してくれるツールもあります.デバイス・ドライバは,対象デバイスの機能や制御方法を理解して作成する必要があります.自動生成ツールを利用すると,使う目的が明確になっていれば,そのような知識があまりなくても,ソース・コードを自動生成できますので,コーディングの負担を減らすことができます.
ソース・コードを自動生成する機能を持つツールとしては,ルネサス エレクトロニクス(旧NECエレクトロニクス)の「Applilet」や同社(旧ルネサス テクノロジ)の「Peripheral Driver Generator」などがあります.
●コーディング時の注意点
C言語でコーディングをする場合,マイコン開発独自の注意が必要となるケースがあります.
コンパイラは,実行時間やメモリの使用量などを最適化する機能があります.ところがこの最適化によって,コーディング時に意図した動作と異なる動作になってしまう可能性があります.
また,C言語はANSI Cという規格で標準化されていますが,バグにつながる可能性のあるあいまいな記述ができてしまいます.
従って,最適化による影響を考慮したルールや,あいまいな記述をさせないためのルールを決めて,コーディングをする必要があります.
ルールが守られていることを人間がレビューするのは大変です.統合開発環境の中には,問題が発生する可能性がある記述をチェックする機能を持つものがあります.また,自動車業界には「MISRA-C」のように業界標準のルールもあります.
ルールに基づいてソース・コードが記述されていることをチェックするソース・コード・チェッカは,統合開発環境やコンパイラの機能としてあらかじめ含まれていることがあります.また,ルネサス エレクトロニクス(旧ルネサス テクノロジ)の「MISRA-Cルールチェッカ SQMlint」などは,統合開発環境に追加して使用できます.
独立した製品としては,富士通ソフトウェアテクノロジーズの「PGRelief」などがあります.単純なルールのチェックだけでなく,ソース・コードをほかのマイコンへ移植する際に問題が発生する個所のチェックや解析ができます.
●参考・引用*文献
(1)山際 伸一;ソフトウェアの開発環境を知る,マイコン超入門,ディジタル・デザイン・テクノロジ No.3,2009年10月. うちざ・ひろふみ,おおいけ・ひろやす 三栄ハイテックス(株)技術本部 http://www.sanei-hy.co.jp/
(後編へ続く)
うちざ・ひろふみ,おおいけ・ひろやす
三栄ハイテックス(株) 技術本部