Do wskazania kompilatorowi gdzie ma umieścić dane (że nie tak normalnie w SRAM) tylko we flash służy makro ICACHE_RODATA_ATTR podobne do ICACHE_FLASH_ATTR, można podejrzeć na co się one rozwijają w pliku c_types.h
Kod: Zaznacz cały
#ifdef ICACHE_FLASH
#define ICACHE_FLASH_ATTR __attribute__((section(".irom0.text")))
#define ICACHE_RODATA_ATTR __attribute__((section(".irom.text")))
#else
I tu pomocne są funkcje do odczytu:
Kod: Zaznacz cały
uint8 ICACHE_FLASH_ATTR read_rom_uint8(const uint8* addr) {
uint32 bytes;
bytes = *(uint32*)((uint32)addr & ~3);
return ((uint8*)&bytes)[(uint32)addr & 3];
}Kod: Zaznacz cały
uint16 read_rom_uint16(const uint16* addr) {
uint32 bytes;
bytes = *(uint32*)((uint32)addr & ~3);
return ((uint16*)&bytes)[((uint32)addr >> 1) & 1];
}Kod: Zaznacz cały
const uint8 ICACHE_RODATA_ATTR data[] = {
0,1,2,3,4,5,6,7,
8,9,10,11,12,13,14,15
};
const uint16 ICACHE_RODATA_ATTR data16[] = {
300,600,900,1200
};
uint8 ICACHE_FLASH_ATTR read_rom_uint8(const uint8* addr) {
uint32 bytes;
bytes = *(uint32*)((uint32)addr & ~3);
return ((uint8*)&bytes)[(uint32)addr & 3];
}
uint16 read_rom_uint16(const uint16* addr) {
uint32 bytes;
bytes = *(uint32*)((uint32)addr & ~3);
return ((uint16*)&bytes)[((uint32)addr >> 1) & 1];
}
void ICACHE_FLASH_ATTR user_init(void) {
os_printf("%d\r\n", read_rom_uint8(&data[0]));
os_printf("%d\r\n", read_rom_uint8(data + 13));
os_printf("%d\r\n", read_rom_uint16(&data16[1]));
}Wykorzytstałem ten patent przy zapisie fontów do OLED-a we flashu i działa super
Jeśli kogoś by interesował odczyt/zapis do FLASH-a to w SDK są do tego przygotowane funkcje oraz oddzielny dokument, który o tym traktuje + opis sposobu jak nie utracić danych w trakcie zapisu. Taki backup zapisywanych danych http://www.espressif.com/sites/default/ ... v1.0_0.pdf