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

 
 
 
Reply to this topicStart new topic
> Вопросы по выравниваю и оптимальных типах данных в 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
sergeeff
сообщение May 6 2010, 16:04
Сообщение #2


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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

Объявляйте себе массивы char на здоровье, пишите программу, там видно будет самому, надо ли чего оптимизиривать.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 6 2010, 20:24
Сообщение #3


Гуру
******

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



Цитата(mempfis_ @ May 6 2010, 17:49) *
возникло несколько вопросов по выравниваю и типам данных

АРМ-ы они очень разные. Из младших ARM7 и набирающий обороты Cortex-M3 две большие разницы.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
mempfis_
сообщение May 7 2010, 07:11
Сообщение #4


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

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



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


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

To sergeeff - спасибо за ответ. Как прибудет плата начну разбиратьсь на реальном железе.
Go to the top of the page
 
+Quote Post

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

 


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


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