比较 if 语句中的指针值
Comparing pointer values in if statement
4为什么这个块会抛出内存错误:
uint8_t buffer[ 8 ] = { 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 };
if ( *((uint32_t *)(&buffer[ 0 ])) == *((uint32_t *)(&buffer[ 4 ])) + 1 )
return TRUE;
虽然此块有效:
uint8_t buffer[ 8 ] = { 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 };
uint32_t comp1 = *((uint32_t *)(&buffer[ 0 ]));
uint32_t comp2 = *((uint32_t *)(&buffer[ 4 ]));
if ( comp1 == comp2 + 1 )
return TRUE;
问题可能出在缓冲区的对齐方式上。由于您的缓冲区被声明为 uint8_t[]
,编译器不一定会对齐它。
这通常不是问题(但通常会引起小的性能损失),但某些体系结构拒绝访问未对齐的指针。在这些架构上,非对齐访问必须在软件中完成。
这里我假设你的 HardFaultException 来自 ARM,this link 建议使用 __packed
属性让编译器知道指针可能未对齐。然后编译器将使用软件未对齐访问。
需要注意的是,现代的ARM已经没有这个问题了。 link 谈论 "Older ARM processors",我没有注意到现代 ARM 上的这个问题。
4为什么这个块会抛出内存错误:
uint8_t buffer[ 8 ] = { 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 };
if ( *((uint32_t *)(&buffer[ 0 ])) == *((uint32_t *)(&buffer[ 4 ])) + 1 )
return TRUE;
虽然此块有效:
uint8_t buffer[ 8 ] = { 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 };
uint32_t comp1 = *((uint32_t *)(&buffer[ 0 ]));
uint32_t comp2 = *((uint32_t *)(&buffer[ 4 ]));
if ( comp1 == comp2 + 1 )
return TRUE;
问题可能出在缓冲区的对齐方式上。由于您的缓冲区被声明为 uint8_t[]
,编译器不一定会对齐它。
这通常不是问题(但通常会引起小的性能损失),但某些体系结构拒绝访问未对齐的指针。在这些架构上,非对齐访问必须在软件中完成。
这里我假设你的 HardFaultException 来自 ARM,this link 建议使用 __packed
属性让编译器知道指针可能未对齐。然后编译器将使用软件未对齐访问。
需要注意的是,现代的ARM已经没有这个问题了。 link 谈论 "Older ARM processors",我没有注意到现代 ARM 上的这个问题。