ARMマイコンと組み込みプログラミングにおけるC言語のツボ
C言語はやさしい!?
今の世の中ではさまざまなプログラミング言語が存在しています。その中でC言語は比較的歴史が長いのですが、廃れることなくいまでも組み込みでの開発言語として現役で使用されています。
他のプログラム言語に比べて、コードが軽くリアルタイムの制御に向いているなどの利点に加え、歴史が長い分、これまでの資産が豊富にあることもいまでの現役である理由でしょう。
ARMマイコンにはC言語は必須です。総合開発環境にもC言語やC++が標準です。C言語の歴史は古い分、成熟したプログラム言語でそれだけ書籍も豊富で自分にあったものも見つけやすいでしょう。抽象的なプログラミングだけの学習ではなく、マイコンを操作しながらの具体的に学習であれば独学でも短期間で習得できるでしょう。
C言語に限らずどの言語でも文法上の最低限のルールや言語開発環境ツールに一度慣れるとあとは独学でもどんどん学習をすすめていけるものです。はじめのきっかけの一歩をどうするかが問題なわけですが、このサイトではできるだけ早い段階で組み込み開発の環境でマイコンとC言語の学習を同時に行うことをおすすめします。
C言語はプログラミング言語のなかでも古典的な分類にはいるわけですが、その分、文法的なクセに慣れさえすれば、例えばWindowsアプリ開発プログラム言語のC#に比べて最新の知識やオブジェクト指向プログラミングをあえて意識する必要はないためむしろ単純ですっきりしていると思います。
C言語は高級言語ではあるのですが、汎用言語なのでなんでもかんでも既成の便利関数が用意されているわけでもなく、基本的な標準関数を利用してちょっとした機能を自作の関数という概念で作り上げていくことでスキルアップしてくこともC言語の醍醐味です。
C言語らしい構造のプログラミングをはじめから意識する必要はまったくなく、初心者のうちは演算子と制御文の組み合わせだけの記述で動作するのであればそれいいと思います。ただし、変数関連の概念(ローカル変数、グローバル変数、static修飾子等)は最重要で初心者のうちからしっかり学習しておいてください。
C言語特有のポインタ、構造体および共用体といったものを駆使した複雑なプログラミングはさておき、基本演算(四則、論理、ビット演算等)や制御構造(ifやswitch文)といった基礎的なプログラムであればある程度使いこなせるようになるまではそんなに時間はかからないでしょう。マイコンで特に大事なところはデジタル値を扱うための演算子を使いこなすところですので、このあたりは重点的に理解しておいたほうがよいでしょう。そう割り切ってC言語と付き合うと、むしろやさしい分類にはいるのではないでしょうか。
慣れてくるにしたがって、文字列を自由に扱うなどより高度なことに挑戦したくなるので、その段階になってポインタや構造体などを意識してC言語らしいプログラミングを求めればよいのではないでしょうか。
C言語は奥が深いのでいくらでも難解なものにはできますがそれは実用的に好ましくはありません。
まずは自分が見やすく整理されたプログラミングを心がければいいと思います。
CMSISインターフェース規格に準じた仕様
一言でC言語といっても、言語の文法は共通なのですが、組み込みで使用するものはマイコンの仕様により多少異なりますので合わせる必要があります。言葉でいえば方言のようなものです。
方言のなかでも仕様が異なるのは変数の宣言の仕方のところくらいのものです。STM32マイコンのコンパイラはARM社が定めたCortex-Mシリーズで標準化されたCMSISインターフェース規格に準じています。
変数の中でも定数の場合はconst修飾子のついた変数として宣言します。組み込みの場合はROMに配置されますので、値の変更はできなくなります。値の変更する必要のない変数は定数としてRAM節約のためにconst修飾子をつけてROMに割り当てます。
小数点を扱う場合は浮動小数点型を使用します。Cortex-M3搭載のSTM32は演算をソフトウェアで行うので超高速ではありませんが32マイコンですので十分可能です。変数の型は単精度4バイトではfloatを、倍精度8バイトではdoubleを指定します。これらはARM特有ではなく、標準的なものです。
組み込みに特有な部分
C言語で組み込み特有のものといえば"volatile"修飾子のついた変数を使うことです。
volatile修飾子をつけて変数を宣言するとコンパイル時に最適化を抑止します。組み込み系では下記の例のように変数はCPUが常に関わっているものばかりではありません。
- 値の変化をプログラム(CPU)が予測できない変数
- 割り込みなどで値が変わりうる変数
- ハードウェアと密接に関わっていてCPUとは無関係に更新される変数
コンパイル時に最適化されると、コード自体は無駄を削られたり処理速度が向上するのですが組み込み系特有の変数でCPUとは関連なしにハードウェアと密接に関わっている変数などは最適化により想定外の動作をしてバグを発生させることがあります。
このため、変数により"volatile"修飾子をつけて宣言してコンパイル時に最適化させないようにします。ARM系コアでは修飾子として "__IO"をつけます。
アプリケーションで割り込み処理内で使用する変数、周辺機能(ペリフェラル)により処理される変数は修飾子"__IO"をつけて"volatile"変数として宣言しておきます。
まとめ
この章ではマイコンの開発プログラミングに必須なC言語について解説してきました。プログラマーの間ではC言語は難易度が高く、敬遠されがちなところもあるようですが、プログラミング言語としてC言語そのものが難しいのではなく、初心者には難しい側面があるだけです。
組み込み初心者としては、比較的単純な構造のプログラミングでマイコンを操作することで慣れていくことをおすすめします。C言語特有の難解な概念のものは後回しにして、基本の演算や制御を操作しながら、変数の概念をしっかりおさえることが上達のツボであることを解説しています。
ARMマイコンの開発するC言語の仕様はARMの規格にしたがっており、変数表記が汎用C言語と多少異なりますが、違いはその部分だけです。
C言語の兄貴分の言語として、オブジェクト指向に対応したC++がありますが、プログラミングに慣れていないうちはC言語から始めることをお勧めします。オブジェクト指向の考え方自体は重要なのですが、慣れないうちにオブジェクト指向から入ると抽象的なため本来の目的を見失ってしまう恐れがあります。まずは、組み込みプログラミングというものに慣れて、ゆとりがあれば次のステップでオブジェクト指向のC++に挑戦してみればよいでしょう。
教材ボードを使用したクロス環境でのC言語学習方法について
C言語学習におけるモニター出力について