From be1fb3756cc1af0fe610021fdab98488ce9d6f86 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 22 Apr 2020 16:07:52 +0200 Subject: [PATCH] Change ESP32 freeHeap to MaxAllocHeap --- tasmota/sendemail.ino | 2 +- tasmota/support.ino | 2 +- tasmota/support_command.ino | 2 +- tasmota/support_esp32.ino | 105 +++++++++-------------- tasmota/support_tasmota.ino | 2 +- tasmota/xdrv_01_webserver.ino | 2 +- tasmota/xdrv_10_scripter.ino | 2 +- tasmota/xdrv_23_zigbee_4_persistence.ino | 18 ++-- tasmota/xdrv_23_zigbee_9_impl.ino | 14 +-- 9 files changed, 63 insertions(+), 86 deletions(-) diff --git a/tasmota/sendemail.ino b/tasmota/sendemail.ino index 8bcddb029..3b34f02ab 100644 --- a/tasmota/sendemail.ino +++ b/tasmota/sendemail.ino @@ -47,7 +47,7 @@ uint16_t SendMail(char *buffer) { // return if not enough memory - uint16_t mem=ESP.getFreeHeap(); + uint16_t mem=ESP_getFreeHeap(); if (mem= (OSWATCH_RESET_TIME * 1000)) { // AddLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION D_OSWATCH " " D_BLOCKED_LOOP ". " D_RESTARTING)); // Save iram space diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index 122b936fd..3bb271f3a 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -465,7 +465,7 @@ void CmndStatus(void) #endif ",\"" D_JSON_FLASHMODE "\":%d,\"" D_JSON_FEATURES "\":[\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\"]"), - ESP_getSketchSize()/1024, ESP.getFreeSketchSpace()/1024, ESP.getFreeHeap()/1024, + ESP_getSketchSize()/1024, ESP.getFreeSketchSpace()/1024, ESP_getFreeHeap()/1024, ESP.getFlashChipSize()/1024, ESP.getFlashChipRealSize()/1024 #ifdef ESP8266 , ESP.getFlashChipId() diff --git a/tasmota/support_esp32.ino b/tasmota/support_esp32.ino index 14ce6ac82..fbd99ad67 100644 --- a/tasmota/support_esp32.ino +++ b/tasmota/support_esp32.ino @@ -27,28 +27,27 @@ extern "C" { extern struct rst_info resetInfo; } -uint32_t ESP_ResetInfoReason(void) -{ +uint32_t ESP_ResetInfoReason(void) { return resetInfo.reason; } -String ESP_getResetReason(void) -{ +String ESP_getResetReason(void) { return ESP.getResetReason(); } -uint32_t ESP_getChipId(void) -{ +uint32_t ESP_getChipId(void) { return ESP.getChipId(); } -uint32_t ESP_getSketchSize(void) -{ +uint32_t ESP_getSketchSize(void) { return ESP.getSketchSize(); } -void ESP_Restart(void) -{ +uint32_t ESP_getFreeHeap(void) { + return ESP.getFreeHeap(); +} + +void ESP_Restart(void) { // ESP.restart(); // This results in exception 3 on restarts on core 2.3.0 ESP.reset(); } @@ -64,8 +63,7 @@ void ESP_Restart(void) #include #include -void NvmLoad(const char *sNvsName, const char *sName, void *pSettings, unsigned nSettingsLen) -{ +void NvmLoad(const char *sNvsName, const char *sName, void *pSettings, unsigned nSettingsLen) { nvs_handle handle; noInterrupts(); nvs_open(sNvsName, NVS_READONLY, &handle); @@ -75,8 +73,7 @@ void NvmLoad(const char *sNvsName, const char *sName, void *pSettings, unsigned interrupts(); } -void NvmSave(const char *sNvsName, const char *sName, const void *pSettings, unsigned nSettingsLen) -{ +void NvmSave(const char *sNvsName, const char *sName, const void *pSettings, unsigned nSettingsLen) { nvs_handle handle; noInterrupts(); nvs_open(sNvsName, NVS_READWRITE, &handle); @@ -86,8 +83,7 @@ void NvmSave(const char *sNvsName, const char *sName, const void *pSettings, uns interrupts(); } -void NvmErase(const char *sNvsName) -{ +void NvmErase(const char *sNvsName) { nvs_handle handle; noInterrupts(); nvs_open(sNvsName, NVS_READWRITE, &handle); @@ -97,16 +93,10 @@ void NvmErase(const char *sNvsName) interrupts(); } -void SettingsErase(uint8_t type) -{ - if (1 == type) // SDK parameter area - { - } - else if (2 == type) // Tasmota parameter area (0x0F3xxx - 0x0FBFFF) - { - } - else if (3 == type) // Tasmota and SDK parameter area (0x0F3xxx - 0x0FFFFF) - { +void SettingsErase(uint8_t type) { + if (1 == type) { // SDK parameter area + } else if (2 == type) { // Tasmota parameter area (0x0F3xxx - 0x0FBFFF) + } else if (3 == type) { // Tasmota and SDK parameter area (0x0F3xxx - 0x0FFFFF) } NvmErase("main"); @@ -114,23 +104,19 @@ void SettingsErase(uint8_t type) AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION D_ERASE " t=%d"), type); } -void SettingsRead(void *data, size_t size) -{ +void SettingsRead(void *data, size_t size) { NvmLoad("main", "Settings", data, size); } -void SettingsWrite(const void *pSettings, unsigned nSettingsLen) -{ +void SettingsWrite(const void *pSettings, unsigned nSettingsLen) { NvmSave("main", "Settings", pSettings, nSettingsLen); } -void QPCRead(void *pSettings, unsigned nSettingsLen) -{ +void QPCRead(void *pSettings, unsigned nSettingsLen) { NvmLoad("qpc", "pcreg", pSettings, nSettingsLen); } -void QPCWrite(const void *pSettings, unsigned nSettingsLen) -{ +void QPCWrite(const void *pSettings, unsigned nSettingsLen) { NvmSave("qpc", "pcreg", pSettings, nSettingsLen); } @@ -139,13 +125,11 @@ void QPCWrite(const void *pSettings, unsigned nSettingsLen) // static bool bNetIsTimeSync = false; // -void SntpInit() -{ +void SntpInit() { bNetIsTimeSync = true; } -uint32_t SntpGetCurrentTimestamp(void) -{ +uint32_t SntpGetCurrentTimestamp(void) { time_t now = 0; if (bNetIsTimeSync || ntp_force_sync) { @@ -163,20 +147,17 @@ uint32_t SntpGetCurrentTimestamp(void) // Crash stuff // -void CrashDump(void) -{ +void CrashDump(void) { } -bool CrashFlag(void) -{ +bool CrashFlag(void) { return false; } -void CrashDumpClear(void) -{ +void CrashDumpClear(void) { } -void CmndCrash(void) -{ + +void CmndCrash(void) { /* volatile uint32_t dummy; dummy = *((uint32_t*) 0x00000000); @@ -184,8 +165,7 @@ void CmndCrash(void) } // Do an infinite loop to trigger WDT watchdog -void CmndWDT(void) -{ +void CmndWDT(void) { /* volatile uint32_t dummy = 0; while (1) { @@ -194,8 +174,7 @@ void CmndWDT(void) */ } // This will trigger the os watch after OSWATCH_RESET_TIME (=120) seconds -void CmndBlockedLoop(void) -{ +void CmndBlockedLoop(void) { /* while (1) { delay(1000); @@ -210,8 +189,7 @@ void CmndBlockedLoop(void) #include "soc/soc.h" #include "soc/rtc_cntl_reg.h" -void DisableBrownout(void) -{ +void DisableBrownout(void) { // https://github.com/espressif/arduino-esp32/issues/863#issuecomment-347179737 WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); // Disable brownout detector } @@ -220,8 +198,7 @@ void DisableBrownout(void) // ESP32 Alternatives // -String ESP32GetResetReason(uint32_t cpu_no) -{ +String ESP32GetResetReason(uint32_t cpu_no) { // tools\sdk\include\esp32\rom\rtc.h switch (rtc_get_reset_reason( (RESET_REASON) cpu_no)) { case POWERON_RESET : return F("Vbat power on reset"); // 1 @@ -243,13 +220,11 @@ String ESP32GetResetReason(uint32_t cpu_no) } } -String ESP_getResetReason(void) -{ +String ESP_getResetReason(void) { return ESP32GetResetReason(0); // CPU 0 } -uint32_t ESP_ResetInfoReason(void) -{ +uint32_t ESP_ResetInfoReason(void) { RESET_REASON reason = rtc_get_reset_reason(0); if (POWERON_RESET == reason) { return REASON_DEFAULT_RST; } if (SW_CPU_RESET == reason) { return REASON_SOFT_RESTART; } @@ -257,8 +232,7 @@ uint32_t ESP_ResetInfoReason(void) if (SW_RESET == reason) { return REASON_EXT_SYS_RST; } } -uint32_t ESP_getChipId(void) -{ +uint32_t ESP_getChipId(void) { uint32_t id = 0; for (uint32_t i = 0; i < 17; i = i +8) { id |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i; @@ -266,8 +240,7 @@ uint32_t ESP_getChipId(void) return id; } -uint32_t ESP_getSketchSize(void) -{ +uint32_t ESP_getSketchSize(void) { static uint32_t sketchsize = 0; if (!sketchsize) { @@ -276,8 +249,12 @@ uint32_t ESP_getSketchSize(void) return sketchsize; } -void ESP_Restart(void) -{ +uint32_t ESP_getFreeHeap(void) { +// return ESP.getFreeHeap(); + return ESP.getMaxAllocHeap(); +} + +void ESP_Restart(void) { ESP.restart(); } diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index f33f35b3d..d10e91d98 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -629,7 +629,7 @@ void MqttShowState(void) #endif ResponseAppend_P(PSTR(",\"" D_JSON_HEAPSIZE "\":%d,\"SleepMode\":\"%s\",\"Sleep\":%u,\"LoadAvg\":%u,\"MqttCount\":%u"), - ESP.getFreeHeap()/1024, GetTextIndexed(stemp1, sizeof(stemp1), Settings.flag3.sleep_normal, kSleepMode), // SetOption60 - Enable normal sleep instead of dynamic sleep + ESP_getFreeHeap()/1024, GetTextIndexed(stemp1, sizeof(stemp1), Settings.flag3.sleep_normal, kSleepMode), // SetOption60 - Enable normal sleep instead of dynamic sleep ssleep, loop_load_avg, MqttConnectCount()); for (uint32_t i = 1; i <= devices_present; i++) { diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index d900d83f0..bbdda0834 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -2110,7 +2110,7 @@ void HandleInformation(void) char stopic[TOPSZ]; - int freeMem = ESP.getFreeHeap(); + int freeMem = ESP_getFreeHeap(); WSContentStart_P(S_INFORMATION); // Save 1k of code space replacing table html with javascript replace codes diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index ae4f9a9af..276034dc8 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -1415,7 +1415,7 @@ chknext: goto exit; } if (!strncmp(vname,"heap",4)) { - fvar=ESP.getFreeHeap(); + fvar=ESP_getFreeHeap(); goto exit; } if (!strncmp(vname,"hn(",3)) { diff --git a/tasmota/xdrv_23_zigbee_4_persistence.ino b/tasmota/xdrv_23_zigbee_4_persistence.ino index d7b0d0f59..e3de4c7c9 100644 --- a/tasmota/xdrv_23_zigbee_4_persistence.ino +++ b/tasmota/xdrv_23_zigbee_4_persistence.ino @@ -45,7 +45,7 @@ // str - Manuf (null terminated C string, 32 chars max) // str - FriendlyName (null terminated C string, 32 chars max) // reserved for extensions -// -- V2 -- +// -- V2 -- // int8_t - bulbtype // Memory footprint @@ -61,7 +61,7 @@ public: uint32_t name; // simple 4 letters name. Currently 'skey', 'crt ', 'crt1', 'crt2' uint16_t len; // len of object uint16_t reserved; // align on 4 bytes boundary -}; +}; const static uint32_t ZIGB_NAME = 0x3167697A; // 'zig1' little endian const static size_t Z_MAX_FLASH = z_block_len - sizeof(z_flashdata_t); // 2040 @@ -202,8 +202,8 @@ void hydrateDevices(const SBuffer &buf) { for (uint32_t i = 0; (i < num_devices) && (k < buf_len); i++) { uint32_t dev_record_len = buf.get8(k); -// AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE "Device %d Before Memory = %d // DIFF %d // record_len %d"), i, ESP.getFreeHeap(), before - ESP.getFreeHeap(), dev_record_len); -// before = ESP.getFreeHeap(); +// AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE "Device %d Before Memory = %d // DIFF %d // record_len %d"), i, ESP_getFreeHeap(), before - ESP_getFreeHeap(), dev_record_len); +// before = ESP_getFreeHeap(); SBuffer buf_d = buf.subBuffer(k, dev_record_len); @@ -238,7 +238,7 @@ void hydrateDevices(const SBuffer &buf) { // ignore } } -//AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE "Device 0x%04X Memory3.shrink = %d"), shortaddr, ESP.getFreeHeap()); +//AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE "Device 0x%04X Memory3.shrink = %d"), shortaddr, ESP_getFreeHeap()); // parse 3 strings char empty[] = ""; @@ -269,14 +269,14 @@ void hydrateDevices(const SBuffer &buf) { // next iteration k += dev_record_len; -//AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE "Device %d After Memory = %d"), i, ESP.getFreeHeap()); +//AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE "Device %d After Memory = %d"), i, ESP_getFreeHeap()); } } void loadZigbeeDevices(void) { z_flashdata_t flashdata; memcpy_P(&flashdata, z_dev_start, sizeof(z_flashdata_t)); -// AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_ZIGBEE "Memory %d"), ESP.getFreeHeap()); +// AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_ZIGBEE "Memory %d"), ESP_getFreeHeap()); AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_ZIGBEE "Zigbee signature in Flash: %08X - %d"), flashdata.name, flashdata.len); // Check the signature @@ -291,7 +291,7 @@ void loadZigbeeDevices(void) { } else { AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE "No zigbee devices data in Flash")); } -// AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_ZIGBEE "Memory %d"), ESP.getFreeHeap()); +// AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_ZIGBEE "Memory %d"), ESP_getFreeHeap()); } void saveZigbeeDevices(void) { @@ -341,7 +341,7 @@ void eraseZigbeeDevices(void) { // Fill the Zigbee area with 0xFF memset(spi_buffer + z_block_offset, 0xFF, z_block_len); - + // buffer is now ready, write it back if (ESP.flashEraseSector(z_spi_start_sector)) { ESP.flashWrite(z_spi_start_sector * SPI_FLASH_SEC_SIZE, (uint32_t*) spi_buffer, SPI_FLASH_SEC_SIZE); diff --git a/tasmota/xdrv_23_zigbee_9_impl.ino b/tasmota/xdrv_23_zigbee_9_impl.ino index 86c63eb5b..505548027 100644 --- a/tasmota/xdrv_23_zigbee_9_impl.ino +++ b/tasmota/xdrv_23_zigbee_9_impl.ino @@ -160,7 +160,7 @@ void ZigbeeInit(void) // update commands with the current settings Z_UpdateConfig(Settings.zb_channel, Settings.zb_pan_id, Settings.zb_ext_panid, Settings.zb_precfgkey_l, Settings.zb_precfgkey_h); -// AddLog_P2(LOG_LEVEL_INFO, PSTR("ZigbeeInit Mem1 = %d"), ESP.getFreeHeap()); +// AddLog_P2(LOG_LEVEL_INFO, PSTR("ZigbeeInit Mem1 = %d"), ESP_getFreeHeap()); zigbee.active = false; if ((pin[GPIO_ZIGBEE_RX] < 99) && (pin[GPIO_ZIGBEE_TX] < 99)) { AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_ZIGBEE "GPIOs Rx:%d Tx:%d"), pin[GPIO_ZIGBEE_RX], pin[GPIO_ZIGBEE_TX]); @@ -172,16 +172,16 @@ void ZigbeeInit(void) uint32_t aligned_buffer = ((uint32_t)serial_in_buffer + 3) & ~3; zigbee_buffer = new PreAllocatedSBuffer(sizeof(serial_in_buffer) - 3, (char*) aligned_buffer); } else { -// AddLog_P2(LOG_LEVEL_INFO, PSTR("ZigbeeInit Mem2 = %d"), ESP.getFreeHeap()); +// AddLog_P2(LOG_LEVEL_INFO, PSTR("ZigbeeInit Mem2 = %d"), ESP_getFreeHeap()); zigbee_buffer = new SBuffer(ZIGBEE_BUFFER_SIZE); -// AddLog_P2(LOG_LEVEL_INFO, PSTR("ZigbeeInit Mem3 = %d"), ESP.getFreeHeap()); +// AddLog_P2(LOG_LEVEL_INFO, PSTR("ZigbeeInit Mem3 = %d"), ESP_getFreeHeap()); } zigbee.active = true; zigbee.init_phase = true; // start the state machine zigbee.state_machine = true; // start the state machine ZigbeeSerial->flush(); } -// AddLog_P2(LOG_LEVEL_INFO, PSTR("ZigbeeInit Mem9 = %d"), ESP.getFreeHeap()); +// AddLog_P2(LOG_LEVEL_INFO, PSTR("ZigbeeInit Mem9 = %d"), ESP_getFreeHeap()); } /*********************************************************************************************\ @@ -310,7 +310,7 @@ void ZigbeeZNPSend(const uint8_t *msg, size_t len) { // Returns: None // void ZigbeeZCLSend_Raw(uint16_t shortaddr, uint16_t groupaddr, uint16_t clusterId, uint8_t endpoint, uint8_t cmdId, bool clusterSpecific, uint16_t manuf, const uint8_t *msg, size_t len, bool needResponse, uint8_t transacId) { - + SBuffer buf(32+len); buf.add8(Z_SREQ | Z_AF); // 24 buf.add8(AF_DATA_REQUEST_EXT); // 02 @@ -345,7 +345,7 @@ void ZigbeeZCLSend_Raw(uint16_t shortaddr, uint16_t groupaddr, uint16_t clusterI } /********************************************************************************************/ -// +// // High-level function // Send a command specified as an HEX string for the workload. // The target endpoint is computed if zero, i.e. sent to the first known endpoint of the device. @@ -1016,7 +1016,7 @@ void CmndZbStatus(void) { if (XdrvMailbox.payload > 0) { if (0x0000 == shortaddr) { ResponseCmndChar_P(PSTR("Unknown device")); return; } } - + String dump = zigbee_devices.dump(XdrvMailbox.index, shortaddr); Response_P(PSTR("{\"%s%d\":%s}"), XdrvMailbox.command, XdrvMailbox.index, dump.c_str()); }