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に割り当てます。

const修飾子変数
めかのとろ

小数点を扱う場合は浮動小数点型を使用します。Cortex-M3搭載のSTM32は演算をソフトウェアで行うので超高速ではありませんが32マイコンですので十分可能です。変数の型は単精度4バイトではfloatを、倍精度8バイトではdoubleを指定します。これらはARM特有ではなく、標準的なものです。

組み込みに特有な部分

めかのとろ

C言語で組み込み特有のものといえば"volatile"修飾子のついた変数を使うことです。

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言語学習におけるモニター出力について