Прочитав статью сдесь: 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
#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. Какой тип данных наиболее оптимален если вдруг появится необходимлсть перейти в режим тумб (если прошивка не будет влазить в текущий процессор)?
Заранее спасибо всем кто не поленится всё это прочитать и дать пару толковых ответов
