Как напрямую, без использования библиотеки EEPROM, побайтно писать во флэш-память esp8266

oper25

✩✩✩✩✩✩✩
28 Июн 2023
2
0
Как напрямую, без использования библиотеки EEPROM, побайтно перезаписать во флэш-память переменную PROGMEM? Кроме того, как я могу определить адреса памяти, в которых я могу побайтно сохранять свои данные энергонезависимо без вреда для основной программы, без использования библиотеки EEPROM?
На мой взгляд в конце должна выйти строка состоящая из символов '#' и изменения должны остаться после отключения питания, но чип уходит в бесконечный цикл загрузки.
пример#1:
char myString[] PROGMEM = "Пример строки в PROGMEM"; 
void setup() { 
Serial.begin(74880);
Serial.println(myString); // Получение адреса строки в PROGMEM
uint32_t adr = reinterpret_cast<uint32_t>(myString); 
for (uint32_t i = 0; i < sizeof(myString); i++) {
 *((uint8_t *)adr + i) = 35;
} 
Serial.println(myString);
 

Сотнег

★★★★★★★
15 Янв 2020
4,455
1,523
@oper25,
PROGMEM - это ведь тоже библиотека.
Разве, в ней предусмотрена функция записи во время выполнения программы?
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,975
634
45
Кроме того, как я могу определить адреса памяти, в которых я могу побайтно сохранять свои данные энергонезависимо без вреда для основной программы, без использования библиотеки EEPROM?
Это так не работает. Крайне сомневаюсь, что атмега имеет маппинг еепрома в память.
Возьмите стандартную библиотеку для работы с еепром и расковыряйте ее.
 

oper25

✩✩✩✩✩✩✩
28 Июн 2023
2
0
@Сотнег, PROGMEM на сколько я знаю храниться в flash, я получаю адрес и тестирую - это больше для тестирования. Финальная задача понять и освоить вторую часть вопроса "как я могу определить адреса памяти, в которых я могу побайтно сохранять свои данные энергонезависимо без вреда для основной программы, без использования библиотеки EEPROM? "
 

poty

★★★★★★✩
19 Фев 2020
3,265
950
@oper25, читайте в datasheet на нужный Вам контроллер, какие виды памяти есть и чем они адресуются (раздел 8. AVR Memories для ATmega328p, например). Flash-память, хоть и имеет адреса ячеек, изменяется страницами (раздел 28. Memory Programming для ATmega328p). В последнем разделе также описаны методы чтения и записи в такую память.
Приведённый Вами кусок кода не имеет никакого смысла. Для ATmega существуют заранее определённые процедуры чтения PROGMEM (см. уроки Гайвера здесь, на сайте), но записывать они не дают.

P.S. EEPROM - это вид памяти, а не библиотека.
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
543
Saint-Petersburg, Russia
конкретно для 8266 - никак нельзя. SPI флеш в ней не мапится напрямую в память побайтово вообще никак. А PROGMEM это вообще не память, а макросы для а) линкера, который размещает константы в RO блок данных б) для функций чтения, которые реализуют выровненное по границе 32 бит чтение этих данных из флеша в ОЗУ. Попытка прочитать невыровненные данные из RO приводит к падению 8266.
Писать/стирать флеш вы можете в произвольное место, но только блоками по 512 байт. Собственно библиотека EEPROM делает это за вас, предоставляя псевдобайтовый доступ.
Если нужна чисто побайтовая энергонезависимая память смотрите в сторону FERAM чипов.