- Messaggi: 6
- Ringraziamenti ricevuti 0
MSP430, Microcontrollori 16 bit Ultra Low Power
[CCS - C] Aritmetica dei puntatori
- nicolapc
- Autore della discussione
- Nuovo Utente
Less
Di più
10 Anni 5 Mesi fa #1
da nicolapc
[CCS - C] Aritmetica dei puntatori è stato creato da nicolapc
Ciao a tutti, vi espongo il mio quesito.
Ho implementato una routine:
pin_high (porta,pin);
la quale, a seconda del valore di "porta" (1 o 2) porta alto il piedino "pin" (0..7) del MSP430(g2553).
Adesso che voglio riscriverla in maniera piu' compatta e "veloce" ho fatto questo:
void pin_high ( char porta, char pin)
{
char bi;
char *pinOUT ;
char *pinDIR ;
porta <<= 3 ; // = porta * 8 , cioe' 0x8 o 0x10
bi = ( 1 << pin);
pinOUT = 0x19 + porta ; // a seconda di porta diventa 0x21 o 0x29, cioe' P1OUT o P2OUT
pinDIR = 0x1A + porta ; // a seconda di porta diventa 0x22 o 0x2A, cioe' P1DIR o P2DIR
*pinOUT |= bi; //set uscita alta
*pinDIR |= bi; //set come output
}
in pratica ho eliminato il vecchio switch - case e punto direttamente alla memoria del MSP.
Al momento sembra funzionare tutto, ma in compilazione (CCS 6.0) ho questi warning:
"../main.c", line 44: warning #515- a value of type "int" cannot be assigned to an entity of type "char *"
alla altezza delle righe in cui faccio
pinOUT = 0x19 + porta ; // a seconda di porta diventa 0x21 o 0x29, cioe' P1OUT o P2OUT
pinDIR = 0x1A + porta ; // a seconda di porta diventa 0x22 o 0x2A, cioe' P1DIR o P2DIR
cosa significano quei warning? Come posso toglierli?
Ciao e grazie,
Nico
Ho implementato una routine:
pin_high (porta,pin);
la quale, a seconda del valore di "porta" (1 o 2) porta alto il piedino "pin" (0..7) del MSP430(g2553).
Adesso che voglio riscriverla in maniera piu' compatta e "veloce" ho fatto questo:
void pin_high ( char porta, char pin)
{
char bi;
char *pinOUT ;
char *pinDIR ;
porta <<= 3 ; // = porta * 8 , cioe' 0x8 o 0x10
bi = ( 1 << pin);
pinOUT = 0x19 + porta ; // a seconda di porta diventa 0x21 o 0x29, cioe' P1OUT o P2OUT
pinDIR = 0x1A + porta ; // a seconda di porta diventa 0x22 o 0x2A, cioe' P1DIR o P2DIR
*pinOUT |= bi; //set uscita alta
*pinDIR |= bi; //set come output
}
in pratica ho eliminato il vecchio switch - case e punto direttamente alla memoria del MSP.
Al momento sembra funzionare tutto, ma in compilazione (CCS 6.0) ho questi warning:
"../main.c", line 44: warning #515- a value of type "int" cannot be assigned to an entity of type "char *"
alla altezza delle righe in cui faccio
pinOUT = 0x19 + porta ; // a seconda di porta diventa 0x21 o 0x29, cioe' P1OUT o P2OUT
pinDIR = 0x1A + porta ; // a seconda di porta diventa 0x22 o 0x2A, cioe' P1DIR o P2DIR
cosa significano quei warning? Come posso toglierli?
Ciao e grazie,
Nico
Si prega Accesso o Crea un account a partecipare alla conversazione.
10 Anni 5 Mesi fa #2
da Mauro Laurenti
Risposta da Mauro Laurenti al topic [CCS - C] Aritmetica dei puntatori
Ciao,
credo sia semplicemente dovuto al fatto che fai uso delle costanti, che considera intere.
Infatti nel copiare la costante 0x19, il compilatore fa comunque uso di un registro a 16 bit (visto che l'architettura e' a 16 bit). In ogni modo anche se fosse un char, formalmente non sarebbe un char * per cui avresti comunque una warning.
per risolvere dovrebbe bastare un casting:
Saluti,
Mauro
credo sia semplicemente dovuto al fatto che fai uso delle costanti, che considera intere.
Infatti nel copiare la costante 0x19, il compilatore fa comunque uso di un registro a 16 bit (visto che l'architettura e' a 16 bit). In ogni modo anche se fosse un char, formalmente non sarebbe un char * per cui avresti comunque una warning.
per risolvere dovrebbe bastare un casting:
Code:
pinOUT = (char *) (0x19 + porta) ; // a seconda di porta diventa 0x21 o 0x29, cioe' P1OUT o P2OUT
pinDIR = (char *) (0x1A + porta) ; // a seconda di porta diventa 0x22 o 0x2A, cioe' P1DIR o P2DIR
Saluti,
Mauro
I seguenti utenti hanno detto grazie : nicolapc
Si prega Accesso o Crea un account a partecipare alla conversazione.
- nicolapc
- Autore della discussione
- Nuovo Utente
Less
Di più
- Messaggi: 6
- Ringraziamenti ricevuti 0
10 Anni 5 Mesi fa #3
da nicolapc
Risposta da nicolapc al topic [CCS - C] Aritmetica dei puntatori
Hai ragione, cosi' funziona. Avevo sospettato qualcosa di simile, ma non sapevo che nel (char) ci si potesse mettere l'asterisco. Bisogna proprio che mi rilegga il K&R..!
Grazie per la soluzione al mio problema e per la rapidita' con cui l'hai fornita, ciao.
Nico
Grazie per la soluzione al mio problema e per la rapidita' con cui l'hai fornita, ciao.
Nico
Si prega Accesso o Crea un account a partecipare alla conversazione.
10 Anni 5 Mesi fa #4
da Mauro Laurenti
Risposta da Mauro Laurenti al topic [CCS - C] Aritmetica dei puntatori
Ciao Nico,
effettivamente l´asterisco appartiene al tipo e non al nome della variabile.
Infatti il compilatore, nel messaggio di warning, parla di tipo int e tipo char *.
I puntatori sono infatti un altro tipo di variabile.
Saluti,
Mauro
effettivamente l´asterisco appartiene al tipo e non al nome della variabile.
Infatti il compilatore, nel messaggio di warning, parla di tipo int e tipo char *.
I puntatori sono infatti un altro tipo di variabile.
Saluti,
Mauro
Si prega Accesso o Crea un account a partecipare alla conversazione.
- nicolapc
- Autore della discussione
- Nuovo Utente
Less
Di più
- Messaggi: 6
- Ringraziamenti ricevuti 0
10 Anni 5 Mesi fa #5
da nicolapc
Risposta da nicolapc al topic [CCS - C] Aritmetica dei puntatori
Si', in effetti i puntatori sono per me ancora grande fonte di confusione.
Confermo il fatto che sia la promozione a intero della costante, perche' eliminando le seconde parentesi cosi':
pinOUT = (char *) 0x19 + porta ; // a seconda di porta diventa 0x21 o 0x29, cioe' P1OUT o P2OUT
e quindi facendo il cast della sola costante, la compilazione avviene senza warning e tutto funziona.
Pensavo - sbagliando - che il compilatore infilasse le costanti nel piu' piccolo formato in grado di contenerle, pero' come giustamente mi facevi notare, i registri del device sono a 16bit...
Ciao e grazie per il tuo tempo,
Nico.
Confermo il fatto che sia la promozione a intero della costante, perche' eliminando le seconde parentesi cosi':
pinOUT = (char *) 0x19 + porta ; // a seconda di porta diventa 0x21 o 0x29, cioe' P1OUT o P2OUT
e quindi facendo il cast della sola costante, la compilazione avviene senza warning e tutto funziona.
Pensavo - sbagliando - che il compilatore infilasse le costanti nel piu' piccolo formato in grado di contenerle, pero' come giustamente mi facevi notare, i registri del device sono a 16bit...
Ciao e grazie per il tuo tempo,
Nico.
Si prega Accesso o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Forum - Ultimi messaggi
-
- Freedom III e compilazioni fallite
- da Black
-
- MODULO GSM SIM900A
- da FABRIZIO
-
- LTerminal - nuove funzioni
- da Mauro Laurenti
-
- Aggiornamento sito completato
- da Mauro Laurenti
-
- registro a scorrimento PIPO in cascata
- da Mauro Laurenti