È possibile definire un nuovo tipo di memoria. Per esempio in alcuni sistemi compilatori integrati si può fare questo:Definire un nuovo tipo di memoria
__flash const char array[] = "This is memory in flash (not ram) so I can waste it!";
Quindi è possibile andare ancora più pazzo e definire un nuovo tipo di memoria (come dire una scheda SD).
In sostanza sto chiedendo è possibile definire cosa sia una scheda SD (come accedere ai dati in esso) e quindi dichiarare una variabile nella memoria SD. (Ogni dove si vede una scrittura chiama il metodo SD, in ogni dove si vede una lettura chiama il metodo sd):
class SDCard{
public:
void write(void* data,size_t length);
void* read(size_t length);
void* memAlloc(size_t length);
};
__sd char myVar; //Grabs an address in the sd card based on SDCard::memAlloc
myVar = 'A'; //Calls whatever I defined the sd card write operation as
char other = myVar; //Calls whatever I defined the sd card read operation as
Sto usando gcc se posso fare qualcosa di speciale con che (io sono quasi pronto per modificare l'origine del compilatore per consentirmi di farlo).
Qualcosa di simile a questo è possibile, ma ci sono alcuni problemi:
struct Vol_t{ //Would represent an SD card an external RAM or any other memory
void write(void* data,size_t len,size_t add) const{}
void* read(size_t len,size_t add) const{}
};
template<Vol_t* sd, class Type,size_t address>
struct MemDef{ //Wrap your type with this (maybe add -> operator support later
void operator=(Type&& data){
sd->write(&data,sizeof(data),address);
}
operator Type&(){
return *reinterpret_cast<Type*>(sd->read(sizeof(Type),address));
}
};
Vol_t SD; //Initialize our SD card
MemDef<&SD,int,0xdeadbeaf> sdVar; //Declare an int variable on the SD card
int main(int argc,char** args){
sdVar = 12; //Writes to the SD card
int local = sdVar; //Reads from the SD card
system("Pause");
}
problemi con questo approccio:
- Optimizer deve fare ogni singola lettura/scrittura ---- esso non can fare qualche ottimizzazione su una variabile dichiarata in questo modo. (questo è il problema principale)
- È un po 'poco elegante (ma ha il compito finito)
- Devi specificare quale indirizzo di memoria usare (Sarebbe fantastico se il compilatore potesse in qualche modo capire tutto questo out prima compilazione e automaticamente
Così forse devo aggiungere una parola chiave per gcc (se questo è il caso, per favore mi punto nella giusta direzione per iniziare)
Edit:. lì è un altro problema con questo approccio e ha un puntatore a un'altra variabile che la variabile non sarà inizializzata sulla scheda SD (solo il puntatore lo farà).
stai parlando di un'applicazione di metallo nudo o uno scenario supportato dal sistema operativo? __flash funziona su embedded perché GCC mette i dati "lampeggianti" in una sezione speciale (ad esempio .progmem.data in AVR), GCC sa anche che deve leggere quei dati con l'istruzione LPM ... –
No, lo spazio disponibile per l'indirizzo è specifico per target. In altre parole, deve avere un significato per il processore specifico per il quale si sta compilando il codice. – Pemdas
Questo sarà un sistema integrato. In sostanza, sto chiedendo che sia possibile definire cosa sia una scheda SD (come accedere ai dati in essa contenuti) e quindi dichiarare una variabile nella memoria. (ogni dove vede una scrittura chiama il metodo sd, ogni dove vede una lettura chiama il metodo sd). – DarthRubik