PDA

View Full Version : [C] puntatori, non capisco questo operazione


buddace
12-06-2007, 09:22
ptVic_registers = (PVIC_REGISTERS)Addr_vic
Cosa fa questa riga ?
PVIC_REGISTERS è un puntatore ad una struttura.

andbin
12-06-2007, 09:36
ptVic_registers = (PVIC_REGISTERS)Addr_vic
Cosa fa questa riga ?
PVIC_REGISTERS è un puntatore ad una struttura.È un "cast", una conversione di tipo esplicita.
Nel tuo caso è una conversione tra 2 puntatori di tipo diverso.

buddace
13-06-2007, 10:00
typedef unsigned int UI32;

typedef struct NETX_GPIOtag
{
volatile UI32 auiCFG[16];
volatile UI32 auiTC[16];
volatile UI32 auiCOUNTER_CONTROL[5];
volatile UI32 auiCOUNTER_MAX[5];
volatile UI32 auiCOUNTER_CURRENT[5];
volatile UI32 uiIRQ_MASK_SET;
volatile UI32 uiIRQ_MASK_CLR;
volatile UI32 uiSYSTIME_NS_CMP;
volatile UI32 uiLINE_OUT;
volatile UI32 uiLINE_IN;
volatile UI32 uiIRQ;
} NETX_GPIO;

static NETX_GPIO* s_ptGPIO = (NETX_GPIO*)0x00100800;


Anche questa mi è poco chiara. Credo crei un puntatore ma mi è poco chiaro il meccanismo.

andbin
13-06-2007, 10:28
static NETX_GPIO* s_ptGPIO = (NETX_GPIO*)0x00100800;

Anche questa mi è poco chiara. Credo crei un puntatore ma mi è poco chiaro il meccanismo.Credi giusto, viene definita una variabile s_ptGPIO che è un puntatore alla struttura NETX_GPIO. La variabile viene inizializzata con un indirizzo costante e in questo caso si presuppone la conoscenza della architettura della macchina e delle zone di memoria.

buddace
13-06-2007, 10:46
L'indirizzo a cui viene inizializzato il puntatore è il primo registro di configurazione per le porte GPIO della macchina su cui sto lavorando.

Più avanti si trovano istruzioni di questo tipo:
s_ptGPIO->auiCOUNTER_CONTROL[ulCounter] = 0;
Dove in ulCounter va un "offset" del registro da configurare rispetto a quello iniziale in questo caso 0x80.
Se sommo 0x80 all'indirizzo inizializzato dovrei ottenere l'indirizzo del registro su cui mi interessa operare, giusto ?

andbin
13-06-2007, 11:10
Più avanti si trovano istruzioni di questo tipo:
s_ptGPIO->auiCOUNTER_CONTROL[ulCounter] = 0;
Dove in ulCounter va un "offset" del registro da configurare rispetto a quello iniziale in questo caso 0x80.
Se sommo 0x80 all'indirizzo inizializzato dovrei ottenere l'indirizzo del registro su cui mi interessa operare, giusto ?No.
auiCOUNTER_CONTROL è un campo della struttura formato da 5 valori di tipo UI32. Quindi ulCounter può essere 0...4.

buddace
13-06-2007, 11:14
No.
auiCOUNTER_CONTROL è un campo della struttura formato da 5 valori di tipo UI32. Quindi ulCounter può essere 0...4.
Grazie, è proprio cosi. C'è un errore nel file h che fornisce il produttore della macchina :D