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

 
 
> Выравнивание структур и в структурах..., детский вопрос...
Dron_Gus
сообщение Sep 16 2006, 12:57
Сообщение #1


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

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



Собственно вопрос в сабже... Решил переделать стандартный HID пример для at91sam7s**... И красивенько оформить все дескрипторы, как у того же Агурова в виде структур. ТРИ дня бился. Пока не понял, что внутри структуры структур, каждая структура выравнивается до DWORD. А как отключить не знаю.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 16)
vet
сообщение Sep 16 2006, 12:58
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



#pragma pack(1)


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 16 2006, 13:01
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dron_Gus @ Sep 16 2006, 15:57) *
Пока не понял, что внутри структуры структур, каждая структура выравнивается до DWORD.

Все или очень просто, или очень сложно - минималистичный пример "структуры структур"
можно посмотреть?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Sep 16 2006, 13:09
Сообщение #4


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

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



Спасибо, добрый человек... Конец моим мучениям. smile.gif



Структура структур:



Код
  
const struct
{
struct usb_st_configuration_descriptor cfg;
struct usb_st_interface_descriptor ifc;
struct usb_st_hid_descriptor hid;
struct usb_st_endpoint_descriptor ep1;
}
usb_configuration =
{
/* CONFIGURATION */
{ 0x9,
CONFIGURATION, /* =2 */
CONF_LENGTH, /* длина всех дескрипторов */
1, /* число интерфейсов */
CONF_NB, /* номер конфигурации */
0, /* дескр. строки конфигур */
CONF_ATTRIBUTES, /* аттрибуты */
MAX_POWER /* 100 mA */
},
/* INTERFACE 0 */
{},
/* Дескриптор HID */
{},
/* Дескриптор первой конечной точки */
{}
};


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Sep 16 2006, 13:57
Сообщение #5


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

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



Чтоб не плодить тем, спрошу тут же... Может есть какой более простой метод преобразования строки в юникодовскую, чем что-то вроде этого:

#define USB_PRODUCT_NAME1 {'T',0,'e',0,'s',0,'t',0,'b',0,'o',0,'a',0,'r',0,'d',0}

Больно такой метод накаляет. smile.gif

З.Ы. это явно можно как-то решить с помошью define, но я не специалист. 6)


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 16 2006, 14:17
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dron_Gus @ Sep 16 2006, 16:09) *
Спасибо, добрый человек... Конец моим мучениям. smile.gif

Это следует понимать, что вариант оказался "очень простой" с #pragma pack( 1 )
???


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Alex03
сообщение Sep 16 2006, 14:31
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(Dron_Gus @ Sep 16 2006, 19:57) *
#define USB_PRODUCT_NAME1 {'T',0,'e',0,'s',0,'t',0,'b',0,'o',0,'a',0,'r',0,'d',0}

Больно такой метод накаляет. smile.gif


А так?
#define USB_PRODUCT_NAME1 L"Test board"
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Sep 16 2006, 14:53
Сообщение #8


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

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



Цитата(zltigo @ Sep 16 2006, 18:17) *
Это следует понимать, что вариант оказался "очень простой" с #pragma pack( 1 )
???


Не совсем понял, в каком смысле "очень простой"?



Цитата(Alex03 @ Sep 16 2006, 18:31) *
А так?
#define USB_PRODUCT_NAME1 L"Test board"




А что то за аргумент и где про них вообще можно почитать?


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


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dron_Gus @ Sep 16 2006, 17:53) *
Не совсем понял, в каком смысле "очень простой"?

В том смысле, что физически ясный и везде описанный - т.е. лежащий на поверхности..
А вот если-бы выравнивание побайтно не сработало по какой-то причине, тогда поиск правильного синтаксиса, обходных путей и разборки с компилятором :-(
Цитата
А что то за аргумент и где про них вообще можно почитать?

В описании языка, там где речь идет о том, как сказать компилятору из скольки бит состоит 'число' и
сколько бит в 'Char'


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Sep 16 2006, 20:04
Сообщение #10


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

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



Цитата(zltigo @ Sep 16 2006, 19:14) *
В том смысле, что физически ясный и везде описанный - т.е. лежащий на поверхности..


Я еще начинающий... для меня на поверхности мало что пока лежит. smile.gif


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 16 2006, 20:19
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dron_Gus @ Sep 16 2006, 23:04) *
Я еще начинающий... для меня на поверхности мало что пока лежит. smile.gif

Ну во-первых три дня разбирались самостоятельно, во-вторых было упомянуто правильное слово выравнивание... Это уже совсем горячо, что и привело мня к мысли, что скорее всего не стоит поминать "#pragma pack" не уточнив проблемы. Кстати, не забудьте вернуть обратно, правильнее всего через опции push/pop, если Ваш компилятор их поддерживает.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Alex03
сообщение Sep 18 2006, 05:31
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(zltigo @ Sep 17 2006, 02:19) *
Кстати, не забудьте вернуть обратно, правильнее всего через опции push/pop, если Ваш компилятор их поддерживает.


Я вот кстати не понимаю почему GCC для ARM push/pop не подерживет! sad.gif

main.c:105: warning: #pragma pack(push[, id], <n>) is not supported on this target

Притом не поддерживает именно push/pop, сам(а) #pragma pack(n) поддерживается.
При этом насколько я понимаю от target-а push/pop никак не зависит, это чисто
возможность компилятора, и если она есть например в x86 то почему нет в ARM.
Подозреваю что те кто делали GCC-порт под ARM просто отключили эту столь полезную возможность.

Притом и в GCC 3.x.x b и в 4.x.x.

Абидна блин! smile.gif
Go to the top of the page
 
+Quote Post
Harvester
сообщение Sep 18 2006, 06:18
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(zltigo @ Sep 17 2006, 00:19) *
Цитата(Dron_Gus @ Sep 16 2006, 23:04) *

Я еще начинающий... для меня на поверхности мало что пока лежит. smile.gif

Ну во-первых три дня разбирались самостоятельно, во-вторых было упомянуто правильное слово выравнивание... Это уже совсем горячо, что и привело мня к мысли, что скорее всего не стоит поминать "#pragma pack" не уточнив проблемы. Кстати, не забудьте вернуть обратно, правильнее всего через опции push/pop, если Ваш компилятор их поддерживает.

Вопрос по этой же теме: объясните пожалуйста, а зачем нужны эти push/pop?


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 18 2006, 06:25
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Harvester @ Sep 18 2006, 09:18) *
Вопрос по этой же теме: объясните пожалуйста, а зачем нужны эти push/pop?

Восстановить состояние существовашее ДО Вашего изменения правила паковки структуры, причем НЕ ЗНАЯ его предыдущего состояния заданного, например, в командной строке компилятора, или что мног хуже :-) какой-нибудь галочкой в дебрях меню IDE.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Harvester
сообщение Sep 18 2006, 06:59
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(zltigo @ Sep 18 2006, 10:25) *
Цитата(Harvester @ Sep 18 2006, 09:18) *

Вопрос по этой же теме: объясните пожалуйста, а зачем нужны эти push/pop?

Восстановить состояние существовашее ДО Вашего изменения правила паковки структуры, причем НЕ ЗНАЯ его предыдущего состояния заданного, например, в командной строке компилятора, или что мног хуже :-) какой-нибудь галочкой в дебрях меню IDE.

А почему нельзя просто pack() - восстанавливает значение по-умолчанию?


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 18 2006, 07:46
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Harvester @ Sep 18 2006, 10:59) *
А почему нельзя просто pack() - восстанавливает значение по-умолчанию?

Потому что значение по умолчанию и значение, заданное в командной строке или настройках IDE - это две большие разницы.
Go to the top of the page
 
+Quote Post
Alex03
сообщение Sep 18 2006, 09:14
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(Harvester @ Sep 18 2006, 12:59) *
А почему нельзя просто pack() - восстанавливает значение по-умолчанию?


push/pop могут быть вложенные.
Как правило эти модификаторы приписываются в *.h файлах, последовательность
"инклудирования" и вложенность которых может быть всякой, а многие из них вообще
от сторонних производителей. При этом далеко не все восстанавливают за собой упаковку.

В общем push->код->pop (или push->код->push->код->pop->pop) - после себя ничего
не меняют/оставляют (в плане упаковки) и ИМХО являются правилами хорошего стиля.
Go to the top of the page
 
+Quote Post

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

 


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


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