マイコン入門spacer ad
トップページに戻る(マイコン徹底入門:STM32で始めるARM/Cortex-M3組み込み開発)
「マイコン徹底入門」とは? |  「マイコン徹底入門」を読む |  ダウンロード |  掲示板 |  筆者の自己紹介


Previous: 11.1.1. ISO C99形式

Up: 11.1. ファームウェアライブラリでのコード規約

Next: 11.1.3. 変数の宣言の仕方のまとめ


マイコン徹底入門:導入編:オープンソースでCortex-M3/STM32の開発環境を無償構築: 11. ファームウェアライブラリの利用上の規約: 11.1. ファームウェアライブラリでのコード規約:

11.1.2. 変数の属性

 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台ならROM0x20000000台ならRAMです)constを付けたり外したりしてみて、割当場所がどのように変化するか一度確認してみてください。


Previous: 11.1.1. ISO C99形式

Up: 11.1. ファームウェアライブラリでのコード規約

Next: 11.1.3. 変数の宣言の仕方のまとめ


このページはITと知的財産の法律情報「法務ネット」の管理人が制作・運営しています。