[C con Clase] Ayuda directivas del compilador.

Juan Antonio jalr43 en hotmail.com
Lun Mar 5 14:27:10 CET 2007


Hola,

estoy trabajando con unos cacharrillos que tienen la finalidad de ser 
sensores inalámbricos remotos que se conocen como motes. Como son remotos 
usan baterías y claro tienen incluso su propio sistema operativo (TinyOS) 
para optimizar el consumo y facilitar las tareas de envío y recepción de 
datos. Se programan en nesC, C con añadidos para programación orientada a 
componentes. Interfaces, componentes, conexión entre interfaces y todas 
estas historias que programando a alto nivel son muy bonitas pero cuando se 
mete un poco por las partes bajas se lleva unos sustos impresionantes. El 
mote incluye un microcontrolador por lo que el código nesC al final se 
traducirá en ensamblador entendido por el microcontrolador.

Bueno voy al asunto en cuestión: me han pedido explicar como funciona todo 
este asunto hasta lo más bajo que pueda llegar para un componente de alto 
nivel que hace temporizaciones. Dentro de la implementación del mismo entre 
otras muchas cosas aparece:

MSP430REG_NORACE(TACTL);    // Tiene pinta de ser algo relacionado con timer 
A control

En un .h (msp430hardware.h) aparece:

//**********************************************************************
#undef norace

#define MSP430REG_NORACE_EXPAND(type,name,addr) \
norace static volatile type name asm(#addr)

#define MSP430REG_NORACE3(type,name,addr) \
MSP430REG_NORACE_EXPAND(type,name,addr)

// MSP430REG_NORACE and MSP430REG_NORACE2 presume naming conventions among
// type, name, and addr, which are defined in the local header
// msp430regtypes.h and mspgcc's header io.h and its children.

#define MSP430REG_NORACE2(rename,name) \
MSP430REG_NORACE3(TYPE_##name,rename,name##_)

#define MSP430REG_NORACE(name) \
MSP430REG_NORACE3(TYPE_##name,name,name##_)
//***********************************************************************

Entonces creo que tras hacer las sustituciones de los defines se llega a:

MSP430REG_NORACE(TACTL);    -->    norace static volatile TYPE_TACTL TACTL 
asm(TACTL_)

TYPE_TACTL está definido en otro .h y es igual al tipo uint16_t (un nuevo 
tipo de datos definido por nesC).

El problema lo tengo con TACTL y TACTL_. El el fichero timera.h aparece 
esto:

/* Alternate register names */
..
#define TACTL               TA0CTL
..

y más arriba en el mismo fichero:

..
#define TA0CTL_             0x0160  /* Timer A 0 Control */
sfrw (TA0CTL,TA0CTL_);
..

Bueno de nuevo a buscar otra cosa (sfrw). Está en otro puntito h 
(iomacros.h), que también requiere de varías sustituciones:

#ifdef __cplusplus
    #define sfrb_(x,x_) \
    extern "C" volatile unsigned char x asm(#x_)

    #define sfrw_(x,x_) \
    extern "C" volatile unsigned int x asm(#x_)
#else //__cplusplus
    #define sfrb_(x,x_) \
    volatile unsigned char x asm(#x_)

    #define sfrw_(x,x_) \
    volatile unsigned int x asm(#x_)
#endif //__cplusplus

#define sfrb(x,x_) \
sfrb_(x,x_)

#define sfrw(x,x_) \
sfrw_(x,x_)

/*
 *  Defines for assembler.
 *  hope there is a better way to do this.
 */
#ifdef _GNU_ASSEMBLER_

#define sfrb(x,x_) x=x_
#define sfrw(x,x_) x=x_

#endif

Bueno sigo la ruta:

sfrw (TA0CTL,TA0CTL_); --> sfrw_ (TA0CTL,TA0CTL_); --> (al margen de que 
extern "C" esté delante)

volatile unsigned char TA0CTL asm(#TA0CTL_)

Bueno como ven ando algo tirando a bastante perdido...espero que puedan 
ayudarme con la instrucción final resultante.

Otra cosa, ¿asm es propia ya de C o C++?

Un saludo,
Juan Antonio. 





Más información sobre la lista de distribución Cconclase