Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: GCC align & packed
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Dron_Gus
Есть вот такое описание регистров винчестера.
Код
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 идет отступ в два байта, поэтому все остальные поля структуры тоже съезжают. Сам пробовал - не выходит каменный цветок. sad.gif
AHTOXA
Может дописать __attribute__((aligned(1))); ещё и после определения всей структуры?
etoja
struct TUDPHeader __attribute__((__packed__, __aligned__ (1)));
Dron_Gus
Спасибо, получилось!
Код
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)));
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.