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

Сейчас посыплются удары на мою голову, но все же спрошу.

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

const int PROGMEM x[]={1,2,3,4};

Есть, умею подменять переменные через указатели, @ua6em умеет более кардинальные вещи, боюсь рассказывать не захочет, ибо …

Мне на ум приходит только одно. Посмотреть адрес в hex - файле, куда идет размещение PROGMEM… Но это не точно.

x[1] * 5

Речь идет о PROGMEM.

какая разница?

Мне надо ПОМЕНЯТЬ некоторые элементы (числа), которые уже размещены в PROGMEM. Сделать это программным путем. Где-то в инете было написано, что это сложно, но можно. Но не было написано как это делается.

(сообщение удалено автором)

тут стало опасно помогать, могут отпинать…
с другой стороны ночь… может и не заметят

#include <avr/pgmspace.h>
const int PROGMEM x[] = {1, 2, 3, 4}; // Исходный массив
const int size = sizeof(x) / sizeof(x[0]); // Размер массива
int y[size]; // Новый массив для хранения изменённых значений

void setup() {
Serial.begin(9600);
for (int i = 0; i < size; i++) {// Копируем значения из старого массива в новый, изменяя 2 на 10
int value = pgm_read_word(&(x[i])); // Чтение значения из PROGMEM
if (value == 2) {
y[i] = 10; // Заменяем 2 на 10
} else {
y[i] = value; // Копируем остальные значения
}
}
// Выводим значения нового массива
for (int i = 0; i < size; i++) {
Serial.print("y[");
Serial.print(i);
Serial.print("]: ");
Serial.println(y[i]);
}
}

void loop() {
  // Ваш код
}

подходит ?)))
и при работе вроде незя изменить… но можно создать новый…

а разве незя сделать массив из 4рех переменных ?
int val1=1;
int val2=2;
int val3=3;
int val4=4;
const int PROGMEM x = {val1, val2, val3, val4}; // Исходный массив

Фокус -покус)). А если выключить питание и включить?

Я с этим до конца не разобрался, т.к. для меня это не актуально пока. Но, вроде как,
для этого придётся прикинуться загрузчиком.
Это Вам даташит читать надо про Self-Programming

P.S. А если нужны большие массивы , в которых предполагается изменять данные - используйте внешнюю EEPROM

1 лайк

сбросится, а потом по новой в новом массиве поставится)))
из первого токо начальные данные берем…
надо сохранить, так надо постоянно записывать новые значения, и придумать условие по которому будет грузить не из первого массива а сохраненные значения в eeprom…

а вообще я упился энергетиками)))) и меня слушать не надо)))

Ну, понятно, типа как “теневой массив”. Гениально)))

я слишком гениален для того что бы с такой фигней не сталкиваться))) а делать все иначе…
и это же помещение данных во флеш память ? вот зачем их туда совать ?)))
и если кто их изменит… и поделится кодом, то я тогда смогу наверное рацию собрать на ардуино)))

берем данные от туда, потом создаем новый массив и вносим изменения из eeprom при загрузке, а туда пихаем периодически новые значения… вот и все)))
а надо изменить при работе… то берем создаем новый массив, и меняем так например…
и работаем с новым массивом, а не с тем…
после перезагрузке все скинется…

https://arduino.ru/forum/programmirovanie/progmem-tricks?page=2

Писать программу, которая прошивает во flash данные, а затем их перепрошивает на новые значения? Оригинально))) А с первого раза записать нужное слабо?
И чем eeprom не угодила? Она для этого и предназначена.

Правильно писали

Это одна из тех задач, которая сама по себе тривиальна “как два пальца”, но нужно знать “много чего”, что непосредственно к ней не имеет никакого отношения. Поэтому и не пишут как её делать – тот, кто знает “много чего” в этом не нуждается, а тому, кто не знает — хоть запишись.

В общем, я предлагаю Вам либо забыть об этой задаче и считать, что это невозможно, либо начать изучать как устроены загрузчики и пробовать писать свой загрузчик, для начала. А потом думать как организовать передачу данных от программы загрузчику.

И, да, кстати, надеюсь Вы знакомы с творчеством Андрея Андреевича Вознесенского?

*= тогда уж :slight_smile:

Во флешке оно лежит, не в ram.

Но вообще задача интересная.

Ну, что же…

Для начала надо определить, где во флеше это все лежит, затем прочитать-перезаписать сектор.

Наверняка появятся нюансы: надо будет выключить прерывания, надо будет сам этот код, который будет эту хирургию проводить, разместить в RAM. Нам крайне нежелательно получить icache miss, когда мы с флешкой работаем, да еще и с регионом, который замаплен.

Но в общем, да, надо прикинуться загрузчиком.

Автор! Ты это для чего делаешь? Секюрити специалист из центра самоходного программного обеспечения, что-ли?

Для экономии динамической памяти, надеюсь.

чотаржу.
чтоб “сыканомить” динамическую память надо просто взять подходящий контроллер с памятью побольше.

1 лайк