google-site-verification: google3bd66dd162ef54c7.html

Arduino よもやま話 -3 (予約語の定義はどこ?)

1.まえがき
 Arduino よもやま話、今回は予約語の話です。但し、タイトルには予約語と書きましたが、正確には予約語では無く、Arduino が定義している変数や関数の名前の話です。C言語に限らずプログラム言語における予約語は厳密に定義されています。

 Arduinoでは何も宣言しなくても、CPUのレジスタ名を使った読み書きが出来ます。また、言語リファレンスには書かれていない関数が使えたりします(例えばacosなど)。これらはシステムがあらかじめ宣言(定義)しているようで、ユーザーは何もしないでも使えるので、予約語のように見えます。

 難しいことを考えなくてもプログラムが書けるようにするために、そういう作りになっているのだと思います。でも少し気持ち悪いし、予約語(のように見える単語)の範囲が明確では無い気がします。ということで、どういう仕組みになっているか調べてみます。

2.CPUのレジスタ名の一部
 仕組みを調べる前に、まずは予約語のように見えるCPUのレジスタ名を見てみます。どんなレジスタがあるかはATmega328Pのデーターシートに書いてありますが、下記はその一部です。(mega88日本語レファレンスより抜粋)
ATmega88のレジスタ一覧の一部
 レジスタ名とそのビット位置に全て名前が付いています。まあハードウェアの仕様書なので当然です。でも、驚いたことに、こんなに沢山あるのに Arduino からその名前を呼ぶだけでレジスタの操作(読み書き)が出来ます。下記はタイマーレジスタを読み出した例です。
// CPUのレジスタを読む例
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println(TCNT1L); // TCNT1Lのアドレスは0x85
delay(200);
}
 このプログラムはTCNT1Lの内容を0.2秒間隔でシリアルに出力します。変数であるTCNT1Lの宣言は何もやっていないのに問題無く動きます。つまりこの名前はどこかで定義されています。

3.仕組み
 どうしてこんなことが出来るのか、その理由はコンパイルの前処理でちょっとした細工が行われているためでした。そのあたりは、garretlabさんのArduinoで遊ぶのスケッチのコンパイルプロセスの「ソースコードの変換」の項で詳しく解説されていました。どうも Arduino.h をインクルードするのがポイントのようです。実際に Arduino.h の中身を見てみると、下記のようにいろいろなライブラリがインクルードされています。(下記は Arduino.h の一部を書きだしたものです)
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>

#include <avr/pgmspace.h>
#include <avr/io.h>
#include <avr/interrupt.h>
 ここでいろいろな設定が読み込まれるので、ユーザーは何もしなくても良かったわけです。試しにmath.hの中を見ると、確かにacosの定義が入っています。双曲線関数だって入ってました。CPUのレジスタについては、avr/io.hを経由して、最終的にはiom328p.hが読み込まれ、この中に上の表に書いてあるCPUのIOレジスタ名とアドレスの対応関係が書かれていました。

4.まとめ
 Arduino として動かすための設定は Arduino.h で定義されていました。まあネーミングから考えたら当たり前の話なのですが、これですっきりしました。

 Arduino のリファレンスのどこかに、「変数名には Arduino が使っている名前は使えません」 と書かれていたと思います。それって具体的に何なのよ、とずっと思っていたのですが、Arduino.h から読み出される一連の定義のことでした。

 CPUのレジスタ名として定義されている名前の数はものすごく多いので、たまたま同じ名前を使ってしまう可能性があり、その場合はコンパイルエラーになるはずです。ただ、CPUのレジスタ名は全部大文字が使われているので、キャメルケースなどの小文字がたくさん入る変数名を使うことで、名前が衝突する危険性は回避出来るはずです。ここは、Arduino よもやま話 -2 (変数名の命名方法)の中で少し触れた話です。

 ちなみに、CPUのレジスタ名は、プログラムよりずっと上位の存在なので、これを全部大文字で書くのはすごく納得出来る作法です。
関連記事

コメントの投稿

管理者にだけ表示を許可する

カレンダー
03 | 2018/04 | 05
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 - - - - -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード