ESP32 C3 - RTC_DATA_ATTR neuchová data po restartu

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
jankop
Příspěvky: 1057
Registrován: 06 zář 2017, 20:04
Bydliště: Brno
Kontaktovat uživatele:

ESP32 C3 - RTC_DATA_ATTR neuchová data po restartu

Příspěvek od jankop » 09 úno 2025, 00:49

Ladím program, který si ukládá jedinou proměnnou do RTC paměti pomocí deklarace RTC_DATA_ATTR. Proměnná se prokazatelně uloží, ale po restartu její hodnota neodpovídá.

Kód: Vybrat vše

// Mám pro esp32 C3 tento segment programu Arduino, ale nefunguje mi přepínání módů mezi STA a AP pomocí tlačítka.
#include <WiFi.h>
RTC_DATA_ATTR int32_t WifiModeFlag = 0L;
void setup() {
  WifiStart();
}
void loop() {
  // from WiFi station mode pressing the hardware Smart Button restarts the system
  if (!digitalRead(ButtonPin)) WifiModeSelectorFlag();
}
void WifiStart(void) {
  if (WifiModeFlag == 34567890) {
    WifiModeFlag = 0;
    // start WiFi Access point
    WiFi.softAP(_SensorName);
    digitalWrite(LedBuiltIn, HIGH);  //LED ON
  } else {
    // start WiFi station
    WiFi.mode(WIFI_STA);
    WiFi.begin(eGet.mySSID, eGet.myPassword);
    // wait for WiFi connect
    while (WiFi.status() != WL_CONNECTED) {
      WifiModeSelectorFlag();
      delay(250);
      digitalWrite(LedBuiltIn, !digitalRead(LedBuiltIn));
    }
    WiFi.setSleep(false);
    digitalWrite(LedBuiltIn, LOW);  //LED OFF
  }
}
// tests solid Smart button press and triggers a restart
void WifiModeSelectorFlag(void) {
  if (WiFi.getMode() != WIFI_STA) return;
  if (!digitalRead(ButtonPin)) {
    delay(50);
    if (!digitalRead(ButtonPin)) {
      WifiModeFlag = 34567890;
      // waiting for the button to be released
      while (!digitalRead(ButtonPin)) { delay(50); }
      //delay(1000);
      ESP.restart();
    }
  }
}

Uživatelský avatar
gilhad
Příspěvky: 849
Registrován: 07 bře 2018, 11:22

Re: ESP32 C3 - RTC_DATA_ATTR neuchová data po restartu

Příspěvek od gilhad » 09 úno 2025, 08:04

Nemůže být problém v tom, že ji na začátku deklaruješ jako inicializovanou?
Očekával bych, že se po spuštění programu do ní ta nula zapíše (ale můžu se plést, neznám to).
WifiModeFlag = 0L;

jankop
Příspěvky: 1057
Registrován: 06 zář 2017, 20:04
Bydliště: Brno
Kontaktovat uživatele:

Re: ESP32 C3 - RTC_DATA_ATTR neuchová data po restartu

Příspěvek od jankop » 09 úno 2025, 15:11

Dík za pomoc gilhade. Zrušil jsem tu deklaraci, protože to nejspíš fatální chyba byla. Ale stejně to nefungovalo. Někde jsem právě teď narazil na zmínku, že RTC_DATA_ATTR uchovává data při DeepSleep a až RTC_NOINIT_ATTR uchová data i při restartu. A faktem je, že s RTC_NOINIT_ATTR mi to konečně funguje. Tohle moc zdokumentované není. Strávil jsem s tím spoustu času.
U ESP8266, který jsem doposud výhradně používal, je mechanizmus RTC mem. poněkud jiný. S ESP32 se teprve seznamuji a portoval jsem na něj program právě z ESP8266.
Dovolím si přidat pár postřehů.
1. Narazil jsem na Sonoff BasicR4, WiFi switch, který je založen na ESP32 C3. Protože kompletní zařízení v krabičce bylo za cca 170Kč, tak jsem si ho pořídil.
2. Ještě než jsem ho měl doma, jsem zjistil, že prázdný skech má po kompilaci velikost asi 266kB. V reálu pak program portovaný z ESP8266 na ESP32 C3 byl 3x delší.
3. Doba kompilace se mi jeví příšerně dlouhá i když mám docela slušný počítač. Naštěstí z toho člověka ruce nebolí.
4. Předchozí generace Sonoff Basic dovolovala bezprostředně aplikovat OTA bez potřeby sériové linky. U Sonoff BasicR4 jsem marně několik hodin pátral po této možnosti a nakonec jsem potupně sáhl po sériovém adaptéru.
5. V hardwarové konstrukci tohoto BasicR4 je jedna zásadní změna, kterou je třeba bezvýhradně respektovat. Je to skutečnost, že je vybaven stepdown měničem, ale tento měnič nemá transformátor a tedy je zařízení trvale galvanicky spojeno se sítí. Holt šetří se všude. Proto není možné připojovat k tomuto zařízení žádné senzory a externí doplňky. Programování musí pochopitelně také probíhat při odpojené síti, pouze s napájením z USB/Serial adaptéru. Nerspektování tohoto faktu může zničit váš NB/PC nebo vás (neberme si servítky) také přizabít. Na druhé straně takový měnič bez trafa z 230V na 3.3V může být docela zajímavý.
6. Program, který jsem přenášel, jsem měl na ESP8266 hodně vyladěný. Je to docela náročný http server. Musel jsem tam sáhnout i k fintám s životností souborů v cache prohlížeče. Snad proto musím konstatovat, že rozdíl ve výkonu těchto dvou zařízení na stejném jobu je sotva patrný. Dokonce pozoruji u ESP32 jakasi drobná zamrznutí. To by údajně mohlo souviset s power-managementem tohoto RISC procesoru. To chci ještě identifikovat a doladit.
7. Aktivoval jsem IPv6 a v prvním přiblížení se jeví pěkně funkční.V tomhle kontextu jsem si vzpomněl, že O2 chce za statickou IPv6 s prefixem /64 120Kč.
8. Co můžete při pořízení Sonoff BasicR4 čekat? Je to trocha bižuterie a pak procesor ESP32 C3, relé, modrá LED a tlačítko. Bez nástrojů demontovatelná krabička. Pak stačí připájet čtyřpinový hřebínek pro 3V3, Rx,TX a GND. Flashování přímo z Arduino IDE. Stačí stisknout tlačítko a připojit USB/serial adapter do počítače. LED začne svítit cca polovičním svitem, to je aktivní bootloader.
9. K BasicR4 je k dispozici firemní software eWelink, který dovede mnohé. Ovšem, když si BasicR4 flashnete, tak původní software už tam nedostanete. Na záruku můžete také zapomenout. Můžete ale zařadit tuhle hračku do své chytré domácnosti třeba pomocí software Tasmota.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Google [Bot] a 1 host