From c3d855846e49316ff26c1c6809046144f5991483 Mon Sep 17 00:00:00 2001 From: Develo Date: Thu, 3 Oct 2019 23:53:31 -0300 Subject: [PATCH 1/5] Update EEPROM.cpp use InterruptLock class for scoped interrupts instead of blindly disabling/enabling interrupts, which doesn't support nesting nor restore previous state. --- libraries/EEPROM/EEPROM.cpp | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/libraries/EEPROM/EEPROM.cpp b/libraries/EEPROM/EEPROM.cpp index a46638b6d4..be191fb37e 100644 --- a/libraries/EEPROM/EEPROM.cpp +++ b/libraries/EEPROM/EEPROM.cpp @@ -71,9 +71,12 @@ void EEPROMClass::begin(size_t size) { _size = size; - noInterrupts(); - auto ret = spi_flash_read(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast(_data), _size); - interrupts(); + SpiFlashOpResult ret; + { + esp8266::InterruptLock lockAllInterruptsInThisScope; + ret = spi_flash_read(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast(_data), _size); + } + if (ret != SPI_FLASH_RESULT_OK) { DEBUGV("EEPROMClass::begin spi_flash_read failed, %d\n", (int)ret); } @@ -136,16 +139,19 @@ bool EEPROMClass::commit() { if(!_data) return false; - noInterrupts(); - auto flashret = spi_flash_erase_sector(_sector); - if (flashret == SPI_FLASH_RESULT_OK) { - flashret = spi_flash_write(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast(_data), _size); + SpiFlashOpResult flashret; + { + esp8266::InterruptLock lockAllInterruptsInThisScope; + flashret = spi_flash_erase_sector(_sector); if (flashret == SPI_FLASH_RESULT_OK) { - _dirty = false; - ret = true; + flashret = spi_flash_write(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast(_data), _size); + if (flashret == SPI_FLASH_RESULT_OK) { + _dirty = false; + ret = true; + } } } - interrupts(); + if (flashret != SPI_FLASH_RESULT_OK) { DEBUGV("EEPROMClass::commit failed, %d\n", (int)flashret); From 9276450f3674aa281f05c88d72b3542f6cb4fa3e Mon Sep 17 00:00:00 2001 From: Develo Date: Fri, 4 Oct 2019 19:13:07 -0300 Subject: [PATCH 2/5] Update EEPROM.cpp Add forgotten include --- libraries/EEPROM/EEPROM.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/EEPROM/EEPROM.cpp b/libraries/EEPROM/EEPROM.cpp index be191fb37e..5101299c19 100644 --- a/libraries/EEPROM/EEPROM.cpp +++ b/libraries/EEPROM/EEPROM.cpp @@ -22,6 +22,7 @@ #include "Arduino.h" #include "EEPROM.h" #include "debug.h" +#include "interrupts.h" extern "C" { #include "c_types.h" From c44ab938ebce2120d62bd7ec46ed71c055aba713 Mon Sep 17 00:00:00 2001 From: Develo Date: Sat, 5 Oct 2019 18:21:52 -0300 Subject: [PATCH 3/5] Update EEPROM.cpp Remove locks, simplify code --- libraries/EEPROM/EEPROM.cpp | 33 ++++++++------------------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/libraries/EEPROM/EEPROM.cpp b/libraries/EEPROM/EEPROM.cpp index 5101299c19..630819eaf2 100644 --- a/libraries/EEPROM/EEPROM.cpp +++ b/libraries/EEPROM/EEPROM.cpp @@ -72,14 +72,8 @@ void EEPROMClass::begin(size_t size) { _size = size; - SpiFlashOpResult ret; - { - esp8266::InterruptLock lockAllInterruptsInThisScope; - ret = spi_flash_read(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast(_data), _size); - } - - if (ret != SPI_FLASH_RESULT_OK) { - DEBUGV("EEPROMClass::begin spi_flash_read failed, %d\n", (int)ret); + if (!ESP.flashRead(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast(_data), _size)) { + DEBUGV("EEPROMClass::begin flash read failed\n"); } _dirty = false; //make sure dirty is cleared in case begin() is called 2nd+ time @@ -132,7 +126,6 @@ void EEPROMClass::write(int const address, uint8_t const value) { } bool EEPROMClass::commit() { - bool ret = false; if (!_size) return false; if(!_dirty) @@ -140,25 +133,15 @@ bool EEPROMClass::commit() { if(!_data) return false; - SpiFlashOpResult flashret; - { - esp8266::InterruptLock lockAllInterruptsInThisScope; - flashret = spi_flash_erase_sector(_sector); - if (flashret == SPI_FLASH_RESULT_OK) { - flashret = spi_flash_write(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast(_data), _size); - if (flashret == SPI_FLASH_RESULT_OK) { - _dirty = false; - ret = true; - } + if (ESP.flashEraseSector(_sector)) { + if (ESP.flashWirite(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast(_data), _size)) { + _dirty = false; + return true; } } - - if (flashret != SPI_FLASH_RESULT_OK) { - DEBUGV("EEPROMClass::commit failed, %d\n", (int)flashret); - } - - return ret; + DEBUGV("EEPROMClass::commit failed\n"); + return false; } uint8_t * EEPROMClass::getDataPtr() { From f0fc7c40467c05a59c87ffde7e8b1d896713cfa1 Mon Sep 17 00:00:00 2001 From: Develo Date: Sat, 5 Oct 2019 20:51:21 -0300 Subject: [PATCH 4/5] Update EEPROM.cpp Fix typo --- libraries/EEPROM/EEPROM.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/EEPROM/EEPROM.cpp b/libraries/EEPROM/EEPROM.cpp index 630819eaf2..967f619ee2 100644 --- a/libraries/EEPROM/EEPROM.cpp +++ b/libraries/EEPROM/EEPROM.cpp @@ -134,7 +134,7 @@ bool EEPROMClass::commit() { return false; if (ESP.flashEraseSector(_sector)) { - if (ESP.flashWirite(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast(_data), _size)) { + if (ESP.flashWrite(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast(_data), _size)) { _dirty = false; return true; } From 204f3bcd270dc1dfe6330a148d73bec785a9d307 Mon Sep 17 00:00:00 2001 From: Develo Date: Sat, 5 Oct 2019 21:47:09 -0300 Subject: [PATCH 5/5] Update EEPROM.cpp Drop needless include --- libraries/EEPROM/EEPROM.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/EEPROM/EEPROM.cpp b/libraries/EEPROM/EEPROM.cpp index 967f619ee2..90bbf8ca52 100644 --- a/libraries/EEPROM/EEPROM.cpp +++ b/libraries/EEPROM/EEPROM.cpp @@ -22,7 +22,6 @@ #include "Arduino.h" #include "EEPROM.h" #include "debug.h" -#include "interrupts.h" extern "C" { #include "c_types.h"