|
|
  |
Размер unsigned int или int Keil4.5 |
|
|
|
Jun 2 2012, 11:17
|
Участник

Группа: Участник
Сообщений: 59
Регистрация: 11-12-11
Пользователь №: 68 798

|
Добрый день, коллеги. Месяц использую LPC1768 и только сейчас с "ужасом" заметил, что под переменные unsigned int и int компилятор отводит по 4 байта. Использую среду Keil 4.5 и постоянно плююсь даже не по причине ее скудости, а по причине неудобности документации на нее и компилятор. Как установить "нормальный" размер этих типов данных размером в 2 байта? И второй вопрос. Я был уверен, что в Cortex-M3 отсутствует необходимость выравнивания разноразмерных типов данных. Об этом написано тутТем не менее, у себя в реале я этого не вижу. Если за однобайтовой переменной следует четырехбайтовая, то она все равно выравнивается по границе 32 разрядного слова, тоесть остается неиспользуемый промежуток в 3 байта. Что тут не так?
|
|
|
|
|
Jun 2 2012, 11:30
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(TAutomatic @ Jun 2 2012, 15:17)  Как установить "нормальный" размер этих типов данных размером в 2 байта? Никак. 32-х битный int для 32-х битной архитектуры - это и есть норма. Используйте short или типы из <stdint.h>. Цитата(TAutomatic @ Jun 2 2012, 15:17)  И второй вопрос. Я был уверен, что в Cortex-M3 отсутствует необходимость выравнивания разноразмерных типов данных. Об этом написано тутТем не менее, у себя в реале я этого не вижу. Если за однобайтовой переменной следует четырехбайтовая, то она все равно выравнивается по границе 32 разрядного слова, тоесть остается неиспользуемый промежуток в 3 байта. Что тут не так? Необходимость необходимости рознь - эффективность работы с выровненными данными выше, поэтому без нужды паковать их не следует. Используйте в случае нужды модификатор __packed.
|
|
|
|
|
Jun 2 2012, 11:33
|
Участник

Группа: Участник
Сообщений: 59
Регистрация: 11-12-11
Пользователь №: 68 798

|
Цитата(ohmjke @ Jun 2 2012, 14:27)  Размер int равен размеру машинного слова. В данном случае 32 бита. Как бы такое утверждение было в основном принято к процессорам семейства х86. Для микроконтроллеров подразумевалось int - 2 байта. Но готов с Вами согласиться, поскольку в Keil нашел предопределенный макрос, который возвращает 4. Но тогда, по логике, long должен иметь удвоенный размер, только не машиннго слова, как Вы написали , поскольку это не команда, а размер шины данных, тоесть 64 бита. Разве не так?
|
|
|
|
|
Jun 2 2012, 11:37
|

Частый гость
 
Группа: Участник
Сообщений: 116
Регистрация: 27-01-10
Из: СПб
Пользователь №: 55 094

|
Цитата Машинное слово — машиннозависимая и платформозависимая величина, измеряемая в битах или байтах (тритах или трайтах), равная разрядности регистров процессора и/или разрядности шины данных. И где это для МК подразумевалось 2 байта? У AVR? Еще из википедии: Цитата Многие языки программирования предлагают выбор между короткими (англ. short), длинными (англ. long) и целыми стандартной длины. Длина стандартного целого типа, как правило, совпадает с размером машинного слова на целевой платформе. Для 16-разрядных операционных систем - этот тип (int) составляет 2 байта и совпадает с типом short int (можно использовать как short, опуская слово int), для 32-разрядных операционных систем он будет равен 4 байтам и совпадает с длинным целым long int (можно использовать как long, опуская слово int), и в этом случае будет составлять 4 байта. Короткое целое short int, для 16-разрядных операционных систем, 32-разрядных операционных систем, 64-разрядных операционных систем составляет — 2 байта. Также в некоторых языках может использоваться тип данных двойное длинное long long, который составляет 8 байт.
Сообщение отредактировал ohmjke - Jun 2 2012, 11:41
|
|
|
|
|
Jun 2 2012, 11:43
|
Участник

Группа: Участник
Сообщений: 59
Регистрация: 11-12-11
Пользователь №: 68 798

|
Цитата(aaarrr @ Jun 2 2012, 14:30)  Используйте в случае нужды модификатор __packed. Так можно упаковать только структуры и битовые поля, не так ли? Переменные базовых типов так не упакуешь. Цитата(ohmjke @ Jun 2 2012, 14:37)  И где это для МК подразумевалось 2 байта?
Еще из википедии: Я согласен с Вами, офицального признания, что int- это 2 байта, нет. Это есть определенное неофицальное соглашение. Впрочем, нет смысла спорить, да я и не за тем спрашиваю. В большенстве систем, даже 32х или даже 64х разрядных есть двухбайтовые типы данных. Получается, в ARM нет двухбайтового типа данных?
|
|
|
|
|
Jun 2 2012, 11:47
|
Участник

Группа: Участник
Сообщений: 59
Регистрация: 11-12-11
Пользователь №: 68 798

|
Получается, все же есть в <stdint.h> - short Цитата(TAutomatic @ Jun 2 2012, 14:46)  Получается, все же есть в <stdint.h> - short Я увидел, благодарствую.
|
|
|
|
|
Jun 2 2012, 11:53
|
Участник

Группа: Участник
Сообщений: 59
Регистрация: 11-12-11
Пользователь №: 68 798

|
Цитата(aaarrr @ Jun 2 2012, 14:49)  А вы попробуйте  Подскажите метод, как упаковать? Код unsigned char A; unsigned long B; unsigned char C; что бы получилось занятыми в памяти не 12 байт, а 6 байт? Буду весьма благодарен.
|
|
|
|
|
Jun 2 2012, 12:20
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(TAutomatic @ Jun 2 2012, 17:53)  Подскажите метод, как упаковать? ...что бы получилось занятыми в памяти не 12 байт, а 6 байт? Вам же выше уже говорили про __packed. Создаете структуру с требуемым набором данных. Сообщаете компилятору, что нужно ее упаковать и готово. Кстати, для определения типов пользуюсь давным-давно уже своим хедером: Код /******************************************************************************* Declared types *******************************************************************************/
/* Integer */ typedef signed int INT, *P_INT; typedef unsigned int UINT, *P_UINT; #define MAXUINT ((UINT)(-1)) #define INTLEN (sizeof(INT))
/* byte */ typedef signed char CHAR, *P_CHAR; typedef unsigned char UCHAR, *P_UCHAR;
typedef CHAR INT8, *P_INT8; typedef UCHAR UINT8, *P_UINT8; #define MAXUINT8 ((UINT8)(-1)) #define INT8LEN (sizeof(INT8))
/* word */ typedef signed short INT16, *P_INT16; typedef unsigned short UINT16, *P_UINT16; #define MAXUINT16 ((UINT16)(-1)) #define INT16LEN (sizeof(INT16))
/* double word */ typedef signed long INT32, *P_INT32; typedef unsigned long UINT32, *P_UINT32; #define MAXUINT32 ((UINT32)(-1)) #define INT32LEN (sizeof(INT32))
/* quad word */ typedef signed long long INT64, *P_INT64; typedef unsigned long long UINT64, *P_UINT64; #define MAXUINT64 ((UINT64)(-1)) #define INT64LEN (sizeof(INT64)) Один файл для всех типов МК, в том числе AVR и ARM
--------------------
|
|
|
|
|
Jun 2 2012, 12:26
|

Частый гость
 
Группа: Участник
Сообщений: 116
Регистрация: 27-01-10
Из: СПб
Пользователь №: 55 094

|
Цитата(ivainc1789 @ Jun 2 2012, 16:21)  Не хотел создавать новую тему... Можно ли спросить здесь: 1. В связи с чем в IAR определены типы uint16_t и подобные, оканчивающиеся на "_t". Всю жись писал полностью "unsigned int" и так далее... Так конечно длиннее и дольше, больше тонера при распечатках, но уже привычно... Зачем эти "_t" определили? 2. Есть ли в IAR возможность подсветить эти типы жирным шрифтом, как стандартные? Это не только в IAR. Думаю, просто для удобства - короче и сразу видно размер. И лично для меня так действительно удобнее.
Сообщение отредактировал ohmjke - Jun 2 2012, 12:28
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|