Есть ли возможность программным путем изменить число, размещенное в PROGMEM?

вот рабочий пример, взят из реального прожекта. не ардуино, сделано в микрочип студии, но должно и в ардуино работать.
имеем в заголовочном файле:

//описывем некую структуру
typedef struct {
	uint8_t VMC_FEATURE_LEVEL;
	uint8_t VMC_DISPLAY_COLUMNS;	//0x00 = no display available
	uint8_t VMC_DISPLAY_ROWS;
	uint8_t VMC_DISPLAY_TYPE;	//0x00 = Numbers, upper case letters, blank and decimal point; 0x01 = Full ASCII

	uint8_t VMCMfgCode[3];
	uint8_t VMCSerialNumber[12];
	uint8_t VMCModelNumber[12];
	uint8_t VMCSofwareVersion[2];
} VMCData_t;

VMCData_t VMCData;

void ReadVMCData(void);
void WriteVMCData(void);

в реализации пишем:

#include <avr/eeprom.h>
#include <avr/pgmspace.h>

VMCData_t EEMEM nv_VMCData = {3,16,2,1,"RUS","000000000000","000000000002","01"};

void ReadVMCData()
{
	eeprom_read_block((void*)&VMCData, (const void*)&nv_VMCData, 33);
}

void WriteVMCData()
{
	eeprom_write_block((void*)&VMCData, (const void*)&nv_VMCData, 33);
}

едит: все операции с изменением полей, проводятся с экземпяром VMCData
едит2: после компиляции будет помимо хекс файла еще и файл содержимого епром (.eep), его тоже надо залить в чип

Какая глупос… ой простите… прелесть!

@Optron
Объясните подробнее. Абсолютно уверен, что ваша проблема имеет иное решение, не связанное с необходимость перезаписи прогмем.

1 лайк

Я тоже иногда “с разбегу” путаю еепром и прогмем :slight_smile:

виноват-с, не до мелочей, родина в опасности сами знаете

1 лайк

Почему - глупость???

Или в динамической памяти хранить одну структуру и записывать ее в PROGMEM после изменения.
Или хранить массив структур в динамической памяти.

а чем тебя килобайт EEPROMa не устраивает?

Ограниченным ресурсом перезаписи.

есть EERAM, ты столько не проживешь.

ресурс прогмема ЕЩЕ меньше

ЕЕПРОМ - 100 тыс циклов, ресурс ПРОГМЕМ всего 10 тыс циклов

2 лайка

чотаржу еще громче. PROGMEM можно 10000 раз перезаписать, а EEPROM в 10 раз больше. Ты нормальный? Мошт, надо книшки какие почитать?

2 лайка

Вас это беспокоит? Давайте об этом поговорим :slight_smile:
Есть клёвая штука FRAM называется, работает по i2c, быстрая и неограниченная перезапись. Оччень удобно.

1 лайк

“Шурик, это же не наш метод!”

ТС написал мега код и хочет его защитить вот и ломает нам мозг…
Надо просто найти в загрузчике(он должен быть !) точку входа в функцию записи блока во флеш и вызывать её …

ну мы же с вами знаем, что желание “защитить код” в таком возврасте - это только от непонимания, что твой код дер-мо и нафик никому не нужен.

не надо.
“Не нужна тебе такая машина, Вовка” (с) Бумер

1 лайк

Ну почему же. “Я страдал - пусть и другие пострадают.”

В точку:rofl: До того как чему-нибудь научился тоже думал как всё скрыть, защитить и обезопасить. Ведь это мои будущие миллионы денех!:rofl:
Вощем это никудышная затея с flash. Никто так и не понял зачем и почему)

Зато у Вознесенского рифма к вопросу “Нафига?” правильная :slight_smile:

1 лайк

Спасибо! Разубедили вы меня в этой затее.

FM24CL16 мне в помощь.

А затея была для экономии динамической памяти. Но у нее, оказывается, ресурс перезаписи ограничен.

У динамической памяти - нет. У постоянной - ограничен. И то не у всей.

Поэтому и смотрю в сторону FM24CL16.

Пока не могу найти ее с обвязкой. Попадаются голые микросхемы.