MY_REGISTER_1
定義した方法を関数に渡すと、そのコピーが送信されるという多くの回答が既に述べています。ただし、マイクロコントローラーでよく使用される実際のソリューションは、他の回答が示唆するものとは異なります。
通常、レジスタは定義したとおりに定義されます。つまり、
#define MY_REGISTER_1 (*(volatile uint8_t *)(0x1B))
#define MY_REGISTER_2 (*(volatile uint8_t *)(0x18))
大丈夫です。ただし、関数によって変更されることが予想される場合は、それらを関数に渡さないように注意する必要があります。このようなレジスタのビット操作を実行する最もクリーンな方法は、マクロを使用することです。例えば:
#define SET_BIT_LOW(reg, n) (reg) &= (uint8_t)~(1 << (n))
#define SET_BIT_HIGH(reg, n) (reg) |= (uint8_t)(1 << (n))
これにより、実際のレジスタが正しく操作されるだけでなく、関数呼び出しを回避できるという追加の利点もあります。これらが関数である場合n
は不明であるため、(比較的) コストのかかる関数呼び出しと同様に、いずれかの方法でシフト操作と非操作を実行する必要があります。n
マクロを使用すると、コンパイラは、 が定数である場合に右側の式を既に計算し、その行を 1 つまたは 2 つの命令で置き換えることができます。