2015-12-03 2 views
1

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

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, что и ожидается.

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

+2

Возможно, ints и указатели 64 бит на ppu? – Kenney

+0

Интересный момент, который я не считал –

+1

Он также может быть 1013 байт или любое другое значение. Нет никаких типов гарантии, кроме «char», которые имеют определенный размер или нет прокладки. Если вы полагаетесь на определенный макет, (de) сериализуете из/в 'char []'. Все остальное - рецепт неопределенного поведения. И 'char' тоже не обязательно 8 бит. – Olaf

ответ

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.

Смежные вопросы