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

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Размер unsigned int или int Keil4.5
TAutomatic
сообщение Jun 2 2012, 11:17
Сообщение #1


Участник
*

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



Добрый день, коллеги.
Месяц использую LPC1768 и только сейчас с "ужасом" заметил, что под переменные unsigned int и int компилятор отводит по 4 байта.
Использую среду Keil 4.5 и постоянно плююсь даже не по причине ее скудости, а по причине неудобности документации на нее и компилятор. Как установить "нормальный" размер этих типов данных размером в 2 байта?
И второй вопрос. Я был уверен, что в Cortex-M3 отсутствует необходимость выравнивания разноразмерных типов данных.
Об этом написано тут
Тем не менее, у себя в реале я этого не вижу. Если за однобайтовой переменной следует четырехбайтовая, то она все равно выравнивается по границе 32 разрядного слова, тоесть остается неиспользуемый промежуток в 3 байта. Что тут не так?
Go to the top of the page
 
+Quote Post
ohmjke
сообщение Jun 2 2012, 11:27
Сообщение #2


Частый гость
**

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



Размер int равен размеру машинного слова. В данном случае 32 бита.
Нужно 2 байта - используйте short int (ну или просто short), либо int16_t.

Сообщение отредактировал ohmjke - Jun 2 2012, 11:31
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 2 2012, 11:30
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
TAutomatic
сообщение Jun 2 2012, 11:33
Сообщение #4


Участник
*

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



Цитата(ohmjke @ Jun 2 2012, 14:27) *
Размер int равен размеру машинного слова. В данном случае 32 бита.

Как бы такое утверждение было в основном принято к процессорам семейства х86. Для микроконтроллеров подразумевалось int - 2 байта. Но готов с Вами согласиться, поскольку в Keil нашел предопределенный макрос, который возвращает 4. Но тогда, по логике, long должен иметь удвоенный размер, только не машиннго слова, как Вы написали , поскольку это не команда, а размер шины данных, тоесть 64 бита. Разве не так?
Go to the top of the page
 
+Quote Post
ohmjke
сообщение Jun 2 2012, 11:37
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
TAutomatic
сообщение Jun 2 2012, 11:43
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 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 нет двухбайтового типа данных?
Go to the top of the page
 
+Quote Post
ohmjke
сообщение Jun 2 2012, 11:45
Сообщение #7


Частый гость
**

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



Написали же, 2 байтовый это short.
Go to the top of the page
 
+Quote Post
TAutomatic
сообщение Jun 2 2012, 11:47
Сообщение #8


Участник
*

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



Получается, все же есть в <stdint.h> - short


Цитата(TAutomatic @ Jun 2 2012, 14:46) *
Получается, все же есть в <stdint.h> - short

Я увидел, благодарствую.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 2 2012, 11:49
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(TAutomatic @ Jun 2 2012, 15:43) *
Переменные базовых типов так не упакуешь.

А вы попробуйте wink.gif
Go to the top of the page
 
+Quote Post
ohmjke
сообщение Jun 2 2012, 11:50
Сообщение #10


Частый гость
**

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



short он не из stdint.h, а просто является частью языка.
а в stdint.h вот что - http://ru.wikipedia.org/wiki/Stdint.h
Go to the top of the page
 
+Quote Post
TAutomatic
сообщение Jun 2 2012, 11:53
Сообщение #11


Участник
*

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



Цитата(aaarrr @ Jun 2 2012, 14:49) *
А вы попробуйте wink.gif

Подскажите метод, как упаковать?
Код
unsigned char A;
unsigned long B;
unsigned char C;

что бы получилось занятыми в памяти не 12 байт, а 6 байт?
Буду весьма благодарен.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jun 2 2012, 12:20
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 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


--------------------
Go to the top of the page
 
+Quote Post
ivainc1789
сообщение Jun 2 2012, 12:21
Сообщение #13


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

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Не хотел создавать новую тему... Можно ли спросить здесь:
1. В связи с чем в IAR определены типы uint16_t и подобные, оканчивающиеся на "_t". Всю жись писал полностью "unsigned int" и так далее... Так конечно длиннее и дольше, больше тонера при распечатках, но уже привычно... Зачем эти "_t" определили?
2. Есть ли в IAR возможность подсветить эти типы жирным шрифтом, как стандартные?
Go to the top of the page
 
+Quote Post
ohmjke
сообщение Jun 2 2012, 12:26
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jun 2 2012, 12:30
Сообщение #15


Гуру
******

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



Цитата(ivainc1789 @ Jun 2 2012, 18:21) *
Зачем эти "_t" определили?
Это типа сообщение человечеству, что это "тип данных". Я например (по рекомендации мелкософтаwink.gif) Глобальные переменные называю с первыми символами "g_" (global). Например "g_SysTime". Так же и здесь - uint16_t (uint16 type)


--------------------
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 17th June 2025 - 09:57
Рейтинг@Mail.ru


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