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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Настройка GNU toolchain from ARM для STM32, типы данных
k000858
сообщение Jan 21 2014, 07:35
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Какие опции задать компилятору, что бы тип uint32_t соответствовал типу unsigned int, а не unsigned long ?

В данный момент тип uint32_t приводит по ссылке в
Код
#if __have_long32
typedef signed long int32_t;
typedef unsigned long uint32_t;
#define __int32_t_defined 1


Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 21 2014, 07:44
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(k000858 @ Jan 21 2014, 11:35) *
Какие опции задать компилятору, что бы тип uint32_t соответствовал типу unsigned int, а не unsigned long ?

Зачем? unsigned int и unsigned long - это одинаковые типы на ARM, просто название разное.
К тому же вы можете просто руками поправить хедер stdint.h (или что он там ещё включает). Но зачем?
Go to the top of the page
 
+Quote Post
k000858
сообщение Jan 21 2014, 07:50
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(scifi @ Jan 21 2014, 11:44) *
Зачем? unsigned int и unsigned long - это одинаковые типы на ARM, просто название разное.
К тому же вы можете просто руками поправить хедер stdint.h (или что он там ещё включает). Но зачем?

код вида
Код
uint32_t i;
printf("%i\n",i);

приводит к варнингам
Код
warning: format '%i' expects argument of type 'int', but argument 2 has type 'uint32_t' [-Wformat=]
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 21 2014, 07:57
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



К примеру, в lwip эта проблема решается так:
CODE
/* Define generic types used in lwIP */
typedef unsigned char u8_t;
typedef signed char s8_t;
typedef unsigned short u16_t;
typedef signed short s16_t;
typedef unsigned long u32_t;
typedef signed long s32_t;

typedef u32_t mem_ptr_t;

/* Define (sn)printf formatters for these lwIP types */
#define U16_F "hu"
#define S16_F "hd"
#define X16_F "hx"
#define U32_F "lu"
#define S32_F "ld"
#define X32_F "lx"

То есть для переносимости сделаны конфигурируемые макросы. А если переносимость не нужна, то пишите "%lu".
Go to the top of the page
 
+Quote Post
VAI
сообщение Jan 21 2014, 09:21
Сообщение #5


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

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



k000858, Вы предполагаете, что если Вы напишете
Код
unsigned int i;
printf("%i\n",i);
варнинга не будет?
Варнинг генерится из-за того, что формат %i - это вывод знакового целого, а Вы подсовываете ему unsigned ...
Попробуйте
Код
unsigned int i;
printf("%u\n",i);


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 21 2014, 09:42
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(k000858 @ Jan 21 2014, 09:50) *
Код
warning: format '%i' expects argument of type 'int', but argument 2 has type 'uint32_t' [-Wformat=]

Угу. Чтобы избежать подобных казусов специально для типов из stdint.h в файле inttypes.h объявлены и спецификаторы формата

Код
uint32_t i;
printf("%" PRIu32 "\n",i);


Да, несколько уродует форматную строку, но 100% переносимо.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
k000858
сообщение Jan 21 2014, 09:42
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(VAI @ Jan 21 2014, 13:21) *
k000858, Вы предполагаете, что если Вы напишете
Код
unsigned int i;
printf("%i\n",i);
варнинга не будет?
Варнинг генерится из-за того, что формат %i - это вывод знакового целого, а Вы подсовываете ему unsigned ...
Попробуйте
Код
unsigned int i;
printf("%u\n",i);

я бы не стал спрашивать (тем более создавать тему на форуме) если б не проверил
варнинга действительно нет

самое интересное, что в других компиляторах с таким не сталкивался. к примеру в кейле typedef unsigned int uint32_t;
соответственно и варнингов не возникает
Go to the top of the page
 
+Quote Post
k000858
сообщение Jan 21 2014, 12:29
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



и все таки я не понимаю, почему нет варнинга на
Код
  unsigned int i;
  printf("%i\n",i);


но есть на
Код
  uint32_t i;
  printf("%i\n",i);


если unsigned int = uint32_t

Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 21 2014, 16:12
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



а есть варнинг на
Код
uint32_t i;
printf("%i\n",(unsigned int)i);

?

кстати всегда можно прагмой конкретный варнинг задавитьsm.gif


Go to the top of the page
 
+Quote Post
k000858
сообщение Jan 21 2014, 16:49
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(Golikov A. @ Jan 21 2014, 20:12) *
а есть варнинг на
Код
uint32_t i;
printf("%i\n",(unsigned int)i);

?

кстати всегда можно прагмой конкретный варнинг задавитьsm.gif

С приведением типа варнинга нет

Давить варнинги не вариант, хотелось бы разобраться в чем причина
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 21 2014, 17:51
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(k000858 @ Jan 21 2014, 20:49) *
хотелось бы разобраться в чем причина

Видимо, поэтому вы начали задавать вопросы совсем издалека, Шерлок. Мне кажется, спросить прямо было бы проще :-)
Go to the top of the page
 
+Quote Post
k000858
сообщение Jan 21 2014, 17:53
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



вопрос остается открытым, не важно откуда я его задал
Цитата(k000858 @ Jan 21 2014, 16:29) *
почему нет варнинга на
Код
  unsigned int i;
  printf("%i\n",i);


но есть на
Код
  uint32_t i;
  printf("%i\n",i);


если unsigned int = uint32_t

Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 21 2014, 18:26
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



варнинг от функции printf, она пытается данный ей лонг конвертнуть в int,
она же библиотечная и старинная,
так получилось что в арме int == long, а в avr int == 16, потому int32 для avr - это лонг, да и вообще int это 16 бит, а 32 бита это long.

напишите
Код
long i;
printf("%i", i);

и получите варнинг

кстати а есть вариант в этой библиотеке
Код
printf("%l",i)

?

скорее всего он не будет давать варнинга

а вообще когда народ устал от путаницы с тем сколько бит
int
long и прочее,
и появились
int32_t типы, и коль вы встали на этот путь, то вам надо использовать тот же однозначно определенный вариант печати

Код
printf("%" PRIu32 "\n",i);



Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 21 2014, 19:26
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Golikov A. @ Jan 21 2014, 22:26) *
варнинг от функции printf, она пытается данный ей лонг конвертнуть в int,

Вы будете смеяться, но warning таки от компилятора :-) Вы можете написать свой printf, который будет делать всё, что угодно, и это предупреждение никуда не денется.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 21 2014, 20:14
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ну как же не денется, денется конечно же...
просто прямое преобразование типа уже убирает варнинг...
Go to the top of the page
 
+Quote Post

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

 


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


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