マイコンのプログラムは、対象となるマイコンボードで実行する
Q:入門向けのマイコンボードを買ったので、プログラミングの練習を始めました。C言語の教科書を見て、”Hello World!”という有名なプログラムを打ち込んでみたのですが、実行できません。なぜでしょうか。
A:パソコンのプログラミングでは練習用のプログラム例をいろいろ掲載した参考図書がたくさんありますし、その多くはそのまま打ち込めば実行できます。しかし、マイコンだとそうはいきません。いろいろな理由が考えられるのですが、基本的なことから説明していきましょう。
最初に注意すべきことは、開発環境と実行環境の確認です。開発環境はプログラムを作るためのコンピュータ、実行環境はプログラムを実行するコンピュータです。
パソコンのプログラムは、パソコン上で開発し、そのままパソコン上で実行します。すなわち、開発環境も実行環境も同じパソコンです(図1)。ディスプレイやキーボードなどパソコンの資源を使用するプログラムも作れます。
マイコンのプログラムは、開発環境は一般にパソコンを使いますが、実行環境は通常マイコンボードです(図2)。まず、開発ツールが、プログラムを実行させたいマイコンボードに適合していることが必要です。適合しているツールでも、セットアップ時にマイコンの機種を適切に選択しないと、プログラムを作っても動かせないことがあります。
次に、実行環境が問題になります。”Hello World!”のようにディスプレイに文字列を表示するプログラムは、パソコンのようにディスプレイをもつ実行環境で動かすもので、ディスプレイをもたないマイコンボードでは、本来は実行できません。
Q:なるほど。だから、マイコンのプログラミングの練習では、最初にLEDの点灯から始めるのですね。
A:マイコンでディスプレイに文字列を表示する方法が2つあります。1つの方法は、開発環境に依存します。パソコンのディスプレイをマイコンボードのディスプレイのように見立てて文字列を表示する方法です。
もともとC言語というのは、大型コンピュータからパソコンまでさまざまなコンピュータで使用できるように作られています。その上で、操作のためのコンソール(ディスプレイとキーボードなど)と、コンソールとの入出力をサポートしてくれるOSが存在することを前提にしています。そして、コンピュータやOSが違ってもC言語から同じように扱えるように、標準入出力関数が幾つも用意されています。例えば、標準出力関数のprintf()やputchar()、標準入力関数のscanf()やgetchar()が代表的なものです。
Q:C言語の教科書の最初の方に出ていますね。
A:このような標準関数はC言語の規格で決まっているので、マイコンボード用の開発ツール(Cコンパイラ)でもサポートしているものが多いのです。例えば、テキサス・インスツルメンツ(TI)が提供している開発ツール「CCS(Code Composer Studio)」でもC言語の標準関数をサポートしています。
マイコンボード自体には通常、ディスプレイやキーボードが付いていないので、デバッグ時だけ、開発環境のディスプレイやキーボードをコンソールとして実行できるようになっています*1)。標準入出力関数を利用するためには、パソコンのプログラムと同じように、プログラムの最初のところに次の1行を書くことが必要です。
#include <stdio.h>
開発ツールによってはセットアップの設定変更が必要な場合があるので注意してください。
*1) デバッグ作業時に変数の内容を表示するなどの用途に、printf()は便利な関数なので、実用的な見地からもこのようになっています。ただし、最近はデバッガがとても高機能になっているので、わざわざデバッグにprintf()を利用することが少なくなっています。
Q:もう1つの方法というのは何ですか。
A:もう1つは、マイコンボードに本当にディスプレイを付けてしまう方法です。文字だけを表示する簡単なディスプレイも使えます。ただし、この場合は開発ツールの標準ライブラリ関数は使えません。printf()やputchar()などの関数自体を自分で作ることが必要です。かなりハードルが高いですね。
Q:それは難しそうなので、開発環境のディスプレイに"Hello World!"を表示できるようにしたいです。
プログラムを書くときの注意
A:次に、プログラムを書くときの注意点が幾つかあります。
マイコンボードを使って、しかも標準入出力関数を利用したプログラムを書くときは、マイコン用の書き方と一般のC言語の書き方の両方に合わせることが必要です。プログラムはマイコンボード上で実行されるので、まずマイコンがちゃんと動いてくれないと話になりません。
例えばTIの超低消費電力マイコンMSP430™ファミリのプログラミングでは、マイコンをスタートさせるための命令が必要です。知っていますか。
Q:メインルーチンの最初に、何か書かないといけないのでしたね。
A:MSP430ファミリでは、マイコンが暴走しないように監視するウォッチドッグタイマという機能が入っていて、産業機器のように高信頼性が要求されるシステムを簡単に構築できるようになっています。ウォッチドッグタイマをちゃんと使いこなすのは大変なので、プログラミングの練習では、このウォッチドッグタイマの監視機能を最初にオフにしてしまうのが一般的です。main()関数の最初に、次の1行を必ず書きます。これは、お約束ですね。
WDTCTL = WDTPW + WDTHOLD;
それから、標準入出力関数を使うときのお約束として、関数の決まりごとを記したヘッダファイルを読み込む記述も必要です。こちらは、main()関数よりも上に書きます。
MSP430 LaunchPadの場合なら、最小限、次のように記述すれば、”Hello World!”のプログラムを実行できます。
include <msp430g2553.h> include <stdio.h> main() { WDTCTL = WDTPW + WDTHOLD; printf("Hello World!\n"); return 0; }
Q:C言語の教科書に書いてあるプログラムのうち、マイコンボードで直接実行できないのは標準入出力関数を使うプログラムだけですか。
A:他にも、実行環境の違いが問題になるプログラムは幾つもあります。特に注意が必要なのは、大きなサイズの配列を使うようなプログラムです。パソコンはメモリ容量が大きいので、配列でも構造体でも大きなサイズのものを作ることができますが、マイコンのメモリ(特に、リード/ライト可能なSRAM)はごく小容量なので、メモリ不足でエラーになってしまいます。
【関連リンク】
- MSP432 低消費+高性能マイコン
- MSP430 超低消費電力マイコン・ファミリ
- MSP430 LaunchPadバリュー・ライン開発キット
- 新FRAMマイコン:「MSP430FR6972」
- 産業用マイコン:「MSP430I2040」
- TIのマイコン製品の詳細
- 便利なツールの購入はこちらから:TI store
※MSP430、MSP432はTexas Instruments Incorporatedの商標です。その他すべての商標および登録商標はそれぞれの所有者に帰属します。
提供:日本テキサス・インスツルメンツ株式会社
アイティメディア営業企画/制作:EDN Japan 編集部/掲載内容有効期限:2016年3月31日
Copyright © ITmedia, Inc. All Rights Reserved.