LPC8xxテンプレート開発時に参考にするサンプルソフトの構造について説明します。
サンプルソフトの構造
RL78/G1xの無償IDEは、CubeSuite+、GUIで周辺回路のパラメタを設定すると、使用分の周辺回路APIが生成される優れものです。詳しくは、コチラの記事 などを参照してください。一方、LPC8xxの無償IDEが、EclipseベースのLPCXpressoです。パソコンへのインストとアクティベーションなどは、トラ技2014年2月号やLPCXpressoサイトを参照してください。LPCXpressoもCubeSuite+と同様、サンプルソフトがIDEに付属しています。
スタートアップ処理とユーザプロジェクト処理
LPCXpressoをインストし、付属サンプルNXP_LPC8xx_SampleCodeBundle.zipをIDEへ展開後、そのソースを読む際のポイントは、サンプルソフトの構造 です。構造の解説文が少ない(見あたらない)ので、説明を加えます(付属LPCXpresso User GuideはIDEの使い方解説書です)。
Blinkyを例に示します。組込みソフトは、 2 つの処理から成ります。「スタートアップ処理」と「ユーザプロジェクト処理」 です。スタートアップ処理は、電源ONで自動的に実行されるResetISR()で、メモリなどの初期設定を行います。次にSystemInit()で、動作クロックなどのシステム関連の設定を行います。その後、ユーザプロジェクト最初の関数main()をコールします。
ユーザプロジェクト処理は、無限ループの前に2関数をコールします。HdwInit()で、使用する周辺回路の初期設定を行い、UserInit()でその他の初期設定を行った後に無限ループします(HdwInit()とUserInit()は、説明の都合上作成した関数名です)。
各関数は、NXP社提供のLPC8xxライブラリと、ARM社提供のCortex-M0+コアライブラリを使っています。またユーザが作成する関数も、これらライブラリを使って作成します。つまり、これらのライブラリが API を提供 しているのです。ライブラリで初めから全てのAPIを提供しているところが、CubeSuite+と違う箇所です。
スタートアップ処理は、全てのサンプルプロジェクトでほぼ共通ですが、ユーザプロジェクト処理は、サンプルにより使う周辺回路が違いますので異なります。普通は、1個のサンプルプロジェクトで、1種類の周辺処理を紹介しますので、無限ループは文字通り簡単な無限ループで終わるものが殆どです。
スタートアップ処理の要は、最低限の動作ができる環境を作成するのが目的 で、ブートストラップと呼ばれるゆえんです。パソコンのBIOSに相当する部分と言えば解り易いでしょうか? IDEのデバッガ動作時には、この部分は飛ばしてメイン関数の入口からデバッグを開始します。つまり、本来は、必要性が無い限り、変更不要と考えても良いでしょう。
ユーザプロジェクト処理も、無限ループ前を「周辺回路の初期設定:HdwInit()」と「その他のユーザ初期設定:UserInit()」に分けて考えると、参考にする部分がより明確になります。HdwInit() は、周辺回路の使い方が同じならそのままコピー利用もできます 。但し、CubeSuite+と違って、LPCXpressoの場合はAPIパラメタで回路動作が変わるので、APIソースを解読する必要もあります。
サイズが大きいプログラムも、結局は無限ループ部分が大きいだけで、構造は同じ です。大きな無限ループ部分の流用性や可読性を上げるために、ファイル分割などの技術を使っているだけです。
テンプレート工夫箇所
この構造が理解できると、サンプルプロジェクトの見通しが良くなります。そして、せっかく提供されているサンプルを上手く利用し、複数処理を実行するには、「無限ループ箇所を工夫すれば良さそうだ」、 ということも判ります。組込み用のリアルタイムOSなども、この工夫の結果できたものと理解しても良いでしょう。但し、リアルタイムOS利用時は、OSの理解や面倒なオーバーヘッドも生じます。販売中のRL78/G1xテンプレート やLPC8xxテンプレート(近日発売予定)は、もっと手軽に複数処理を実現 するものです。