Я занимаюсь программированием сотового широкополосного движка и натолкнулся на странную вещь, которую не могу объяснить при исследовании ошибки сегментации, основываясь на следующем коде:
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, что и ожидается.
Я не могу найти причину для этого. Есть идеи?
После некоторого дополнительного чтения я обнаружил следующее:
Компилятор 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.
Других решений пока нет …