Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ARM. типы Си-компилятора
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Doka
поделитесь ссылкою, по которой написано какие типы какой разрядности для ARM GCC (отсылка к ISO стандарту не подходит, ибо мало кто ему следует (e.g. TI с 16битным char))

переключают ли какие-либо из опций -ansi, -std=c89, -std=c99, -std=gnu89, -std=gnu99 принудительное следование ISO по части размеров типов?
Rst7
Я бы на Вашем месте пользовался типами класса (u)int8(16,32)_t во всех их проявлениях и не брал бы в голову. Кстати, 16тибитный char - вполне следует стандарту.
Doka
гугл навёл на догадку, что предлагается использовать предопределённые типы: http://linux.die.net/man/3/int8_t

но, имхо, для того чтобы их определить, и надо знать какой typedef в какуюразрядность отображается..
Rst7
Цитата
но, имхо, для того чтобы их определить, и надо знать какой typedef в какуюразрядность отображается..


Дык оно уже в инклудах рядом с гнусем (arch/include) заботливо уложено. stdint.h
forever failure
Вообще то 16 битный char полностью соответствует стандарту, т. к. стандарт требует, чтоб какой либо тип мог представить любое число не менее, чем от сих до сих. Для char - это не менее, чем 8 бит, больше можно, меньше нет.
Пользуйте stdint.h - будет вам щщастье, там все типы по количеству бит расписаны.
ReAl
Цитата(Doka @ Apr 26 2009, 18:33) *
но, имхо, для того чтобы их определить, и надо знать какой typedef в какуюразрядность отображается..
А что, разве у arm gcc нет в комплекте вполне ISOшных stdint.h (iso9899 - #7.18) inttypes.h (iso9899 - #7.2) ???
Что-то не верится.
forever failure
Всё там есть - и stdint.h и inttypes.h. С этим порядок, вообще, в смысле следования действующему стандарту - гцц самый православный компилятор.
Doka
да. действительно.. что-то есть такое в stdint.h:

CODE

#ifndef _STDINT_H
#define _STDINT_H

#ifdef __cplusplus
extern "C" {
#endif

#if defined(__GNUC__) && \
( (__GNUC__ >= 4) || \
( (__GNUC__ >= 3) && defined(__GNUC_MINOR__) && (__GNUC_MINOR__ > 2) ) )
/* gcc > 3.2 implicitly defines the values we are interested */
#define __STDINT_EXP(x) __##x##__
#else
#define __STDINT_EXP(x) x
#include <limits.h>
#endif

/* Check if "long long" is 64bit wide */
/* Modern GCCs provide __LONG_LONG_MAX__, SUSv3 wants LLONG_MAX */
#if ( defined(__LONG_LONG_MAX__) && (__LONG_LONG_MAX__ > 0x7fffffff) ) \
|| ( defined(LLONG_MAX) && (LLONG_MAX > 0x7fffffff) )
#define __have_longlong64 1
#endif

/* Check if "long" is 64bit or 32bit wide */
#if __STDINT_EXP(LONG_MAX) > 0x7fffffff
#define __have_long64 1
#elif __STDINT_EXP(LONG_MAX) == 0x7fffffff && !defined(__SPU__)
#define __have_long32 1
#endif

#if __STDINT_EXP(SCHAR_MAX) == 0x7f
typedef signed char int8_t;
typedef unsigned char uint8_t;
#define __int8_t_defined 1
#endif

#if __int8_t_defined
typedef signed char int_least8_t;
typedef unsigned char uint_least8_t;
#define __int_least8_t_defined 1
#endif

#if __STDINT_EXP(SHRT_MAX) == 0x7fff
typedef signed short int16_t;
typedef unsigned short uint16_t;
#define __int16_t_defined 1
#elif __STDINT_EXP(INT_MAX) == 0x7fff
typedef signed int int16_t;
typedef unsigned int uint16_t;
#define __int16_t_defined 1
#elif __STDINT_EXP(SCHAR_MAX) == 0x7fff
typedef signed char int16_t;
typedef unsigned char uint16_t;
#define __int16_t_defined 1
#endif

#if __int16_t_defined
typedef int16_t int_least16_t;
typedef uint16_t uint_least16_t;
#define __int_least16_t_defined 1

#if !__int_least8_t_defined
typedef int16_t int_least8_t;
typedef uint16_t uint_least8_t;
#define __int_least8_t_defined 1
#endif
#endif

#if __have_long32
typedef signed long int32_t;
typedef unsigned long uint32_t;
#define __int32_t_defined 1
#elif __STDINT_EXP(INT_MAX) == 0x7fffffffL
typedef signed int int32_t;
typedef unsigned int uint32_t;
#define __int32_t_defined 1
#elif __STDINT_EXP(SHRT_MAX) == 0x7fffffffL
typedef signed short int32_t;
typedef unsigned short uint32_t;
#define __int32_t_defined 1
#elif __STDINT_EXP(SCHAR_MAX) == 0x7fffffffL
typedef signed char int32_t;
typedef unsigned char uint32_t;
#define __int32_t_defined 1
#endif

#if __int32_t_defined
typedef int32_t int_least32_t;
typedef uint32_t uint_least32_t;
#define __int_least32_t_defined 1

#if !__int_least8_t_defined
typedef int32_t int_least8_t;
typedef uint32_t uint_least8_t;
#define __int_least8_t_defined 1
#endif

#if !__int_least16_t_defined
typedef int32_t int_least16_t;
typedef uint32_t uint_least16_t;
#define __int_least16_t_defined 1
#endif
#endif

#if __have_long64
typedef signed long int64_t;
typedef unsigned long uint64_t;
#define __int64_t_defined 1
#elif __have_longlong64
typedef signed long long int64_t;
typedef unsigned long long uint64_t;
#define __int64_t_defined 1
#elif __STDINT_EXP(INT_MAX) > 0x7fffffff
typedef signed int int64_t;
typedef unsigned int uint64_t;
#define __int64_t_defined 1
#endif

#if __int64_t_defined
typedef int64_t int_least64_t;
typedef uint64_t uint_least64_t;
#define __int_least64_t_defined 1

#if !__int_least8_t_defined
typedef int64_t int_least8_t;
typedef uint64_t uint_least8_t;
#define __int_least8_t_defined 1
#endif

#if !__int_least16_t_defined
typedef int64_t int_least16_t;
typedef uint64_t uint_least16_t;
#define __int_least16_t_defined 1
#endif

#if !__int_least32_t_defined
typedef int64_t int_least32_t;
typedef uint64_t uint_least32_t;
#define __int_least32_t_defined 1
#endif
#endif

/*
* Fastest minimum-width integer types
*
* Assume int to be the fastest type for all types with a width
* less than __INT_MAX__ rsp. INT_MAX
*/
#if __STDINT_EXP(INT_MAX) >= 0x7f
typedef signed int int_fast8_t;
typedef unsigned int uint_fast8_t;
#define __int_fast8_t_defined 1
#endif

#if __STDINT_EXP(INT_MAX) >= 0x7fff
typedef signed int int_fast16_t;
typedef unsigned int uint_fast16_t;
#define __int_fast16_t_defined 1
#endif

#if __STDINT_EXP(INT_MAX) >= 0x7fffffff
typedef signed int int_fast32_t;
typedef unsigned int uint_fast32_t;
#define __int_fast32_t_defined 1
#endif

#if __STDINT_EXP(INT_MAX) > 0x7fffffff
typedef signed int int_fast64_t;
typedef unsigned int uint_fast64_t;
#define __int_fast64_t_defined 1
#endif

/*
* Fall back to [u]int_least<N>_t for [u]int_fast<N>_t types
* not having been defined, yet.
* Leave undefined, if [u]int_least<N>_t should not be available.
*/
#if !__int_fast8_t_defined
#if __int_least8_t_defined
typedef int_least8_t int_fast8_t;
typedef uint_least8_t uint_fast8_t;
#define __int_fast8_t_defined 1
#endif
#endif

#if !__int_fast16_t_defined
#if __int_least16_t_defined
typedef int_least16_t int_fast16_t;
typedef uint_least16_t uint_fast16_t;
#define __int_fast16_t_defined 1
#endif
#endif

#if !__int_fast32_t_defined
#if __int_least32_t_defined
typedef int_least32_t int_fast32_t;
typedef uint_least32_t uint_fast32_t;
#define __int_fast32_t_defined 1
#endif
#endif

#if !__int_fast64_t_defined
#if __int_least64_t_defined
typedef int_least64_t int_fast64_t;
typedef uint_least64_t uint_fast64_t;
#define __int_fast64_t_defined 1
#endif
#endif

/* Greatest-width integer types */
/* Modern GCCs provide __INTMAX_TYPE__ */
#if defined(__INTMAX_TYPE__)
typedef __INTMAX_TYPE__ intmax_t;
#elif __have_longlong64
typedef signed long long intmax_t;
#else
typedef signed long intmax_t;
#endif

/* Modern GCCs provide __UINTMAX_TYPE__ */
#if defined(__UINTMAX_TYPE__)
typedef __UINTMAX_TYPE__ uintmax_t;
#elif __have_longlong64
typedef unsigned long long uintmax_t;
#else
typedef unsigned long uintmax_t;
#endif

/*
* GCC doesn't provide an appropriate macro for [u]intptr_t
* For now, use __PTRDIFF_TYPE__
*/
#if defined(__PTRDIFF_TYPE__)
typedef signed __PTRDIFF_TYPE__ intptr_t;
typedef unsigned __PTRDIFF_TYPE__ uintptr_t;
#else
/*
* Fallback to hardcoded values,
* should be valid on cpu's with 32bit int/32bit void*
*/
typedef signed long intptr_t;
typedef unsigned long uintptr_t;
#endif

/* Limits of Specified-Width Integer Types */

#if __int8_t_defined
#define INT8_MIN -128
#define INT8_MAX 127
#define UINT8_MAX 255
#endif

#if __int_least8_t_defined
#define INT_LEAST8_MIN -128
#define INT_LEAST8_MAX 127
#define UINT_LEAST8_MAX 255
#else
#error required type int_least8_t missing
#endif

#if __int16_t_defined
#define INT16_MIN -32768
#define INT16_MAX 32767
#define UINT16_MAX 65535
#endif

#if __int_least16_t_defined
#define INT_LEAST16_MIN -32768
#define INT_LEAST16_MAX 32767
#define UINT_LEAST16_MAX 65535
#else
#error required type int_least16_t missing
#endif

#if __int32_t_defined
#if __have_long32
#define INT32_MIN (-2147483647L-1)
#define INT32_MAX 2147483647L
#define UINT32_MAX 4294967295UL
#else
#define INT32_MIN (-2147483647-1)
#define INT32_MAX 2147483647
#define UINT32_MAX 4294967295U
#endif
#endif

#if __int_least32_t_defined
#if __have_long32
#define INT_LEAST32_MIN (-2147483647L-1)
#define INT_LEAST32_MAX 2147483647L
#define UINT_LEAST32_MAX 4294967295UL
#else
#define INT_LEAST32_MIN (-2147483647-1)
#define INT_LEAST32_MAX 2147483647
#define UINT_LEAST32_MAX 4294967295U
#endif
#else
#error required type int_least32_t missing
#endif

#if __int64_t_defined
#if __have_long64
#define INT64_MIN (-9223372036854775807L-1L)
#define INT64_MAX 9223372036854775807L
#define UINT64_MAX 18446744073709551615U
#elif __have_longlong64
#define INT64_MIN (-9223372036854775807LL-1LL)
#define INT64_MAX 9223372036854775807LL
#define UINT64_MAX 18446744073709551615ULL
#endif
#endif

#if __int_least64_t_defined
#if __have_long64
#define INT_LEAST64_MIN (-9223372036854775807L-1L)
#define INT_LEAST64_MAX 9223372036854775807L
#define UINT_LEAST64_MAX 18446744073709551615U
#elif __have_longlong64
#define INT_LEAST64_MIN (-9223372036854775807LL-1LL)
#define INT_LEAST64_MAX 9223372036854775807LL
#define UINT_LEAST64_MAX 18446744073709551615ULL
#endif
#endif

#if __int_fast8_t_defined
#if __STDINT_EXP(INT_MAX) >= 0x7f
#define INT_FAST8_MIN (-__STDINT_EXP(INT_MAX)-1)
#define INT_FAST8_MAX __STDINT_EXP(INT_MAX)
#define UINT_FAST8_MAX (__STDINT_EXP(INT_MAX)*2U+1U)
#else
#define INT_FAST8_MIN INT_LEAST8_MIN
#define INT_FAST8_MAX INT_LEAST8_MAX
#define UINT_FAST8_MAX UINT_LEAST8_MAX
#endif
#endif

#if __int_fast16_t_defined
#if __STDINT_EXP(INT_MAX) >= 0x7fff
#define INT_FAST16_MIN (-__STDINT_EXP(INT_MAX)-1)
#define INT_FAST16_MAX __STDINT_EXP(INT_MAX)
#define UINT_FAST16_MAX (__STDINT_EXP(INT_MAX)*2U+1U)
#else
#define INT_FAST16_MIN INT_LEAST16_MIN
#define INT_FAST16_MAX INT_LEAST16_MAX
#define UINT_FAST16_MAX UINT_LEAST16_MAX
#endif
#endif

#if __int_fast32_t_defined
#if __STDINT_EXP(INT_MAX) >= 0x7fffffff
#define INT_FAST32_MIN (-__STDINT_EXP(INT_MAX)-1)
#define INT_FAST32_MAX __STDINT_EXP(INT_MAX)
#define UINT_FAST32_MAX (__STDINT_EXP(INT_MAX)*2U+1U)
#else
#define INT_FAST32_MIN INT_LEAST32_MIN
#define INT_FAST32_MAX INT_LEAST32_MAX
#define UINT_FAST32_MAX UINT_LEAST32_MAX
#endif
#endif

#if __int_fast64_t_defined
#if __STDINT_EXP(INT_MAX) > 0x7fffffff
#define INT_FAST64_MIN (-__STDINT_EXP(INT_MAX)-1)
#define INT_FAST64_MAX __STDINT_EXP(INT_MAX)
#define UINT_FAST64_MAX (__STDINT_EXP(INT_MAX)*2U+1U)
#else
#define INT_FAST64_MIN INT_LEAST64_MIN
#define INT_FAST64_MAX INT_LEAST64_MAX
#define UINT_FAST64_MAX UINT_LEAST64_MAX
#endif
#endif

#ifdef __INTMAX_MAX__
#define INTMAX_MAX __INTMAX_MAX__
#define INTMAX_MIN (-INTMAX_MAX - 1)
#elif defined(__INTMAX_TYPE__)
/* All relevant GCC versions prefer long to long long for intmax_t. */
#define INTMAX_MAX INT64_MAX
#define INTMAX_MIN INT64_MIN
#endif

#ifdef __UINTMAX_MAX__
#define UINTMAX_MAX __UINTMAX_MAX__
#elif defined(__UINTMAX_TYPE__)
/* All relevant GCC versions prefer long to long long for intmax_t. */
#define UINTMAX_MAX UINT64_MAX
#endif

/* This must match size_t in stddef.h, currently long unsigned int */
#ifdef __SIZE_MAX__
#define SIZE_MAX __SIZE_MAX__
#else
#define SIZE_MAX (__STDINT_EXP(LONG_MAX) * 2UL + 1)
#endif

/* This must match sig_atomic_t in <signal.h> (currently int) */
#define SIG_ATOMIC_MIN (-__STDINT_EXP(INT_MAX) - 1)
#define SIG_ATOMIC_MAX __STDINT_EXP(INT_MAX)

/* This must match ptrdiff_t in <stddef.h> (currently long int) */
#ifdef __PTRDIFF_MAX__
#define PTRDIFF_MAX __PTRDIFF_MAX__
#else
#define PTRDIFF_MAX __STDINT_EXP(LONG_MAX)
#endif
#define PTRDIFF_MIN (-PTRDIFF_MAX - 1)

#ifdef __WCHAR_MAX__
#define WCHAR_MAX __WCHAR_MAX__
#endif
#ifdef __WCHAR_MIN__
#define WCHAR_MIN __WCHAR_MIN__
#endif

/* wint_t is unsigned int on almost all GCC targets. */
#ifdef __WINT_MAX__
#define WINT_MAX __WINT_MAX__
#else
#define WINT_MAX (__STDINT_EXP(INT_MAX) * 2U + 1U)
#endif
#ifdef __WINT_MIN__
#define WINT_MIN __WINT_MIN__
#else
#define WINT_MIN 0U
#endif

/** Macros for minimum-width integer constant expressions */
#define INT8_C(x) x
#if __STDINT_EXP(INT_MAX) > 0x7f
#define UINT8_C(x) x
#else
#define UINT8_C(x) x##U
#endif

#define INT16_C(x) x
#if __STDINT_EXP(INT_MAX) > 0x7fff
#define UINT16_C(x) x
#else
#define UINT16_C(x) x##U
#endif

#if __have_long32
#define INT32_C(x) x##L
#define UINT32_C(x) x##UL
#else
#define INT32_C(x) x
#define UINT32_C(x) x##U
#endif

#if __int64_t_defined
#if __have_longlong64
#define INT64_C(x) x##LL
#define UINT64_C(x) x##ULL
#else
#define INT64_C(x) x##L
#define UINT64_C(x) x##UL
#endif
#endif

/** Macros for greatest-width integer constant expression */
#if __have_longlong64
#define INTMAX_C(x) x##LL
#define UINTMAX_C(x) x##ULL
#else
#define INTMAX_C(x) x##L
#define UINTMAX_C(x) x##UL
#endif


#ifdef __cplusplus
}
#endif

#endif /* _STDINT_H */


мне надо использовать старый код на архитектуре ARM.
(в нём используются универсальное переопределение типов: u8, s,8, u16, s16, etc)
для этого, как я понимаю надо прописать что-то вроде:
Код
  #include <stdint.h>
  typedef uint8_t u8;


?
forever failure
Ну, дык вот, в том месте проекта, где все эти u8, s8, u16, s16 объявлены их и объявить в соответствии с типами stdint.h
Rst7
Цитата
мне надо использовать старый код на архитектуре ARM.
(в нём используются универсальное переопределение типов: u8, s,8, u16, s16, etc)
для этого, как я понимаю надо прописать что-то вроде:


Эээ, тут теперь все зависит от того, насколько старый код был грамотно написан. Давайте потелепатирую... Старый код - это AVR? Тогда, боюсь, будете стреляться с регистровыми переменными формата u8. Их надо объявлять uint8_fast_t, иначе код будет гуано на арме. Но с другой стороны, это будет стоить 32 бита в ОЗУ. Т.е. в озушных переменных надо объявлять именно uint8_t. И т.д. Вообщем, надо подходить творчески к переделке....
Doka
Цитата(forever failure @ Apr 26 2009, 20:36) *
Ну, дык вот, в том месте проекта, где все эти u8, s8, u16, s16 объявлены их и объявить в соответствии с типами stdint.h

по-хорошему, так и стоило бы сделать, но в данной задаче крайне нежелательны какие-либо изменения имеющегося кода (из соображений вовсе не инженерно-программерского толка).


---------------------------------------------------------
а что бы полезного еще можно было почитать для эмбеддера, перелезающего на GNU инструментарий помимо http://developer.apple.com/documentation/d...Extensions.html и вместо man gcc.. что-нибудь ARM-ориентированное..

В книжке Тревора Мартина (по LPC2000) как-то совсем мало (ибо упор на Keil)...
200стр PDF от Atmel как-то больше на администратора ориентирован (где скачать, как установить, как настроить), а не на разаботчика..

а хочется чего-то про правильную методологию..............
_Pasha
Цитата(Doka @ Apr 26 2009, 19:52) *
а хочется чего-то про правильную методологию..............

А че там сложного? _least_ и _fast_ это все понятно, где пользовать. А там, где просматривается четкая абстракция "предназначения" данных - не стесняться называть своим типом. Я о случае size_t, например. Или для тиков таймера timer_t. Вот я все нехитрое искусство, имхо.
Doka
Цитата(_Pasha @ Apr 26 2009, 21:18) *
А че там сложного? _least_ и _fast_ это все понятно, где пользовать. А там, где просматривается четкая абстракция "предназначения" данных - не стесняться называть своим типом. Я о случае size_t, например. Или для тиков таймера timer_t. Вот я все нехитрое искусство, имхо.


вот для меня вышенаписанное пока еще птичий язык..
поэтому и хотелось бы литературы просветляющей перед обретением нового опыта почитать.. чтобы также казалось искусство нехитрым rolleyes.gif
aaarrr
Цитата(Doka @ Apr 26 2009, 21:29) *
поэтому и хотелось бы литературы просветляющей перед обретением нового опыта почитать.. чтобы также казалось искусство нехитрым rolleyes.gif

Стандарт C99 - там все вполне себе описано.
alx2
Цитата(Doka @ Apr 26 2009, 15:51) *
переключают ли какие-либо из опций -ansi, -std=c89, -std=c99, -std=gnu89, -std=gnu99 принудительное следование ISO по части размеров типов?
Насколько я мог заметить, gcc следует стандарту по части размера типов в любом из перечисленных режимов.
Doka
Цитата(Rst7 @ Apr 26 2009, 20:45) *
Эээ, тут теперь все зависит от того, насколько старый код был грамотно написан. Давайте потелепатирую... Старый код - это AVR? Тогда, боюсь, будете стреляться с регистровыми переменными формата u8. Их надо объявлять uint8_fast_t, иначе код будет гуано на арме. Но с другой стороны, это будет стоить 32 бита в ОЗУ. Т.е. в озушных переменных надо объявлять именно uint8_t. И т.д. Вообщем, надо подходить творчески к переделке....

старый код - неDSPiшная часть приложения для TI С5500
Сергей Борщ
Цитата(alx2 @ Apr 27 2009, 03:20) *
Насколько я мог заметить, gcc следует стандарту по части размера типов в любом из перечисленных режимов.
Особенно если учесть, что в стандарте не прописаны конкретные размеры типов.
alx2
Цитата(Сергей Борщ @ Apr 27 2009, 12:16) *
Особенно если учесть, что в стандарте не прописаны конкретные размеры типов.
Совершенно верно. Поскольку спецификация языка накладывает на компилятор не такие уж жесткие требования в части размера типов, следование им не составляет большого труда.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.