Код
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;
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 идет отступ в два байта, поэтому все остальные поля структуры тоже съезжают. Сам пробовал - не выходит каменный цветок.
