Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопросы по выравниваю и оптимальных типах данных в ARM
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
mempfis_
Готовлюсь к написанию первой программы для устройства с процессором ARM.

Прочитав статью сдесь: http://www.phyton.ru/pages/page44.html возникло несколько вопросов по выравниваю и типам данных.

1. При объявлении структур необходимо выравнивание полей на границу слова (4 байта).
Разбирая пример мыши от атмел нашёл такие строчки кода

Код
#ifdef __ICCARM__          // IAR
#pragma pack(1)            // IAR
#define __attribute__(...) // IAR
#endif  

typedef struct {
   unsigned char bLength; /// Size of the descriptor in bytes.
   unsigned char bDescriptorType;/// Descriptor type (<USBGenericDescriptor_ENDPOINT>).
   unsigned char bEndpointAddress; /// Address and direction of the endpoint.
   unsigned char bmAttributes; /// Endpoint type and additional characteristics (for isochronous endpoints).
   unsigned short wMaxPacketSize; /// Maximum packet size (in bytes) of the endpoint.
   unsigned char bInterval; /// Polling rate of the endpoint.

} __attribute__ ((packed)) USBEndpointDescriptor; // GCC


#ifdef __ICCARM__          // IAR
#pragma pack()             // IAR
#endif


Правильно ли я понял что для IAR #pragma pack(1) включает выравнивание а #pragma pack() отключает?

2. Как вырвнивание повлияет на размер выдаваемый sizeof? Если компилятор добавит байты для выравнивания то будут ли они включены в результат возвращаемый sizeof? Вопрос интересный т.к. в AVR часто использую sizeof(объект) чтоб узнать сколько байт он занимает.

3. Нужно ли выравнивать обычные массивы с разрядностью отличной от int (напр. unsigned char buff[128], shorth buff[16])?

4. Для работы с полями структуры или с массивами (отдельными или входящими в структуры) через указатели будет ли иметь значение выровненные они или нет?

5. Часто создаю структуры с различными типами данных (char, int, shorth) чтобы потом используя адрес первого поля приведённый к типу unsigned char* и кол-во байт полученные от sizeof вычислять crc8, передавать эти данные по UART, SPI и т.д.
Испортит ли выравнивание всю малину за счёт того что появятся лишние байты для выравнивания?

6. Каков оптимальный принцип компоновки полей структур чтобы максимально уменьшить кол-во дополнительных байт?

И пару вопросов по оптимальной разрядности данных с точки зрения уменьшения кода и расхода оперативки.

1. В статье по ссылке было указано что оптимальный тип данных для ARM это int. Но большинство данных которые мне придётся обрабатывать 8мибитные! Хотя вопрос в объёме оперативки пока что не стоит но всёже оптимальней будет объявлять массивы типа int и работать с ними или char но выполнять преобразование к типу int перед обработкой байт?

2. Какой тип данных наиболее оптимален если вдруг появится необходимлсть перейти в режим тумб (если прошивка не будет влазить в текущий процессор)?

Заранее спасибо всем кто не поленится всё это прочитать и дать пару толковых ответов smile.gif
sergeeff
1. #pragma pack(1) включает выравнивание полея внутри структуры (класса) на границу 1 байта, т.е фактически отключает стандартное выравнивание равное 4 байтам (одно машинное слово - 32 бита).
2. sizeof всегда выдает правильный размер. Если компилятор что-то добавляет, sizeof это укажет.
3. Вы несколько путаете адрес, по которому размещается переменная, функция, класс, структура и адреса внутри структуры. Все переменные и пр. выравнены всегда на границу машинного слова (а можно заказать и особое выравнивание на границу 256 байт, 1 К и т.д.).
4. Будет
5. Испортит
6. #pragma pack(1)

Объявляйте себе массивы char на здоровье, пишите программу, там видно будет самому, надо ли чего оптимизиривать.
zltigo
Цитата(mempfis_ @ May 6 2010, 17:49) *
возникло несколько вопросов по выравниваю и типам данных

АРМ-ы они очень разные. Из младших ARM7 и набирающий обороты Cortex-M3 две большие разницы.
mempfis_
Цитата(zltigo @ May 6 2010, 23:24) *
АРМ-ы они очень разные. Из младших ARM7 и набирающий обороты Cortex-M3 две большие разницы.


Извиняюсь - ядро ARM7, процессор AT91SAM7S64.

To sergeeff - спасибо за ответ. Как прибудет плата начну разбиратьсь на реальном железе.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.