Запись во flash

Moro_500
Offline
Зарегистрирован: 08.03.2021

Приветсвую!

const uint32_t message PROGMEM = 200;

void setup()
  {
    Serial.begin(9600);
  }

void loop()
  {
    Serial.println(pgm_read_dword(&message));
  }

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

в этом обьявлении 

const uint32_t message PROGMEM = 200;

или const лишний, или PROGMEM.

То, что ты хочешь (сохранить переменную во FLASH) можно, но весьма нетривиальным образом.  Гораздо проще (и правильнее)  сохранять новое значение между запусками в EEPROM, в AVR это штатная возможность. 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

А зачем писать во флеш, если у него ресурс на пару порядков меньше, чем eeprom?

sadman41
Offline
Зарегистрирован: 19.10.2016

Я тоже за EEPROM, но вопрос меня заинтересовал и я выкопал это: https://mon.im/2014/11/modifying-avr-progmem-at-runtime.html

Moro_500
Offline
Зарегистрирован: 08.03.2021

Спасибо, господа, за совет, блин, 100 раз слышал про еепром, но ни разу не вникал что это.

#include <avr/eeprom.h>

void setup()
  {
    Serial.begin(9600);
  }

void loop()
  {
    static uint32_t message = eeprom_read_dword(0);
    Serial.println(message);
    message++;
    eeprom_write_dword(0,message);
    delay(500);
  }

Работает, после перезагрузки помнит.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

с нулевого адреса ничего не пиши, пиши с адреса 0х10

negavoid2
negavoid2 аватар
Offline
Зарегистрирован: 06.05.2020

DetSimen пишет:
с нулевого адреса ничего не пиши, пиши с адреса 0х10

Почему?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

одна из городских легенд гласит, что при пропадании питания, процессор в агонии начинает портить начальные адреса EEPROM. Сам с этим сталкивался только однажды, в 2016 году на ProMini, но как потом выяснилось, она сама вся бракованная была, EEPROM там хранил то что сам хотел, а не то что в него было записано.  В то время, я был совсем зелёный в этих ваших Ардуинах, много погуглил и нашел эту гороцкую легенду, с тех пор в начальных адресах, до 0x10 ничего не храню.  А эта ПроМини потом подохла собачьей смертью, разлетевшись огненным дымным салютом по всему огороду. 

https://chipenable.ru/index.php/programming-avr/165-avr-eeprom-problemi....

negavoid2
negavoid2 аватар
Offline
Зарегистрирован: 06.05.2020

Аааа :) понятно, не сталкивался с таким, и надеюсь, не столкнусь.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Я тоже за EEPROM, но вопрос меня заинтересовал и я выкопал это: https://mon.im/2014/11/modifying-avr-progmem-at-runtime.html

вирусописатели и до микроконтроллеров добрались )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:

sadman41 пишет:

Я тоже за EEPROM, но вопрос меня заинтересовал и я выкопал это: https://mon.im/2014/11/modifying-avr-progmem-at-runtime.html

вирусописатели и до микроконтроллеров добрались )))

Ты зря смеёшся, там можно хранить, например, щёччик запусков, или серийный номер своего поделия.  И, если закащик тебя кинул, то через некоторое время изделие работать откажется, ведь "правильную" версию (без щёччика) ты же ему не пришлёшь, скатине. 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

DetSimen пишет:

одна из городских легенд гласит,

Я всегда в этих адресах самое важное храню (вот где вы раньше то были?)))), чтобы легче вспоминать было, куда что положил  Ни разу не сталкивался со сбоями. Но теперь вот буду нервничать ))

Хотя вру. Ну буду. Я полностью перешел на i2c FRAM. Перепаял штатные АТ24 во всех ds3231

Green
Offline
Зарегистрирован: 01.10.2015

Проблема с 0-й ячейкой ЕЕПРОМ была на заре AVRостроения. Уже пофиксили давно.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

ua6em пишет:

sadman41 пишет:

Я тоже за EEPROM, но вопрос меня заинтересовал и я выкопал это: https://mon.im/2014/11/modifying-avr-progmem-at-runtime.html

вирусописатели и до микроконтроллеров добрались )))

Ты зря смеёшся, там можно хранить, например, щёччик запусков, или серийный номер своего поделия.  И, если закащик тебя кинул, то через некоторое время изделие работать откажется, ведь "правильную" версию (без щёччика) ты же ему не пришлёшь, скатине. 

я не смеялся, я просто улыбнул Садмана, вирусу место если бы была возможность обновления прошивки, а для каких не деструктивных целей можно использовать память программ - понятно

sadman41
Offline
Зарегистрирован: 19.10.2016

https://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_eeprom_corruption

...
In older generation AVRs the EEPROM Address Register (EEAR) is initialized to zero on reset, be it from Brown Out Detect, Watchdog or the Reset Pin. If an EEPROM write has just started at the time of the reset, the write will be completed, but now at address zero instead of the requested address. If the reset occurs later in the write process both the requested address and address zero may be corrupted.
...

sadman41
Offline
Зарегистрирован: 19.10.2016

Испытал другой способ писания в PROGMEM. Welcome: http://arduino.ru/forum/programmirovanie/progmem-tricks?page=2#comment-593368

Moro_500
Offline
Зарегистрирован: 08.03.2021

вчера этот скеч протестировал

#include <avr/eeprom.h>

void setup()
  {
    Serial.begin(9600);
  }

void loop()
  {
    static uint32_t message = eeprom_read_dword(0);
    Serial.println(message);
    message++;
    eeprom_write_dword(0,message);
    delay(500);
  }

ну и забыл абдуринку с кампа дёрнуть чесов на 8 , получается она перезаписала 1 адрес 8*60*60*2=57600 раз

интырнет пишет:
Производитель гарантирует 100 000 циклов записи каждой ячейки

Боже, боже, боже.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Moro_500 пишет:

вчера этот скеч протестировал

#include <avr/eeprom.h>

void setup()
  {
    Serial.begin(9600);
  }

void loop()
  {
    static uint32_t message = eeprom_read_dword(0);
    Serial.println(message);
    message++;
    eeprom_write_dword(0,message);
    delay(500);
  }

ну и забыл абдуринку с кампа дёрнуть чесов на 8 , получается она перезаписала 1 адрес 8*60*60*2=57600 раз

интырнет пишет:
Производитель гарантирует 100 000 циклов записи каждой ячейки

Боже, боже, боже.

уверены?