Возможно ли определить новый тип памяти. Например, в некоторых встраиваемых систем компиляторов вы можете сделать это:Определить новый тип памяти
__flash const char array[] = "This is memory in flash (not ram) so I can waste it!";
Итак, можно пойти еще безумнее и определить новый тип памяти (как, скажем, в SD-карты).
Я в основном спрашиваю, можно ли определить, что такое SD-карта (как получить доступ к данным в ней), а затем объявить переменную в 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
Я использую GCC, если я могу сделать что-то особенное с этим (я почти готов для изменения источника компилятора, чтобы я мог это сделать).
Что-то, как это возможно, но есть несколько вопросов:
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");
}
Проблема с этим подходом:
- Оптимизатор должен делать каждую чтение/запись ---- это не может делать какие-либо оптимизации для переменной, объявленной таким образом. (это основная проблема)
- Это немного неэффективно (но он действительно выполняет эту работу)
- Вы должны указать, какой адрес памяти использовать (Было бы замечательно, если бы компилятор мог каким-то образом изобразить все это из перед тем компиляции и автоматически
Так может быть, я должен добавить ключевое слово в НКУ (если это так, пожалуйста, мне точку в правильном направлении, чтобы начать)
Edit:. там это еще одна проблема с этим подходом. Если тип e имеет указатель на другую переменную, которая не будет инициализирована на SD-карте (только указатель будет).
ты говоришь о голом железе приложения или сценарий с поддержкой ОС? __flash работает над встроенным, потому что GCC помещает «свернутые» данные в специальный раздел (например .progmem.data в AVR), GCC также знает, что он должен читать эти данные с помощью команды LPM ... –
Нет, доступное из этого адресного пространства является целевым. Другими словами, он должен иметь смысл для конкретного процессора, для которого вы компилируете код. – Pemdas
Это встроенные системы. Я в основном спрашиваю, можно ли определить, что такое SD-карта (как получить доступ к данным в ней), а затем объявить переменную в памяти. (каждый раз, когда он видит запись, он вызывает метод sd, каждый раз, когда видит, что он вызывает метод sd). – DarthRubik