C言語の勉強にマイコンの開発環境を使う方法


昨今、小学生の授業からプログラミングが開始され、ソフトウェア技術者の育成、養成が小学校から始められています。

将来何に役に立つかなんだか良くわからない事を勉強して、より良い大学に入り、より良い企業に就職するって、私にとってはなんだか違和感があるんですよね。今は「勉強」ができる子が評価され、勉強することは大学に入るためのツールであり、もっと言うと人を選別するためのツールのような気がしてならないんですよ。将来の仕事に明確に必要なこととは言えない勉強で、評価されている気がします。それが今の社会で認められている訳ですが。(それって、いい大学に入れなかったわたしの僻み(ひがみ)ですね。)

でも、プログラミングは、その点はっきりしていて、明確にソフトウェア技術者への道がはっきりしているので、本当にソフトウェアプログラミングをやりたい人が勉強して、その仕事をするっていう実に明快で私は好きです。まさか、これから国公立大学の試験にプログラミングとか採用されていくのかな~。プログラミングに関係ない学部の入学試験で、必須にさせられるのもいやだろうな~

さて、今回はそんなソフトウェアプログラミングを始めてみようと思っている人に向けた記事です。

わたしはC言語を中心に組み込みマイコンをやっている人なので、C言語の勉強に必要な環境準備、構築の話をします。しかも無料で。もちろんPCなどの準備にはお金が必要ですけど。

組み込みマイコン開発環境でC言語の勉強をしてみよう

ソフトウェアプログラミングを始めるために、普通?はGCCなどのコンパイラを使って、ターミナル上でコマンド操作したりして、コードをコンパイル、ビルドして、実行してターミナル上に実行結果が表示されて。。。みたいなことをします。

ここでは、将来マイコンをやってみたいという人や、これから仕事でマイコンのソフトウェア開発を担当するという人のために、はじめからマイコンのソフトウェア開発に使われる統合開発環境を使ってC言語の勉強をはじめる方法を紹介します。

いきなり高度なツールを使っていくことで、効率的にC言語を学ぶことも可能ですし、マイコンのソフトウェア開発にスムーズに移行していけるメリットもあります。

慣れたら、このサイトでも紹介しているマイコンの動かし方や使い方を見て、実際にマイコンを動かしてみてください。最近のマイコンボードはむちゃくちゃ安く入手できるので、趣味でマイコンプログラミングしている人も多くなってきています。

統合開発環境とは?

さて、マイコン開発で使われる統合開発環境とは何か?それは、プログラムを作成するためのテキストエディタや、作成したコードをコンパイルしたり、それを実行するためのターミナル(コンソール)やコードのデバッグができるツールをまとめたソフトウェアだと思ってください。

あるいは、作成したプログラムコードの管理、保存もできるアプリのようなものです。

これがあると、超便利で開発が楽に出来るし、マイコンベンダーから提供されている統合開発環境では、更にチップの構成やクロック設定、ピン配設定なども楽に行えるGUIツールなども付属しています。

さて、さっそくダウンロードして始めてみましょう。

統合開発環境のダウンロード

ここでは、NXP社のマイコン用のMCUXpresso IDEでC言語の勉強をはじめてみる方法を紹介します。MCUXpresso IDEのダウンロードはこちらからダウンロードできます。

MCUXpresso IDEのダウンロード

なぜNXP社か、それは統合開発環境(IDE)を無料で使用できるからです。通常、コンパイルサイズの上限があったり、無料版は30日限定ライセンスだったり、機能が制限されていたりと、有償版でないとなにがしか制限されていることが多いんです。

NXP社のMCUXpresso IDEは完全無料でコードサイズの上限もなくて、すべての機能にフルアクセスできるし使用期限もありません。完全フリーソフトなんです。

使い勝手もよく、巷では使いやすいと評判です。

GCCコンパイラのインストール

PCでC言語をコンパイルするにはGCCというGNU Cコンパイラが必要です。オープンソースのフリーソフトウェアなので、これをインストールします。

ここではWindowsを対象に書いていきます。

GCCを使うには、いくつかの方法がありますが、ここではCygwinを使います。

参考情報:
Cygwinをインストールする際は、「GCC」はもちろん、後でデバッグする際に必要になる「GDB」も一緒にインストールしておきましょう。
Cygwinのダウンロード

インストール方法は、他のサイトでも説明されているので、そちらにお任せします。

ワークスペースの作成

さて、早速プログラミングの環境を構築していきましょう。

まず、プロジェクトなどを置くワークスペースという作業場を作成します。MCUXpresso IDEではワークスペースは、任意の場所にフォルダを作成することで完了です。

ただし、1点注意があります。

ワークスペースのPATHは、基本どこでも構わないのですが、PATHに日本語(全角文字)が入っていたり、スペースが入っているとエラーとなることがあるので、すべて半角文字でスペースは入れないパスにしましょう。 私は、c:/の直下に置いたり、フォルダ名にはすべて英語で作成するようにしています。

MCUXpresso IDEを起動し、最初にワークスペースの選択画面で先ほど作成したフォルダを指定してOKします。

起動するとWelcome画面が表示されますが、画面がタブ表示になっているので、タブの「x」をクリックして閉じます。

Welcome画面
Welcome画面

初めてのプロジェクト作成

統合開発環境では、作成したプログラムコードを管理することができます。そして、その管理下にあるコードをコンパイルしたり、デバッグや実行したりできます。

プログラムを管理するために「プロジェクト」というものから作成していきます。

何らかの目的を達成するための仕事の単位として使われる言葉ですが、ここでの目的はアプリケーション(あるいはマイコンのファームウェア)を開発するための複数のプログラムソースやライブラリ、開発環境の環境設定をまとめたものを「プロジェクト」と呼んでいます。

通常、MCUXpresso IDEでは、一度プロジェクトを作成するとプロジェクト内のソースコードやライブラリのビルドターゲットとの依存関係など自動的に管理されるので、非常に便利です。しかし、MCUXpresso IDEはマイコンを使用することを前提にしているので、作成したプロジェクトやプログラムはマイコン上で動かす必要があります。マイコンを使わずに作成したコードをPC上で動作させたりC言語の勉強に使いたい場合には、すこし工夫が必要です。

注意:マイコンのファームウェア開発ではプロジェクトは自動的に管理され、makefileも自動生成されます。C言語勉強用では自分で一つひとつソースファイルを管理して、makefileファイルに登録する必要があります。

安心してください。

少し面倒ではありますが、自分自身でプロジェクトを管理して、マイコンを使わなくてもプログラムを作成してPC上で実行、デバッグする方法をご紹介します。

プロジェクト作成

MCUXpresso IDEでプログラミングを始めるとき、マイコンのファームウェアでも自分の勉強用でもプロジェクトというソースコードや環境設定など管理を一つにまとめた管理ファイルを作成していきます。

ここでは、C言語勉強用のプロジェクトを作成していきます。

プロジェクトエクスプローラビューから、「Create Project」をクリックして、新しいプロジェクトを作成していきます。

新しいプロジェクトの作成
新しいプロジェクトの作成

次に、プロジェクトのタイプとツールチェインを選択します。タイプは「makefile」プロジェクト、そして「cygwin」のツールチェインを選びます。プロジェクト名をここでは「HelloWorld」としました。

makefileプロジェクトを作成
makefileプロジェクトを作成

helloWorld.cの作成

これで、プロジェクトが作成されました。あとは、ソースコードを書いて、ビルドするためのmakefileを作成するだけです。

ソースコードの追加は、プロジェクトエクスプローラ内に今追加したプロジェクト、HelloWorldプロジェクトを右クリックして、「new」ー「Source」ファイルをクリックしてファイルを追加します。

新しいファイルの追加
新しいファイルの追加
ソースファイル名
ソースファイル名

これで、ソースファイルが追加されました。このファイルにC言語で勉強したいコードを書き込みます。

適当にコードを書いてみます。

main.c
#include <stdio.h>

struct _person {
    char* name;
    int age;
};

int main(void){
struct _person student;
student.name = "Steve";
student.age = 30;

printf("hello %s!\n\r", student.name);
printf("How old are you?!\n\r");
printf("Me? I'm %d.\n\r", student.age);

return 0;
}

makefileの作成

次に ビルドするためのターゲット(実行ファイル)の依存ファイルやインクルードファイルなどを指定して、コンパイルコマンドを実行するように記述します。

makefileファイルは一度作成しておけば、別のプロジェクトを作成したときにそれをコピーして作成すれば良いので、まずは中身がよくわからないけどとりあえず指定するファイル名だけ書き換えておきましょう。

まずは、makefileファイルを追加します。

上述と同様にプロジェクトを右クリックして「new」をクリックします。そして、今度は「File」をクリックしてファイルを追加します。

makefileの追加
makefileの追加
ファイル名をmakefileにする
ファイル名をmakefileにする

makefileファイルに次のように書き込む。このmakefileは、ビルドした後に、生成された実行ファイルを最後に実行して終えています。したがって、ビルドする度にコンソールにprintf出力されるようになっています。

SRC = main.c
TARGET_BASE=main
EXTENTION=.exe
TARGET = ${TARGET_BASE}${EXTENTION}

all: clean default

clean:
	rm -f *.o ; rm -f ${TARGET}

default:
	gcc ${INCLUDE} ${SYMBOL} ${SRC} -g3 -O0 -o ${TARGET}
	./${TARGET}

ビルドと実行

さて、一連の設計が終わりました。

あとは、「ビルド」ボタンをクリックすると、main.cがコンパイルされて実行されることが確認できると思います。

ビルド
ビルド
ビルド結果と実行
ビルド結果と実行

無事ビルドとその実行ファイルが実行されてコンソールにprintf出力されたと思います。

開発したコードがPCで実行された!

本来は、MCUXpresso IDEは、マイコンのファームウェアの開発、そしてそのコードをビルドした後、実行ファイルはマイコン上で実行されます。(これをクロスコンパイルといいます)

今回紹介した方法を使うことで、MCUXpresso IDEでクロスコンパイルせずに直接ホストPC上の実行ファイルを生成・実行することも可能です。

これからC言語を勉強しようと思っている人の勉強用の環境として使用することも可能になっています。

デバッグするには

さて、無事、コードが動作したので、めでたし、めでたしとしたいところですが、いつも書いたコードが正しく動作するとは限りません。

時には、そのコードのデバッグが必要になることもあります。

最後に、MCUXpresso IDEでデバッグする方法を紹介します。

デバッグコンフィギュレーションを追加

デバッグコンフィグの追加
デバッグコンフィグの追加
C/C++ Appのコンフィグを追加
C/C++ Appのコンフィグを追加

最後に、デバッガー設定のみ設定を変更します。Non-Stop Modeをチェックを外します。

Non-Stopモードのチェックを外す
Non-Stopモードのチェックを外す

デバッグ開始

いよいよデバッグが開始されます。

デバッグ開始直後
デバッグ開始した直後

が、しかし、、、

肝心のステップ実行が始まりません。

これは、Cygwinを使ってコンパイル、gdbデバッガーを使用しているので、コンパイルのパスにCソースファイルが見つからないと言われています。

Cygwinが管理するパスと、ファイルシステムにおけるファイルの実際のパスが違うため、このようなエラーが出ています。

なので、「Locate File」をクリックし、Cソースファイルをブラウズして選択してOKしてあげます。

ステップ実行

これで、やっとステップ実行ができるようになり、プログラムコードのデバッグを行うことができます。

ステップ実行ができたところ
ステップ実行ができたところ

コンソールにprintf出力されない!

でも、なんかおかしい。。。

デバッグのコンソール画面に何も出力されない。。。

実は、これはprintfのバッファが原因です。printf関数がバッファリングしているので、バッファされている間は、文字出力がされないんです。

便宜的に、printfにバッファさせずに1文字づつ出力させるようにしてみます。

main関数直後に以下の行を追加するだけです。

int main(void){
  setvbuf(stdout, (char *)NULL, _IONBF, 0);//バッファリングさせない

    struct _person student;
    student.name = "Steve";
    student.age = 30;

    printf("hello %s!\n\r", student.name);
    printf("How old are you?!\n\r");
    printf("Me? I'm %d.\n\r", student.age);

    return 0;
}
コンソール出力できるようになった
コンソール出力できるようになった

これでprintf関数を実行した直後にコンソールに出力されるようになりました。

最後に

今回は、C言語をこれから勉強する人に向けて、マイコンの開発環境であるMCUXpresso IDEを使用したC言語ビルド環境をご紹介しました。

マイコンを動かしてみたいと思っている人は、是非、この方法でまずはC言語から勉強してみてください。そして、いよいよマイコンボードを購入したら、スムーズにマイコン開発をMCUXpresso IDEで行うことができるようになっているはずです。