Esp_deep_sleep не работает с большими значениямиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Esp_deep_sleep не работает с большими значениями

Сообщение Anonymous »

Это объявлено/часть определенного списка параметров, который esp_deep_sleep принимает uint64_t в качестве параметра, представляющего количество микросекунд для сна ESP32, однако я считаю, что это ошибка. Если вы видите этот простой код ниже, использование максимального значения uint64_t, 18446744073709551615, приводит к преждевременному сбросу ESP32. Вы можете увидеть это в примере кода ниже с выводом [который повторяется бесконечно].
#include
#include
#include "RTClib.h"

RTC_DS3231 rtc;

void setup() {
Serial.begin(115200);

// Initialize the RTC
if (!rtc.begin()) {
while (1)
delay(10);
}

// Works (uint64_t max value / 2)
// Serial.println("before uint64_t / 2 sleep");
// esp_deep_sleep((uint64_t)9223372036854775807); // yes
// Serial.println("after uint64_t / 2 sleep");

// Doesn't work (unit64_t max value)
Serial.println("before uint64_t sleep");
esp_deep_sleep((uint64_t)18446744073709551615); // no
Serial.println("after uint64_t sleep");
}

void loop() {
}

Пример вывода
rst:0x5 (DEEPSLEEP_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:4832
load:0x40078000,len:16460
load:0x40080400,len:4
load:0x40080404,len:3504
entry 0x400805cc
E (57) esp_core�xump_flash: Core dump data check failed:
Calculated checksum='9d56f9c2'
Image checksum='ffffffff'
before uint64_t sleep
ets Jul 29 2019 12:21:46

rst:0x5 (DEEPSLEEP_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:4832
load:0x40078000,len:16460
load:0x40080400,len:4
load:0x40080404,len:3504
entry 0x400805cc
E (57) esp_corefxump_flash: Core dump data check failed:
Calculated checksum='9d56f9c2'
Image checksum='ffffffff'
before uint64_t sleep
ets Jul 29 2019 12:21:46

Если вы попытаетесь перевести ESP32 в спящий режим с половиной максимального значения, ESP32 перейдет в спящий режим, как ожидалось.
#include
#include
#include "RTClib.h"

RTC_DS3231 rtc;

void setup() {
Serial.begin(115200);

// Initialize the RTC
if (!rtc.begin()) {
while (1)
delay(10);
}

// Works (uint64_t max value / 2)
Serial.println("before uint64_t / 2 sleep");
esp_deep_sleep((uint64_t)9223372036854775807); // yes
Serial.println("after uint64_t / 2 sleep");

// Doesn't work (unit64_t max value)
// Serial.println("before uint64_t sleep");
// esp_deep_sleep((uint64_t)18446744073709551615); // no
// Serial.println("after uint64_t sleep");
}

void loop() {
}

Пример вывода
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:4832
load:0x40078000,len:16460
load:0x40080400,len:4
load:0x40080404,len:3504
entry 0x400805cc
E (152) esp_cor
�VW}���͡: Core dump data check failed:
Calculated checksum='9d56f9c2'
Image checksum='ffffffff'
before uint64_t / 2 sleep

Чтобы сэкономить заряд батареи для своих целей, я хочу перевести ESP32 в глубокий сон на полные 24 часа, но я не может этого сделать из-за ограничения esp_deep_sleep. Мне удалось обойти это ограничение с помощью приведенного ниже обходного пути, но было бы интересно, если бы существовало более поддерживаемое и простое решение этой проблемы.
#include
#include
#include "RTClib.h"

RTC_DS3231 rtc;

RTC_DATA_ATTR int is_init = 0;
RTC_DATA_ATTR uint64_t multiply_sleep_time = 1;

void setup() {
// Sleeps for 24 (2 * 12 hours) after module has been initialized
if (is_init == 1 && multiply_sleep_time > 0){
multiply_sleep_time--;
esp_deep_sleep((uint64_t)9223372036854775807);
}

Serial.begin(115200);

// Initialize the RTC
if (!rtc.begin()) {
while (1)
delay(10);
}

// Some code that needs to run at startup, and every 24 hours after
is_init = 1;

Serial.println("init");

// Works (uint64_t max value / 2)
Serial.println("before uint64_t / 2 sleep");
esp_deep_sleep((uint64_t)9223372036854775807);
Serial.println("after uint64_t / 2 sleep");
}

void loop() {
}


Подробнее здесь: https://stackoverflow.com/questions/790 ... rge-values
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»