[C con Clase] Ayuda directivas del compilador.

Grimas Cristian grimascristian en arnet.com.ar
Lun Mar 5 15:43:16 CET 2007


Necesitaría que me borren de la lista de correo, muchas gracias.

-----Mensaje original-----
De: cconclase-bounces en listas.conclase.net
[mailto:cconclase-bounces en listas.conclase.net] En nombre de Juan Antonio
Enviado el: Lunes, 05 de Marzo de 2007 10:28 a.m.
Para: Lista de correo sobre C y C++
Asunto: [C con Clase] Ayuda directivas del compilador.

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