1

VSCode を使用して ESP32 をプログラミングしています。次の簡単なスクリプトがあります。

#include <Arduino.h>

RTC_DATA_ATTR int counter1 = 0;
RTC_NOINIT_ATTR int counter2 = 0;

void setup() {
Serial.begin(115200);
Serial.printf("RTC programme running, counter1 = %d; counter2 = %d\n",counter1,counter2);
delay(3000);
counter1++;
counter2++;
esp_restart();
}

void loop() {
  // nothing needed here
}

出力は次のようになると思います。

RTC programme running, counter1 = 0; counter2 = 0
RTC programme running, counter1 = 0; counter2 = 1
RTC programme running, counter1 = 0; counter2 = 2
...

しかし、代わりに私は得ています:

RTC programme running, counter1 = 0; counter2 = 109811943
RTC programme running, counter1 = 0; counter2 = 109811944
RTC programme running, counter1 = 0; counter2 = 109811945
...

(ここで、counter2の値はランダムな値です)。intuint32_tなどのさまざまな組み合わせを試しましたが、それでもランダムな値が得られます。これはRTC_NOINIT_ATTR定義が原因ですが、最終的なアプリケーションに必要なものです。私が別の方法でできることはありますか?

4

2 に答える 2

1

ESP32 の RTC メモリは、ソフトウェア リセットおよびディープ スリープ後も保持されます。

RTC_DATA_ATTR およびRTC_NOINIT_ATTRマクロには、RTC メモリにマップされたアドレスに変数を移動するためのリンカ ディレクティブがあります。

RTC_NOINIT_ATTR を持つ変数は、プログラムの開始時に初期化されず、RTC メモリに格納された値が消去されません。(RTC_DATA_ATTR 変数の値は、ディープ スリープ スタブでのみ使用できます。ディープ スリープ スタブは、ウェイクアップ直後、通常のプログラムが開始する前に RTC メモリで実行される小さな関数です。)

電源投入時にのみ RTC_NOINIT_ATTR 変数を初期化するには、setup() でリセット理由を確認し、いくつかのリセット理由でのみ変数を初期化します。

于 2021-11-08T13:01:12.190 に答える