реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> GCC align & packed, вопрос
Dron_Gus
сообщение Jun 15 2009, 12:33
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Есть вот такое описание регистров винчестера.
Код
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


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 15 2009, 14:46
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Может дописать __attribute__((aligned(1))); ещё и после определения всей структуры?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
etoja
сообщение Jun 16 2009, 11:09
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952



struct TUDPHeader __attribute__((__packed__, __aligned__ (1)));
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Jun 16 2009, 16:54
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Спасибо, получилось!
Код
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)));


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 21:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.0138 секунд с 7
ELECTRONIX ©2004-2016