我正在使用 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.


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!