我正在使用 XC32 编译器为 PIC32MX795F512L 编写一些代码。我需要从作为 void* 传递给函数的缓冲区中读取数据。我需要将数据读取为无符号 32 位整数数组。问题是当我将 void* 转换为 uint32* 并尝试读取该数组索引 0 处的值时,处理器会调用通用错误处理程序,而如果我将 void* 转换为 uint8* 并执行一些操作位操作得到相同的数据,它工作正常。
代码如下所示:
void foo(void* data, uint32 length)
{
uint32 i,j;
uint32 block;
for(i = 0, j = 0; i < length; i+= sizeof(uint32),j++)
{
printfUART(DEBUG_UART,"Debug 0\r\n");
#if 0//working code
block = ((uint8*)data)[i + 3];
block <<= 8;
block |= ((uint8*)data)[i + 2];
block <<= 8;
block |= ((uint8*)data)[i + 1];
block <<= 8;
block |= ((uint8*)data)[i + 0];
#else//not working code
block = ((uint32*)data)[j];
#endif
printfUART(DEBUG_UART,"Debug 1\r\n");
}
}
如果将 #if 0
更改为 #if 1
,代码将按预期工作,我会看到 "Debug 0"
和 “Debug 1”
在循环中多次打印。
但如果保持原样,“Debug 0”只会打印一次,然后代码会跳出循环,进入编译器设置的 cpu 通用错误处理程序。这是 XC32 编译器中的错误,还是我缺少某些东西?
请您参考如下方法:
我认为这是一个对齐问题。
如果 data
不在偶数地址(例如,因为它实际上是字节数组),则在您的平台上可能无法以 32 位方式访问它。
C 标准(ISO/IEC 9899:1999, 6.3.2.3)规定:
A pointer to an object or incomplete type may be converted to a pointer to a different object or incomplete type. If the resulting pointer is not correctly aligned for the pointed-to type, the behavior is undefined.