Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Выравнивание структур и в структурах...
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Dron_Gus
Собственно вопрос в сабже... Решил переделать стандартный HID пример для at91sam7s**... И красивенько оформить все дескрипторы, как у того же Агурова в виде структур. ТРИ дня бился. Пока не понял, что внутри структуры структур, каждая структура выравнивается до DWORD. А как отключить не знаю.
vet
#pragma pack(1)
zltigo
Цитата(Dron_Gus @ Sep 16 2006, 15:57) *
Пока не понял, что внутри структуры структур, каждая структура выравнивается до DWORD.

Все или очень просто, или очень сложно - минималистичный пример "структуры структур"
можно посмотреть?
Dron_Gus
Спасибо, добрый человек... Конец моим мучениям. 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 */
{},
/* Дескриптор первой конечной точки */
{}
};
Dron_Gus
Чтоб не плодить тем, спрошу тут же... Может есть какой более простой метод преобразования строки в юникодовскую, чем что-то вроде этого:

#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)
zltigo
Цитата(Dron_Gus @ Sep 16 2006, 16:09) *
Спасибо, добрый человек... Конец моим мучениям. smile.gif

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


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



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




А что то за аргумент и где про них вообще можно почитать?
zltigo
Цитата(Dron_Gus @ Sep 16 2006, 17:53) *
Не совсем понял, в каком смысле "очень простой"?

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

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


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

Ну во-первых три дня разбирались самостоятельно, во-вторых было упомянуто правильное слово выравнивание... Это уже совсем горячо, что и привело мня к мысли, что скорее всего не стоит поминать "#pragma pack" не уточнив проблемы. Кстати, не забудьте вернуть обратно, правильнее всего через опции push/pop, если Ваш компилятор их поддерживает.
Alex03
Цитата(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
Harvester
Цитата(zltigo @ Sep 17 2006, 00:19) *
Цитата(Dron_Gus @ Sep 16 2006, 23:04) *

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

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

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

Восстановить состояние существовашее ДО Вашего изменения правила паковки структуры, причем НЕ ЗНАЯ его предыдущего состояния заданного, например, в командной строке компилятора, или что мног хуже :-) какой-нибудь галочкой в дебрях меню IDE.
Harvester
Цитата(zltigo @ Sep 18 2006, 10:25) *
Цитата(Harvester @ Sep 18 2006, 09:18) *

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

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

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

Потому что значение по умолчанию и значение, заданное в командной строке или настройках IDE - это две большие разницы.
Alex03
Цитата(Harvester @ Sep 18 2006, 12:59) *
А почему нельзя просто pack() - восстанавливает значение по-умолчанию?


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

В общем push->код->pop (или push->код->push->код->pop->pop) - после себя ничего
не меняют/оставляют (в плане упаковки) и ИМХО являются правилами хорошего стиля.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.