Creiamo una libreria in C

Si, no forse, non lo so. :smiley:

Ho scritto codice per sperimentale al fine di verificare la comodità di uso e l'efficienza di alcune funzioni per I/O, ora volevo sperimentare altro.

Quindi nella mia testa io pensavo ad una struttura di questo tipo

struct port {
uint8_t *dir;
uint8_t *out;
uint8_t *in;
};

Solo che ogni campo occupa una locazione che contiene l'indirizzo di memoria a cui è mappato il registro ed io invece volevo che questo facesse parte della struttura, così avrei risparmiato memoria e organizzato i registri in strutture.

L'altra cosa che mi chiedo è la seguente: anche passando ad una funzione un puntatore a dato di una struttura poi c'è il modo di ricavare il puntatore alla struttura, faccio esempio creando una oggetto di struttura port.

port gpio_B0;
gpio.dir = 00;
gpio.out = 00;
ecc

se passo ad una funzione un puntatore &gpio_B0, posso accedere ad i suoi campi perchè ne conosco il nome se invece passo &gpio.out da dentro la funzione come posso fare a risalire al puntatore a struttura?

Non ho l'ambizione di creare chissa quale funzione o libreria, mi chiedo se è possibile fare qualcosa di diverso dal consueto per gestire I/O. La flash si sa è lenta in lettura rispetto alla lettura in RAM e questo è la prima causa di lentezza che affligono le funzioni I/O di arduino.

Tempo a dietro postasti un link e codice di esempio che facevo uso smodato delle macro tanto che poi il codice nel main era poco identificabile come linguaggio C, difatti si può stravolgere il linguaggio C rendendolo quasi irriconoscible facendo un'uso scriteriato delle macro.

Esempio:
#define GPIO_B0 ( &_SFR_IO8(0x04), &_SFR_IO8(0x05), &_SFR_IO8(0x03) )

Grazie a questa define posso richiamere una funzione in questo modo:

gpio_on GPIO_B0

Dove come vedi non ho necessità di scrivere le parentesi perchè sono contenure nella macro, ma questo mi impedisce di inserire nella funzione argomenti utente.

Il problema principale è che un pin non è identificabile in modo univoco attraverso il suo nome e neanche attraverso il suo indirizzo, l'unico modo è quello di usare la macro _BV che però è ostica.

Ora vedo come è fatta la macro _BV.

Ciao.