1

我正在做一些小区宽带引擎编程,在调查分段错误时,我遇到了一个我无法解释的奇怪事情,基于以下代码:

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,这是预期的结果。

我找不到这个的原因。有任何想法吗?

4

1 回答 1

1

经过一些额外的阅读,我发现了以下内容:ppu-g++ 编译器似乎默认为 64 位,这意味着指针值将占用内存中的 8 个字节。这可能导致发送到 SPU 程序以进行 DMA 传输的数据值不一致。

为了防止出现此类问题,您应该存储一个 unsigned 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程序时出现进一步的问题。

于 2015-12-05T23:39:47.143 回答