我正在努力改进我的嵌入式编码实践。下面的代码将值0写入内存位置0x80001000
。
#define MemoryWrite(A,V) *(volatile unsigned long*)(A)=(V)
#define FLAG 2147487744 //0x80001000
uint32_t reset_value = 0;
int main(void)
{
MemoryWrite(FLAG, reset_value);
return 0;
}
我有两个问题:
为了使用
MemoryWrite
宏,我必须将0x80001000
转换为2147487744
。我认为这使得代码不清晰。是否有一种方法,我可以做到这一点,只是使用十六进制值?我将
reset_value
定义为uint32_t
。如果我用#define
,会有什么变化呢?
为了使用MemoryWrite宏,我必须将
0x80001000
转换为2147487744
。我认为这是不好的做法,而且不明确。是否有一种方法,我可以做到这一点,只是使用十六进制值?
#define FLAG 0x80001000u
当unsigned
的u
不存在时,因为您在32位机器上有4个字节,编译器假设该值为signed and0x80001000 = -2147479552
- 我不确定是否将
reset_value
定义为uint32_t
是好的做法。我可以这样做作为一个#define
。
你当然可以写#define RESET_VALUE 0
。但在如此简单的代码中,其实用性并不明显。这取决于您将来是否要修改该值。对于这个10行的例子,编译器肯定会以同样的方式优化它。
你可以这样做,
#define FLAG 0x80001000ULL
...
MemoryWrite(FLAG, 0);