Dron_Gus 2 15 июня, 2009 Опубликовано 15 июня, 2009 · Жалоба Есть вот такое описание регистров винчестера. typedef volatile unsigned short HDD_reg; typedef struct HDD_Reg { HDD_reg DR; //data register union { HDD_reg ER; //error register - read HDD_reg FR; //feature register - write } __attribute__((aligned(1))); HDD_reg SC; //sector counter HDD_reg SN; //sector number (LBA[7:0]) HDD_reg CL; //cylinder low (LBA[15:8]) HDD_reg CH; //cylinder high (LBA[23:16]) HDD_reg DH; //device-head (LBA[27:24]) union { HDD_reg SR; //status register - read HDD_reg CR; //command register - write } __attribute__((aligned(1))); HDD_reg NU[6]; //Not used union { HDD_reg AS; //alternate status - read HDD_reg DC; //device control - write } __attribute__((aligned(1))); HDD_reg DA; //drive address - not used! } HDD_Reg; Как видно из коментариев некоторые регистры для чтения-записи имеют разное название и назначение. Как мне правильно расставить атрибуты packed и align, чтобы компилятор не выравнивал union'ы на границу 4 байт? Просто если оставить как есть, то после DR идет отступ в два байта, поэтому все остальные поля структуры тоже съезжают. Сам пробовал - не выходит каменный цветок. :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 15 июня, 2009 Опубликовано 15 июня, 2009 · Жалоба Может дописать __attribute__((aligned(1))); ещё и после определения всей структуры? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
etoja 0 16 июня, 2009 Опубликовано 16 июня, 2009 · Жалоба struct TUDPHeader __attribute__((__packed__, __aligned__ (1))); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dron_Gus 2 16 июня, 2009 Опубликовано 16 июня, 2009 · Жалоба Спасибо, получилось! struct HDD_Reg_ { HDD_reg DR; //data register union { HDD_reg ER; //error register - read HDD_reg FR; //feature register - write } __attribute__((packed, aligned(1))); HDD_reg SC; //sector counter HDD_reg SN; //sector number (LBA[7:0]) HDD_reg CL; //cylinder low (LBA[15:8]) HDD_reg CH; //cylinder high (LBA[23:16]) HDD_reg DH; //device-head (LBA[27:24]) union { HDD_reg SR; //status register - read HDD_reg CR; //command register - write } __attribute__((packed, aligned(1))); HDD_reg NU[6]; //Not used union { HDD_reg AS; //alternate status - read HDD_reg DC; //device control - write } __attribute__((packed, aligned(1))); HDD_reg DA; //drive address - not used! } __attribute__((packed, aligned(1))); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться