Перейти к содержанию
    

GCC align & packed

Есть вот такое описание регистров винчестера.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, получилось!

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)));

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...