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

 
 
> Вопросы по выравниваю и оптимальных типах данных в ARM
mempfis_
сообщение May 6 2010, 14:49
Сообщение #1


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

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Готовлюсь к написанию первой программы для устройства с процессором 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
Go to the top of the page
 
+Quote Post



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

 


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


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