|
Настройка GNU toolchain from ARM для STM32, типы данных |
|
|
|
Jan 21 2014, 07:35
|

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Mar 20 2014, 00:47
|

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

|
Цитата(scifi @ Jan 21 2014, 11:57)  К примеру, в 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". Вот сейчас столкнулся с аналогичными варнингами при сборке LwIP Код ../Middlewares/Third_Party/LwIP/src/core/tcp_in.c:1223:11: warning: format '%u' expects argument of type 'unsigned int', but argument 4 has type 'long unsigned int' [-Wformat=] ../Middlewares/Third_Party/LwIP/src/core/tcp_in.c:1223:11: warning: format '%u' expects argument of type 'unsigned int', but argument 2 has type 'u32_t' [-Wformat=] ../Middlewares/Third_Party/LwIP/src/core/tcp_in.c:1223:11: warning: format '%u' expects argument of type 'unsigned int', but argument 4 has type 'long unsigned int' [-Wformat=] 'Finished building: ../Middlewares/Third_Party/LwIP/src/core/tcp_in.c' сс.h Код 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; typedef int sys_prot_t;
#define U16_F "hu" #define S16_F "d" #define X16_F "hx" #define U32_F "u" #define S32_F "d" #define X32_F "x" #define SZT_F "uz"
|
|
|
|
|
Mar 24 2014, 04:41
|

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

|
Цитата(scifi @ Mar 24 2014, 07:35)  У вас ошибка в файле cc.h: раз уж u32_t - это unsigned long, то и формат для printf должен быть "%lu". И вообще, почитайте про printf. файл сс.h взят от ST (пример проекта для Keil, IAR, TrueStudio и тд) этот же проект в кейле компилируется без каких либо варнингов но там и uint32_t unsigned int только в бесплатной версии eclipse + GNU Tools for ARM Embedded Processors такая непонятка с типами... ну понятно, что можно в cc.h подправить #define U32_F "u" на #define U32_F "lu"...но может есть способ принудительно компилятору определить uint32_t как в большенстве компиляторов? определяется тип макросом #if __STDINT_EXP(LONG_MAX) > 0x7fffffff а откуда что берется не понятно. так же наверняка можно компилятор с помощью некой опции попросить не беспокоиться о несоответствии unsigned int и unsigned long (ведь тот же кейл не дергается..)
|
|
|
|
|
Mar 24 2014, 05:28
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(k000858 @ Mar 24 2014, 08:41)  файл сс.h взят от ST (пример проекта для Keil, IAR, TrueStudio и тд) Ну вот и найдена причина: ST славен своим индусским говнокодом. Цитата(k000858 @ Mar 24 2014, 08:41)  ...но может есть способ принудительно компилятору определить uint32_t как в большенстве компиляторов? Сомневаюсь, что есть такой способ. А даже если бы и был, это было бы скорее вредно, чем полезно. Потому что эти предупреждения реально указывают на ошибки в коде (да, безобидные ошибки, но это до поры до времени). Не надо принудительно давить предупреждения, надо исправлять сами ошибки. Цитата(k000858 @ Mar 24 2014, 08:41)  так же наверняка можно компилятор с помощью некой опции попросить не беспокоиться о несоответствии unsigned int и unsigned long (ведь тот же кейл не дергается..) Это скорее недоработка кейла. Но иметь возможность отключать конкретное предупреждение было бы удобно и оправдано в ряде случаев, это да.
|
|
|
|
|
Mar 24 2014, 05:44
|

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

|
Цитата(scifi @ Mar 24 2014, 09:28)  Ну вот и найдена причина: ST славен своим индусским говнокодом. да причем здесь говнокод, если в вышеперечисленных тулчейнах uint32_t unsigned int. все верно определено в cc.h Цитата(scifi @ Mar 24 2014, 09:28)  Сомневаюсь, что есть такой способ. ну не даром в stdint.h тот же uint32_t может быть как unsigned int так и unsigned long. все определяется макросами, от откуда ноги растут так и не понял. то есть уже понял что в зависимости от макроса LONG_MAX, но как его в задать в свойствах проекта хз. такое ощущение что он либо в самом эклипсе статично занят либо в дебрях компилятора
|
|
|
|
|
Mar 24 2014, 06:26
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(k000858 @ Mar 24 2014, 09:44)  да причем здесь говнокод, если в вышеперечисленных тулчейнах uint32_t unsigned int. все верно определено в cc.h Вы как будто нарочно не читаете. Вот говнокод: Код typedef unsigned long u32_t; ... #define U32_F "u" В этом коде ошибка. Её надо исправлять, а не плясать вокруг неё с бубном.
|
|
|
|
Сообщений в этой теме
k000858 Настройка GNU toolchain from ARM для STM32 Jan 21 2014, 07:35 scifi Цитата(k000858 @ Jan 21 2014, 11:35) Каки... Jan 21 2014, 07:44 k000858 Цитата(scifi @ Jan 21 2014, 11:44) Зачем?... Jan 21 2014, 07:50  Сергей Борщ Цитата(k000858 @ Jan 21 2014, 09:50) Кодw... Jan 21 2014, 09:42      Сергей Борщ Цитата(k000858 @ Mar 24 2014, 07:44) в за... Mar 24 2014, 07:50    mdmitry Цитата(k000858 @ Mar 24 2014, 08:41) ...
... Mar 24 2014, 06:19 VAI k000858, Вы предполагаете, что если Вы напишете
Ко... Jan 21 2014, 09:21 k000858 Цитата(VAI @ Jan 21 2014, 13:21) k000858,... Jan 21 2014, 09:42 k000858 и все таки я не понимаю, почему нет варнинга на
К... Jan 21 2014, 12:29 Golikov A. а есть варнинг на
Кодuint32_t i;
printf(... Jan 21 2014, 16:12 k000858 Цитата(Golikov A. @ Jan 21 2014, 20:12) а... Jan 21 2014, 16:49  scifi Цитата(k000858 @ Jan 21 2014, 20:49) хоте... Jan 21 2014, 17:51 k000858 вопрос остается открытым, не важно откуда я его за... Jan 21 2014, 17:53 Golikov A. варнинг от функции printf, она пытается данный ей ... Jan 21 2014, 18:26 scifi Цитата(Golikov A. @ Jan 21 2014, 22:26) в... Jan 21 2014, 19:26 k000858 Цитата(Golikov A. @ Jan 21 2014, 22:26) н... Jan 22 2014, 03:45  Сергей Борщ Цитата(k000858 @ Jan 22 2014, 05:45) Код... Jan 22 2014, 06:44   k000858 Цитата(Сергей Борщ @ Jan 22 2014, 10:44) ... Jan 22 2014, 07:08    Golikov A. Цитата(k000858 @ Jan 22 2014, 11:08) а, т... Jan 22 2014, 11:44 Golikov A. ну как же не денется, денется конечно же...
просто... Jan 21 2014, 20:14 k000858 варнинга нет, это хорошо )
вы уж простите за мою д... Jan 22 2014, 13:23 scifi Цитата(k000858 @ Jan 22 2014, 17:23) ну т... Jan 22 2014, 15:06  k000858 Цитата(scifi @ Jan 22 2014, 19:06) И я та... Jan 22 2014, 15:12 Mihey_K Не вздумайте править библиотечные хидеры stdint.h,... Jan 26 2014, 02:29 k000858 Цитата(Mihey_K @ Jan 26 2014, 06:29) Не в... Feb 10 2014, 03:51 k000858 Т.е. компилятор пишет варнинги при использовании u... Mar 24 2014, 03:19 Сергей Борщ Цитата(k000858 @ Mar 24 2014, 05:19) хотя... Mar 24 2014, 03:42 k000858 ясно, значит настройки компилятора тут не причем.
... Mar 24 2014, 07:15
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|