Buongiorno,
e' possibile indirizzare a locazioni di memoria definite le variabili che utilizzo in un programma?
Ho cercato un po sul forum ma non ho trovato granche'
Questo mi tornerebbe utile in fase di simulazione del programma.
Grazie e buona giornata.
wut?
vuoi giocare con i puntatori? non capisco bene ma pare che tu voglia farti del male
Poi non Ti basta farti male coi puntatori vuoi sofrire doppiamnete usando un simulatore.
Ciao Uwe
Certo che è possibile accedere alle variabili con i puntatori ... valgono le regole generali del C ...
Esempietto banale :
int num;
int *pi;
....
num = 0;
pi = #
... augurandosi che tu sappia bene ciò che stai facendo ... o i casini sono assicurati
Guglielmo
P.S. : Lettura consigliata : Richard Reese, "Understanding and Using C Pointers", edizione O'Reilly, ISBN 978-1-449-34418-4
E ricordarsi che il C non ha una sistema di "garbage collection". (raccolta indifferenziata )
Mi sà che intende di voler allocare le variabili ad indirizzi prestabiliti.
e sperare che gli indirizzi che ottieni siano compatibili con quelli della MCU? bhe forse si può fare, se la prima cosa che fa il programma è inizializzare un array di byte pari a quelli dell'arduino, se il SO usa per il processo un indirizzamento relativo, o se crei un sistema ad-hoc..... però come dicevo prima, roba da uscirci scemi che farei solo per uno specifico motivo (e una bella borsa d'oro ).
Non so se si può "forzare" da C questa cosa. Per certo la si può forzare per far usare dei registri come variabili.
Esempio:
register unsigned char miaVar asm("r2");
In questo modo il compilatore utilizzerà il registro R2 per memorizzare il valore della variabile miaVar.
Si può fare per i registri da R2 a R7, gli altri sono usati dal compilatore e non dovrebbero essere utilizzati
Ma, in pratica, a cosa serve una cosa del genere?
paulus1969:
Ma, in pratica, a cosa serve una cosa del genere?
Parli del forzare per far usare dei registri come variabili ??? In alcune condizioni in cui la velocità è determinate, operazioni sui registri sono ovviamente più veloci che operazioni su RAM ...
Guglielmo
ma immagino che una cosa del genere sia terribilmente platform-dependent, o ci pensa il compilatore?
Sarà senz'altro molto legata alla piattaforma, ma anche alle regole stesse seguite dal compilatore. Ad esempio, ho scritto che si possono usare i registri R2..R7 perché gli altri sono usati dal compilatore, per esempio da R8 a R15 mi pare che siano usati per il passaggio dei parametri ecc.. Quindi sicuramente questo vale per gcc-avr, se usi un altro compilatore può darsi che non funzioni alla stessa maniera.
lesto:
ma immagino che una cosa del genere sia terribilmente platform-dependent, o ci pensa il compilatore?
SI è ovviamente legata al compilatore e a doppio filo con esso, al processore ...
... cambi processore, cambia l'architettura, i registri che hai a disposizione, quelli che il compilatore si riserva per le sue cose, ecc. ecc.
Difatti non è che la usi così genericamente come una qualsiasi istruzione C/C++ ... dove tanto ci pensa il compilatore ...
... con istruzioni che giocano con i registri devi esattamente sapere cosa stai facendo ... un po' come quando si gioca con i Timer o altre cosette HW all'interno della MCU
Guglielmo
gpb01:
SI è ovviamente legata al compilatore e a doppio filo con esso, al processore ...
... cambi processore, cambia l'architettura, i registri che hai a disposizione, quelli che il compilatore si riserva per le sue cose, ecc. ecc.
Diciamo che è pure legata alla versione del compilatore, non è insolito che con le varie release vengono migliorate, a volte peggiorate, certe cose tra cui l'utilizzo delle risorse, registri macchina inclusi.
Salve a tutti,
la mia richiesta e' legata al fatto che,ad esempio,usando un compilatore basic per i pic,puoi assegnare alla variabile "pippo" la locazione di memoria 22 di un determinato processore (parliamo di variabili a byte per semplificare il tutto).
Questo poi mi tornava utile in fase di simulazione software (Proteus) per verificare il contenuto delle variabili.
E' un metodo errato o migliorabile per fare simulazione?
Grazie
Dimentica il basic e dimentica i pic. Gli AVR e il C sono tutto un'altro modo di ragionare.
ma soprtutto spiega quale motivo ti porta a mettere delle variabili in aree di memoria note, usare indirizzi di variabile non assegnati dalla alloc credo sia un abitudine assolutamente nociva... perchè vorresti farlo?
lesto:
ma soprtutto spiega quale motivo ti porta a mettere delle variabili in aree di memoria note, usare indirizzi di variabile non assegnati dalla alloc credo sia un abitudine assolutamente nociva... perchè vorresti farlo?
Ciao Lesto,
come spiegato prima,in fase di simulazione del programma,sapere che "pippo" e' in una determinata area di memoria mi permette di sapere che valore contiene.
Premetto che ho sempre usato Proteus,secondo me un valido simulatore che supporta anche Arduino (non tutti...)
Una volta terminata la simulazione non e' piu necessario questo abbinamento.
Utilizzando Arduino & il C,ci sono altri metodi per avere queste informazioni?
Saluti
tortelli2:
come spiegato prima,in fase di simulazione del programma,sapere che "pippo" e' in una determinata area di memoria mi permette di sapere che valore contiene.
Non uso Proteus, però ci ho giocato un pochino e mi ricordo bene che, come tutti i debugger, ti permette di osservare le variabili tramite il loro nome simbolico, non serve sapere l'esatta locazione di memoria, ovviamente è indispensabile usare un file eseguibile comprensivo delle informazioni di debug.
Se è solo a titolo di debug puoi usare l'Arduino collegato al computer e fare debug sulla seriale, spedendo ad intervalli il valore della tua variabile da diversi punti del programma.
Puoi definire una #define DEBUG per attivare la modalità debug e poi circoscrivere i blocchi di codice di debug con #ifdef/#endif.
In modo che per togliere dal codice finale le porzioni di debug non devi far altro che commentare la #define.
Un esempio:
//commentare per la compilazione del firmware definitivo
#define DEBUG
int a = 0;
....
void loop() {
a++;
..
#ifdef DEBUG
Serial.println(a);
#endif
...
}