Сейчас посыплются удары на мою голову, но все же спрошу.
Есть ли возможность программным путем изменить число 2, например, на число 10?
const int PROGMEM x[]={1,2,3,4};
Сейчас посыплются удары на мою голову, но все же спрошу.
Есть ли возможность программным путем изменить число 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
сбросится, а потом по новой в новом массиве поставится)))
из первого токо начальные данные берем…
надо сохранить, так надо постоянно записывать новые значения, и придумать условие по которому будет грузить не из первого массива а сохраненные значения в eeprom…
а вообще я упился энергетиками)))) и меня слушать не надо)))
Ну, понятно, типа как “теневой массив”. Гениально)))
я слишком гениален для того что бы с такой фигней не сталкиваться))) а делать все иначе…
и это же помещение данных во флеш память ? вот зачем их туда совать ?)))
и если кто их изменит… и поделится кодом, то я тогда смогу наверное рацию собрать на ардуино)))
берем данные от туда, потом создаем новый массив и вносим изменения из eeprom при загрузке, а туда пихаем периодически новые значения… вот и все)))
а надо изменить при работе… то берем создаем новый массив, и меняем так например…
и работаем с новым массивом, а не с тем…
после перезагрузке все скинется…
Писать программу, которая прошивает во flash данные, а затем их перепрошивает на новые значения? Оригинально))) А с первого раза записать нужное слабо?
И чем eeprom не угодила? Она для этого и предназначена.
Правильно писали
Это одна из тех задач, которая сама по себе тривиальна “как два пальца”, но нужно знать “много чего”, что непосредственно к ней не имеет никакого отношения. Поэтому и не пишут как её делать – тот, кто знает “много чего” в этом не нуждается, а тому, кто не знает — хоть запишись.
В общем, я предлагаю Вам либо забыть об этой задаче и считать, что это невозможно, либо начать изучать как устроены загрузчики и пробовать писать свой загрузчик, для начала. А потом думать как организовать передачу данных от программы загрузчику.
И, да, кстати, надеюсь Вы знакомы с творчеством Андрея Андреевича Вознесенского?
*= тогда уж
Во флешке оно лежит, не в ram.
Но вообще задача интересная.
Ну, что же…
Для начала надо определить, где во флеше это все лежит, затем прочитать-перезаписать сектор.
Наверняка появятся нюансы: надо будет выключить прерывания, надо будет сам этот код, который будет эту хирургию проводить, разместить в RAM. Нам крайне нежелательно получить icache miss, когда мы с флешкой работаем, да еще и с регионом, который замаплен.
Но в общем, да, надо прикинуться загрузчиком.
Автор! Ты это для чего делаешь? Секюрити специалист из центра самоходного программного обеспечения, что-ли?
Для экономии динамической памяти, надеюсь.
чотаржу.
чтоб “сыканомить” динамическую память надо просто взять подходящий контроллер с памятью побольше.