我正在进行一些蜂窝宽带引擎编程,在调查分割故障时,我遇到了一件我无法解释的奇怪事情,基于以下代码:
struct SPU_DATA
{
unsigned char *i;
unsigned char *o;
unsigned int width;
unsigned int height;
unsigned int bpp;
char padding[108];
} __attribute__((aligned(128)));
当我将此结构的大小输出到ppu上的控制台时,将输出值256。然而,当我在spu上输出大小时,它显示为128,这是预期的。
我找不出原因。有什么想法吗?
经过额外的阅读,我发现了以下内容:ppu-g++编译器似乎默认为64位,这意味着指针值将占用内存中的8个字节。这可能会导致发送到SPU程序进行DMA传输的数据值不一致。
为了防止出现这样的问题,您不应该在结构中存储指针,而应该存储一个无符号的long-long,它包含指针的值,如下所示:
struct SPU_DATA
{
unsigned long long i;
unsigned long long o;
unsigned int width;
unsigned int height;
unsigned int bpp;
char padding[108];
} __attribute__((aligned(128)));
通过这种方式,指针值将不会被截断,并且发送到SPU程序的数据的正确有效地址将是正确的,从而防止在64位PPU程序运行32位SPU程序时出现进一步的问题。