組み込みプログラミング 初めの一歩

「何を作りたいか。それが重要だ。」

森下功啓製作所 ONLINE

[編集方針]
このページは、マイコンのプログラミングを始めるにあたって必要となる基礎事項を簡単にまとめ、初心者が本を参照するためのヒントを提供します。
できる限り自分がマイコンを始めた頃のことを思い出しながら書いていますが、初心者の心はとっくに忘れていますので何かリクエストや質問があれば気軽にメールでお問い合わせください。
e-mail: morimori.ynct@gmail.com(@を半角にして下さい。)
[2013/5/4 更新] 少しだけ追記しました。


1. はじめに

1.1 本ページの内容

マイコンのプログラミングはビット演算やアドレス指定での変数処理が簡単に行えるC言語やC++が普通です。 C言語は大抵の工学系高専/大学で教えられていますので制御構文はよく知られていますが、数値計算やビット演算はそうでもありません。 マイコン初心者の間でマイナーな項目について以下で解説します。

1.2 “プログラミングの勉強”をC言語で始めるのはやめよう マイコンをいじる必要があるなら仕方なし

ちなみに、プログラミングの勉強をC言語でするのはよした方が良いです。 C言語は“おまじない”と呼ばれる約束事が導入から必要になるため、プログラミングに対する理解が遠回りになります。 初心者は“変数”や“関数”の概念と動く仕組みを理解するのに一苦労するはずです。 “プログラミング”を勉強したいのであれば、初めに覚える必要のあるルールが少ないPythonやRubyが適当だと思います。 教える側からしても、導入部分で関数を用いずに教えられるので教え易いですし。 ちなみに、機械系ならPython、情報系でWEB系SEを目指すならRuby・・・かな。 ただしPythonとRubyを比べると、断然Pythonの方が教えやすいし学びやすいし工学的に応用が利きます。

1.3 プログラムが書けるようになるまでにかかる時間

Cのコードを書けるようになるまでの長さは、私の場合でプログラミングの“プ”も知らなかった状態から毎日練習して3カ月間ほどです。 さらに、マイコンのプログラムを上手く書けるようになるまでにはさらに1年以上を要しました。 まぁ今ならデバッグ機能付きの便利なIDEが色々とありますので、そんなに苦労しないかもしれません。

1.4 オブジェクト指向には、マイコン初心者は触れない方が良い

「オブジェクト指向」はマイコン初心者は触れない方が良いでしょう。 頭が混乱すると思います。 「オブジェクト指向」というプログラミング上のテクニックは、C++ならば利用が可能ですがC言語では実践不可能だと思ってください。 たまに「C言語の構造体に関数ポインタをくっつけて関数を利用できるようにしたもの」を「クラス」として教えていることがあるようですが、全く違います。 「カプセル化」や「多様性」の概念なしにオブジェクト指向は語れません。 「オブジェクト指向」を理解したい又は利用したいのならば、JavaScriptやPythonを使ったプログラム開発から始めたほうが良いでしょう。 その上で、C#やC++で「オブジェクト指向」を利用した方が賢明です。 C言語からC++へ移ってオブジェクト指向を学ぼうとしても最初の半年から数年間はゴミコードを書く羽目になります。

ただし、オブジェクト指向をマスターしてC++を使いこなせられるようになればかなりスマートなプログラムを書くことができます。 ArduinoというマイコンプラットフォームのAPIがほぼ全てC++で記述されていることからしても分かると思います。 C++は便利だし、メンテナンス性が良いし、ソースコードの再利用性が高いという魅力があります。 が、それも全ては「オブジェクト指向」を理解できれば・・・というお話です。 壁の向こうは蜜の味とだけ記しておきます(笑)。


2. プログラムの基本要素とプログラミングの壁

2.1 プログラミング基本要素

世の中には様々なプログラミング言語がありますが、どれも基本的な要素は同じです。 すなわち、「変数」「条件分岐」「繰り返し処理」「関数(メソッド)」です。 これらはそれぞれ、状態や数字を記憶する,ifによる条件分岐,forによる繰り返し処理,機能の塊としての関数です。 なお、関数を定義しなくともよい言語はたくさんありますが、C言語は関数が必須となっています。 関数が必須ではない言語でもある程度の規模になると関数が必要となってきます。 なぜなら、人間の頭がプログラムを理解するためには一連の流れのひと塊を役割で理解する必要があるからです。

2.2 プログラミングの最初の壁

プログラミング初心者が直面する壁としてはまずは「変数」という概念でしょう。 「数字を記憶させるのに記号を使うという習慣」を身に着けるには長い時間が必要です。 おまけに、変数には覚えさせる概念別に「型」があるというのも初心者にはわかり辛いものです。 C言語なら、「整数ならcharまたはintまたはlong」「小数点を使いたいならfloatまたはdouble」「2値の状態値ならboolまたはboolean」ですが、この違いはCPUのタイプや必要なメモリサイズによっても変わるため実践がなければ実感がわきません。

2.3 こんな人はプログラミングをあきらめた方が良い

ところで、プログラミングが不可能な人が一定割合で確実に存在します。 例えば、forやifの意味は理解できても書くことはほぼできない・・・状態を1ヶ月以上続けるような方です。 この様な人は、フローチャートも書けません。 物事を切り分けて順序立てて(自分に)説明することが難しいために、プログラムが書けないのです。 工学部の学生であっても一定の割合で存在します。 決して人間的に劣っているわけではなく理系脳でないというだけです。 もし、工学部の学生さんの中に自分が当てはまるという人が居たら、転科を勧めます。 高専で情報系なら留年の後に退学する可能性すらあります。


3. プログラミングの流れ

プログラミングは図3.1の流れになっています。

[工事中]

4. C言語プログラミングの基本モデル

マイコン開発におけるC言語のプログラムは図4.1に示すように、大きく8つの部分から成り立っています。 以下にそれぞれについて説明していきます。

コメント部
/*************************************************
program.c
プログラムの名前や概要を書きます。
I/Oポートマップや、メモ、改定記録があると便利です。
ちなみに、このフィールドの様に/**/(本当は半角)があるとこの間はコメントとみなされます。
また、// は書かれている行に限り、以降がコメントとみなされます。
**************************************************/
パッケージ呼び出し部
#include<io.h>        // 必要なヘッダファイルをインクルード(コンパイル時に、ここに.hファイルの中身が貼り付けられる)します。コンパイラはIDEに設定されたフォルダを走査します。
#include"local.h"     // "マークは、コンパイラに対してローカル(普通はこのプログラムファイルと同じフォルダ)を先に走査するように指示するマークです。
マクロ宣言部
#define ADMAX 32767   // コンパイラに対する置換命令です。この場合、これより以下にADMAXという文字列があればコンパイラがコンパイルの直前に32767に置換します。
グローバル変数宣言部
int global_i;         // 関数の外で宣言された変数はグローバル変数といって、同じファイル中にある全ての関数からアクセスできる変数となります。行の最後には;を付けます。
ハードウェア設定部
/// ハードウェアの初期化(関数名は任意だが、InitとかSetupとか分かり易い名前以外は避けた方が良い)
void Init(void){
  IO.PORTB = 0xff; // マイコンが所望の動作を行うように、各種レジスタに値をセットする。レジスタ名は開発環境によって異なるので個別の説明書(又はソースコード)を読む必要がある。
  return;          // returnでこの関数の呼び出し元に戻る。
}
その他の関数部
/// 様々な関数
void Hoge(void){
  hogehoge();
  return;
}
割り込み処理部
/// 割り込み処理(割り込み処理用の関数名は開発環境によって異なります。これも説明書かソースコードを読まないと分かりません。)
void int_ad (void)              // ここでは、H8マイコンのA/D変換割り込みの例を示します。
{
  AD.ADCSR.BIT.ADF = 0;         // レジスタを操作して、割り込み要因をクリア
  global_i = ADMAX;             // 任意の処理を行う                          
}
メイン関数部
/// メイン関数(普通は、ソースコードの中で一番下にある必要がある)
int main(void){ // 型を表すintの部分は、voidの場合もある
  int i;        // main関数内で使用する変数を宣言

  (void)Init(); // ハードウェアの初期設定
  i = 1;        // 値の代入
				
  for(;;);      // マイコンのプログラムは終わらせないので無限ループになる制御構文を付け足しておく
}
図4.1 C言語プログラムの基本モデル

なお、ハードウェア設定部とその他の関数部とは順不同ですが、ある一定の順番に決めた方が分かり易いです。 また、ソースコードには字下げがあると非常に読みやすくなります。 面倒臭がらずにコメントと合わせて字下げをしましょう。

良くやりがちなミスは、コード中に全角のスペースを入れてしまうことです。 世の中にある多くのコンパイラは、コメント中の日本語には対応していますが、コード中の日本語には対応できません。 どこもおかしくなさそうなのにコンパイルエラーが出たら、空白を全てチェックしてみて下さい。

ちなみに、関数は
返値の型 関数名(引数){
	
} // {}によってスコープ(影響の及ぶ範囲)を表す
図4.2 関数

で表します。 名前は全て半角ローマ字です。

5. ここを押さえよう

マイコンのプログラミングをC言語で実施するに当たって必要となる基本項目を書き並べました。 ポインタ以下の項目は少し難しい内容になりますが、知っていれば応用が利くという項目です。 なお、voidの意味や、ifやwhileやforなどの制御構文や、論理演算子はよく知られていますので省略しています。


6. 詳細

[工事中]

表6.1 キーワードとその概要
項目 概要
#include
#define
変数の型
2項演算子(+ * /)と演算規則
ビット演算子(& | << >> ~ ^)
数値の表し方(10進数 2進数 16進数)
関数/サブルーチンによる機能のブロック化
レジスタ(これはマイコン独特だと思う)
ポインタ
構造体とビットフィールド
共用体を使ったバイナリデータストリーム

7. 最期に

このページで解説したのはC言語というプログラミングの基礎知識に関するものです。 マイコンのプログラムには「割り込み」や「ポインタ」が必須であり、この概念を理解して書式を習得する必要があります。 また、C++での開発ともなれば「クラス」の概念と書式の習得が必要です。 プログラミング関係の書籍をたくさん購入して勉強してください♣

プログラミング技術の習得に近道はありません。 英語と同じで書いたコード行数に比例して技術力は上がっていきます。 地道な努力を惜しまないよーに。

inserted by FC2 system