Previous: 11.1.1. ISO C99形式 |
Up: 11.1. ファームウェアライブラリでのコード規約 |
Next: 11.1.3. 変数の宣言の仕方のまとめ |
CMSISでは、変数が単なる参照用なのか、それともプログラムが変更を行うものなのかを明示するために、変数を宣言する際にIOタイプ識別子を付けることとなっています。識別子の内容と、実際の定義内容は下表の通りです。
表11?2 IOタイプ識別子
IOタイプ識別子 |
#defineによる 定義内容 |
用法 |
__I |
volatile const |
読み込みのみ |
__O |
volatile |
書き込みのみ |
__IO |
volatile |
読み書き |
コラム11?1 const
C言語でPC用のプログラムを作成している場合に、変数にconst修飾子を付けるかどうかは、単に、定数かどうかということだけを基準にしていることが多いのではないかと思います。よくはありませんが、実際には定数なのに変数として宣言しても、その後その変数を変更しなければ、特段問題は起こりません。 組み込み向けにC言語を利用している場合、const修飾子を付けるかどうかは、単に定数かどうかというだけでなく、その変数を、RAMに割り当てるべきなのか、ROMに割り当てるべきなのかということを考えて決定する必要があります。const修飾子を付けると、もちろんROMに割り当てられます。 後述のマトリックスLEDのプログラムののLEDの表示パターンのようなデータは、サイズが大きい一方で、プログラムの実行中に中身を変更する必要がありません。RAMは容量が小さいですから、あまり大きなデータを割り当ててしまうと、すぐに容量を使い切ってしまいます。そこでconst修飾子を付けて、ROMに割り当てるようにします。 コンパイル後に生成されるマップファイルを見ると、その変数がどの番地に割り当てられているかを確認でき、ROMなのかRAMなのかがわかります(0x08000000台ならROM、0x20000000台ならRAMです)。constを付けたり外したりしてみて、割当場所がどのように変化するか一度確認してみてください。 |
Previous: 11.1.1. ISO C99形式 |
Up: 11.1. ファームウェアライブラリでのコード規約 |
Next: 11.1.3. 変数の宣言の仕方のまとめ |