• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Как сохранить переменную во flash

tolyan23

New member
Непосредственно программирую ESP хочу сохранять переменную в энерго независимую память, как это правильно делать? (считать и записать) или можно как то сразу объявить что переменная храниться на флешке
 

pvvx

Активный участник сообщества
Написать свою функцию чтения и сохранения этой переменной в свободный сектор Flash. Для записи необходимо стереть сектор (4096 байт) и записать значение. А далее выдумываете алгоритм, как записывать чтобы не стирать сектор flash при каждом изменении вашей переменной, а дописывать измененную в новый ещё не записанный адрес. Аналогично функция чтения должна определять где последняя запись. Иначе протрете дырку в flash - кол-во стираний/записи одного адреса у неё ограничено...
 

tolyan23

New member
в sdk есть пример
uint32 value;
uint8 *addr = (uint8 *)&value;
spi_flash_read(0x3E * SPI_FLASH_SEC_SIZE, (uint32 *)addr, 4);
os_printf("0x3E sec:%02x%02x%02x%02x\r\n", addr[0], addr[1], addr[2],
addr[3]);
я думал может есть способы проще, например в CVAVR можно в объявлении переменной указать что то типа EEPROM char Data; и переменная Data будет хранится в EEPROM (хотя в даташите есть специальные функции чтения и записи в eeprom) ну раз тут так нельзя то ладно. Как узнать какой адрес я могу использовать а какой не? 00 могу использовать? Тоесть стереть можно только целый сектор?

И еще там есть 4 команды обновления прошивки, как это работает? Т.е. нужно куда то записать файл новой прошивки дать команду system_upgrade_start(параметры сервера) и он сам обновится?
 

pvvx

Активный участник сообщества
например в CVAVR можно в объявлении переменной указать что то типа EEPROM char Data; и переменная Data будет хранится в EEPROM (хотя в даташите есть специальные функции чтения и записи в eeprom) ну раз тут так нельзя то ладно.
Тоже можно. Необходимо описать специальный сегмент в ld файле для линковщика и задать атрибут в СИ.
Тоесть стереть можно только целый сектор?
в flash - да. Минимальный размер стирания 1 сектор, но можно стирать блоками в 64 килобайта, а можно и весь чип за раз.
И еще там есть 4 команды обновления прошивки, как это работает? Т.е. нужно куда то записать файл новой прошивки дать команду system_upgrade_start(параметры сервера) и он сам обновится?
Типа того, но это китайское и работает ужасно и сбоит.
 

tolyan23

New member
Типа того, но это китайское и работает ужасно и сбоит.
В чем ожидать проблем и как все таки обновить с помощью этой команды? Допустим обновятся будем с компа, ком подключен к той же wifi сети. Я так понимаю нужна какая то программа на компе чтобы она создала сервер и открыла доступ к файлу прошивки?
 
Последнее редактирование:
Сверху Снизу