TODOPIC
Lenguajes de programación para PC => C, C#, C++ => Mensaje iniciado por: migsantiago en 14 de Marzo de 2008, 18:29:16
-
Hola
Estoy estudiando una librería en donde se definen los tipos de variables que un compilador usa. Me encuentro con variables nuevas para mi. Las pongo a continuación.
/*+----------------------------------------------------------------------------------------------+*/
typedef unsigned char u8; ///< 8bit unsigned integer
typedef unsigned short u16; ///< 16bit unsigned integer
typedef unsigned int u32; ///< 32bit unsigned integer
typedef unsigned long long u64; ///< 64bit unsigned integer
/*+----------------------------------------------------------------------------------------------+*/
typedef signed char s8; ///< 8bit signed integer
typedef signed short s16; ///< 16bit signed integer
typedef signed int s32; ///< 32bit signed integer
typedef signed long long s64; ///< 64bit signed integer
/*+----------------------------------------------------------------------------------------------+*/
typedef volatile unsigned char vu8; ///< 8bit unsigned volatile integer
typedef volatile unsigned short vu16; ///< 16bit unsigned volatile integer
typedef volatile unsigned int vu32; ///< 32bit unsigned volatile integer
typedef volatile unsigned long long vu64; ///< 64bit unsigned volatile integer
/*+----------------------------------------------------------------------------------------------+*/
typedef volatile signed char vs8; ///< 8bit signed volatile integer
typedef volatile signed short vs16; ///< 16bit signed volatile integer
typedef volatile signed int vs32; ///< 32bit signed volatile integer
typedef volatile signed long long vs64; ///< 64bit signed volatile integer
/*+----------------------------------------------------------------------------------------------+*/
// fixed point math typedefs
typedef s16 sfp16; ///< 1:7:8 fixed point
typedef s32 sfp32; ///< 1:19:8 fixed point
typedef u16 ufp16; ///< 8:8 fixed point
typedef u32 ufp32; ///< 24:8 fixed point
/*+----------------------------------------------------------------------------------------------+*/
typedef float f32;
typedef double f64;
/*+----------------------------------------------------------------------------------------------+*/
typedef volatile float vf32;
typedef volatile double vf64;
/*+----------------------------------------------------------------------------------------------+*/
typedef unsigned int BOOL;
/*+----------------------------------------------------------------------------------------------+*/
// alias type typedefs
#define FIXED s32 ///< Alias type for sfp32
/*+----------------------------------------------------------------------------------------------+*/
¿Me podrían explicar las siguientes por favor?
unsigned volatile integer
signed volatile integer
fixed point
volatile float
volatile double
¿Por qué son valátiles? ¿Toda la RAM es volátil no? ¿Por qué punto fijo y no flotante? :z)
Gracias
-
A que compilador pertenecen??
-
Hola, el calificador "volatile" instruye al compilador para que no haga ninguna optimizacion sobre la misma y acceda tal cual aparece en el codigo, normalmente en cualquier compilador para embebidos el compilador optimza mucho, ejemplo
...
volatile byte Register; // assumimos que es un registro del micro
byte Prueba;
Prueba = Register;
Prueba = Register;
Prueba = Register;
Si la variable no es "calificada" como volatile el compilador elimina las dos primeras lineas, porque asume que es una operacion sin sentido, al colocar volatile el compilador no optimiza nada, y las tres asignaciones son hechas.
Saludos
-
Richi, ¿entonces conviene usarlas? Porque mejor sigo usando las antiguas int, float, long, etc. No estoy haciendo programas complejos ni importa la velocidad con que se ejecuten.
MGLSoft, estoy adentrándome al compilador que trae el devkitPro (http://www.devkitpro.org/) para el Nintendo Gamecube. Estoy haciendo mi segundo programa, el primero fue el Hello World :D
Estaba estudiando las variables que puedo usar y me encontré con esas raras.
Todavía tengo la duda de qué es fixed point.
-
Santiago, normalmente se usan cuando interactuas con el hardware o cuando usas una variable compartida con algun handler de interrupcion. Con respecto a los nombres fixed, integer son llamados typedefs que no son ni mas ni menos que tipos definidos por el usuario para mejor claridad del codigo, ejemplo en "C" standart el Bool no esta implementado es decir no es un tipo de datos intrinsico del lenguaje como lo es char, int, long pero con un simple arreglo se puede definir
typedef unsigned char Bool
El compilador sabe ahora que el tipo Bool es un unsigned char
En el compilador que estas usuando se define asi
*+----------------------------------------------------------------------------------------------+*/
typedef unsigned int BOOL;
/*+----------------------------------------------------------------------------------------------+*/
En este caso se define como un entero, esto se hace para optimizar el uso del tipo de datos que el micro ( en tu caso seguro que es de 32 bits o mas ) puede manejar mas rapidamente...pero esto es tema para otro post.
Con respecto a Fixed Point se refiere a operando de punto fijo es decir no posee decimales como los floats, double como veras solo es una cuestion de notacion.
Saludos !
-
Ohh, entonces el fixed point, ¿se puede considerar como un unsigned int por ejemplo?
El procesador del Nintendo es de 128bits, pero la variable int es trabajada por el compilador a 32bits.
-
Ohh, entonces el fixed point, ¿se puede considerar como un unsigned int por ejemplo?
Correcto !
El procesador del Nintendo es de 128bits, pero la variable int es trabajada por el compilador a 32bits.
Pabada de micro tiene :lol:
Saludos !
-
Hola de nuevo
¿Qué significa una declaración de variable así?
extern u8 variable[];
Sé que es una cadena de chars de tamaño indefinido, pero ¿qué se logra con ponerle extern? :o
-
La idea es que tengo vision global, el compilador trata a la variable como esta declarada ( U8 char * ) y el linker define la direccion real de la misa, obvio que en algun modulo debe estar declarada. Basicamente es lo mismo cuando en assembler declaras variables como PUBLIC y EXTERN.
Saludos !
-
Ah OK, entonces es global nadamás. Tenía la idea de que al poner extern se usaba otra memoria RAM externa, y como el Nintendo tiene memoria RAM de audio, creí que era esa.
Gracias Richi
-
La etiqueta extern se pone cuando una variable esta declarada en otro fichero y dado que solo se puede resolver en tiempo de "linkado", para evitar que el compilador de un error de variable no declarada, se utiliza esta etiqueta.
Un saludo
-
Mmhh, sí, de hecho la llena con lo obtenido de un archivo .s, pero estoy viendo si alguien me puede ayudar... :mrgreen:
http://www.todopic.com.ar/foros/index.php?topic=21215.0
-
Mi consejo es que las variables las definas siempre como su tipado normal.
Usa el modo "volatile" cuando la variable sea global y no solo se modifique en la rutina actual sino que pueda ser modificada por otras rutinas de modo inesperado ya sea por interrupción (caso típico de microcontroladores) o por "eventos" que serían interrupciones al flujo normal de ejecución de un programa, esto último ya aplica más a sistemas operativos como windows o linux.
-
OK, Maunix.
Es que en los programas de ejemplo que veo en este compilador para el Gamecube, estoy viendo puras variables raras y métodos de rellenarlas igual de raros.
-
OK, Maunix.
Es que en los programas de ejemplo que veo en este compilador para el Gamecube, estoy viendo puras variables raras y métodos de rellenarlas igual de raros.
Lo de los métodos de rellenarlas podrías postearlos y vemos si los podemos comprender
Lo de las 'variables raras' que mencionaste más arriba en el post, en realidad simplemente es una forma de "cambiar el nombre" de un tipo de variable ya sea para abreviar su sintaxis (vu8 sería volatile unsigned char) o también para unificar tipos de variables entre compiladores.
A veces sucede que uno usa varios compiladores para una misma plataforma o bien usa varias plataformas, y quiere que un código se " lo más transportable posible " entre compiladores y entre plataformas. Entonces, una forma es declarar tipos de variable que signifiquen lo mismo sin depender de la plataforma.
Para ser más claro
Por ejemplo, en ccs el tipo int es un tipo de 8 bits. En C18 int es un tipo de 16 bits. Si quisiéramos copiar/pegar un código de C18 en ccs sin tener en cuenta ese pequeño gran detalle, el código es muy muy muy posible que no funcione. Entonces una forma sería hacer un archivo .h de encabezados en CCS y otro en C18. Ambos de mismo nombre pero diferente contenido.
Ese archivo podría tener algo así como
En CCS
typedef BYTE int
En C18
typedef BYTE char
Luego en el código "transportable" declararíamos las variables como BYTE y asunto solucionado.
-
Hola
La forma en cómo las rellenan ya la tengo más clara, puedes ver el código en el tema ASM Stub.
Ahora veo porque los nombres raros, es que en CCS nunca había visto un volatile o un extern :mrgreen:
-
Que salto que pegaste !!! de un PIC de 8 bits a un PowerPc de 128 :lol:
Saludos !
-
jajaja
Es igual de divertido programarlos, los dos se programan en c, no hay diferencia.
-
jajaja
Es igual de divertido programarlos, los dos se programan en c, no hay diferencia.
Jejeje... me hiciste reír de buena forma con eso de que no hay diferencia por el hecho de que se programen en C.
Ten cuidado con eso!! Saber de C, no te evita tener que conocer el hardware que estás programando cuando usas microcontroladores. Para algunas cosas podrá ser transparente pero para otras te verás liado si no has prestado atención a la arquitectura. Es solo un consejo ;) ;)
-
jeje
Sí, claro que hay diferencia, pero conociendo c se puede batallar con ambos al mismo tiempo, c ayuda a alejarse un poco del nivel hardware. Por ejemplo, cuando leo archivos de la memoria sd, no me fijo en que protocolo usa ni a qué voltaje opera el puerto del cubo, solo le digo, léeme este archivo :D
Pero siempre hay que conocer el hardware, al final es lo que limita a uno para poder hacer programas optimizados.
-
Sí, claro que hay diferencia, pero conociendo c se puede batallar con ambos al mismo tiempo, c ayuda a alejarse un poco del nivel hardware. Por ejemplo, cuando leo archivos de la memoria sd, no me fijo en que protocolo usa ni a qué voltaje opera el puerto del cubo, solo le digo, léeme este archivo :D
Si, depende del hardware , de si cuentas con un sistema operativo , de si dicho sistema operativo tiene además algún driver para accesar a la memoria SD, etc. En esos casos con usar las clásicas funciones fopen, fread, fwrite, etc alcanza.
Pero siempre hay que conocer el hardware, al final es lo que limita a uno para poder hacer programas optimizados.
Mi respuesta apuntaba más a algún hardware embebido, donde tengas o no un OS, pero debas conocer a fondo todo el hardware para hacerlo andar bien. :)