- Messaggi: 6
- Ringraziamenti ricevuti 0
×
MSP430, Microcontrollori 16 bit Ultra Low Power
[CCS - C] Aritmetica dei puntatori
9 Anni 8 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-D: 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-D: 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 Accedi o Crea un account a partecipare alla conversazione.
- nicolapc
- Autore della discussione
- New Member
Riduci
Di più
9 Anni 8 Mesi fa #2
da Mauro Laurenti
Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.
Risposta da Mauro Laurenti al topic [CCS - C] Aritmetica dei puntatori
Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.
Si prega Accedi o Crea un account a partecipare alla conversazione.
9 Anni 8 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 Accedi o Crea un account a partecipare alla conversazione.
- nicolapc
- Autore della discussione
- New Member
Riduci
Di più
- Messaggi: 6
- Ringraziamenti ricevuti 0
9 Anni 8 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 Accedi o Crea un account a partecipare alla conversazione.
9 Anni 8 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 Accedi o Crea un account a partecipare alla conversazione.
- nicolapc
- Autore della discussione
- New Member
Riduci
Di più
- Messaggi: 6
- Ringraziamenti ricevuti 0
Moderatori: Mauro Laurenti, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Login
© LaurTec 2006 - 2024