Разница в размере структуры между процессором и процессором

Я занимаюсь программированием сотового широкополосного движка и натолкнулся на странную вещь, которую не могу объяснить при исследовании ошибки сегментации, основываясь на следующем коде:

struct SPU_DATA
{
unsigned char *i;
unsigned char *o;
unsigned int width;
unsigned int height;
unsigned int bpp;
char padding[108];
} __attribute__((aligned(128)));

Когда я вывожу размер этой структуры на консоль на процессоре, выдается значение 256. Однако, когда я вывожу размер на spu, он получится равным 128, что и ожидается.

Я не могу найти причину для этого. Есть идеи?

1

Решение

После некоторого дополнительного чтения я обнаружил следующее:
Компилятор ppu-g ++, по-видимому, по умолчанию установлен на 64 бит, что означает, что значения указателя будут занимать 8 байт в памяти. Это может привести к несогласованности значений данных, отправляемых в программу SPU для передачи DMA.

Чтобы предотвратить такие проблемы, вместо хранения указателя в структуре, вы должны хранить длинную строку без знака, которая содержит значение указателя, например:

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.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]