STM32
CMSISに従った変数宣言 †
通常 | CMSIS |
- | signed | long | - | int32_t |
- | signed | short | - | int16_t |
- | signed | char | - | int8_t |
- | signed | long | const | const int32_t |
- | signed | short | const | const int16_t |
- | signed | char | const | const int8_t |
Volatile | signed | long | - | __O int32_t __IO int32_t |
Volatile | signed | short | - | __O int16_t __IO int16_t |
Volatile | signed | char | - | __O int8_t __IO int8_t |
Volatile | signed | long | const | __I int32_t |
Volatile | signed | short | const | __I int16_t |
Volatile | signed | char | const | __I int8_t |
- | unsigned | long | - | uint32_t |
- | unsigned | short | - | uint16_t |
- | unsigned | char | - | uint8_t |
- | unsigned | long | const | const uint32_t |
- | unsigned | short | const | const uint16_t |
- | unsigned | char | const | const uint8_t |
Volatile | unsigned | long | - | __O uint32_t __IO uint32_t |
Volatile | unsigned | short | - | __O uint16_t __IO uint16_t |
Volatile | unsigned | char | - | __O uint8_t __IO uint8_t |
Volatile | unsigned | long | const | __I uint32_t |
Volatile | unsigned | short | const | __I uint16_t |
Volatile | unsigned | char | const | __I uint8_t |
記憶クラス †
auto †
オブジェクトに自動記憶クラスを与える。関数内でのみ使用可。
register †
変数の使用頻度が高いことをコンパイラに知らせる。他はautoと同じ。
static †
オブジェクトに静的な記憶クラスを与える。関数の中でも外でも使用可。
staticな局所変数は定義時に0で初期化される。普通の局所変数のように関数がコールされた時のみ存在するのではなく、永久に存在する。しかし、外部変数とは異なり、他の関数からは利用は出来ない。セットされた値は関数が終了しても保持され、再び関数がコールされた時には前回の値が残っていて、そのまま利用可能。
extern †
オブジェクト用のメモリが他のどこかで定義されていることを示す。
typedef †
型に別名を付ける。構文の便宜上記憶クラス指定子に分類されている。
コラム †
stdint.h内で宣言されている †
int8_t型とchar型はgccでは別の型と見なされるのでstdint.hの修正が必要な場合がある。
IOタイプ識別子 †
- __I volatile const 読み込みのみ
- __O volatile 書き込みのみ
- __IO volatile 読み書き
const †
constを付けるとROMに割り当てられる
Volatile †
- 黙っていると処理系で行われる最適化を防ぐ
例えばプログラム上では変数を変化させる式が無いのにループしている文。プログラムは変化させないが、ハードウェアの状態で変数の内容が変わるのでチェックしているにも関わらず、このままでは最適化されてしまうのでそれを防ぐ。
- 見掛け上冗長な場合の最適化を防ぐ
プログラムとは関係のないマイコンのハードウェアがレジスタの値を書き換えてしまうので,毎回参照することに意味がある場合。
あるデータを「だれが読み書きするか」を考えながらプログラムを作ることが大事。