Skip to content

Commit 01e1c58

Browse files
committed
Updater: if low on heap memory, use smaller write buffer
1 parent 9b0ad39 commit 01e1c58

File tree

2 files changed

+23
-14
lines changed

2 files changed

+23
-14
lines changed

cores/esp8266/Updater.cpp

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,12 @@ bool UpdaterClass::begin(size_t size, int command) {
127127
_startAddress = updateStartAddress;
128128
_currentAddress = _startAddress;
129129
_size = size;
130-
_buffer = new uint8_t[FLASH_SECTOR_SIZE];
130+
if (ESP.getFreeHeap() > 2 * FLASH_SECTOR_SIZE) {
131+
_bufferSize = FLASH_SECTOR_SIZE;
132+
} else {
133+
_bufferSize = 256;
134+
}
135+
_buffer = new uint8_t[_bufferSize];
131136
_command = command;
132137

133138
#ifdef DEBUG_UPDATER
@@ -218,13 +223,16 @@ bool UpdaterClass::end(bool evenIfRemaining){
218223

219224
bool UpdaterClass::_writeBuffer(){
220225

221-
if(!_async) yield();
222-
bool result = ESP.flashEraseSector(_currentAddress/FLASH_SECTOR_SIZE);
223-
if(!_async) yield();
226+
bool result = true;
227+
if (_currentAddress % FLASH_SECTOR_SIZE == 0) {
228+
if(!_async) yield();
229+
result = ESP.flashEraseSector(_currentAddress/FLASH_SECTOR_SIZE);
230+
}
231+
224232
if (result) {
225-
result = ESP.flashWrite(_currentAddress, (uint32_t*) _buffer, _bufferLen);
233+
if(!_async) yield();
234+
result = ESP.flashWrite(_currentAddress, (uint32_t*) _buffer, _bufferLen);
226235
}
227-
if(!_async) yield();
228236

229237
if (!result) {
230238
_error = UPDATE_ERROR_WRITE;
@@ -253,8 +261,8 @@ size_t UpdaterClass::write(uint8_t *data, size_t len) {
253261

254262
size_t left = len;
255263

256-
while((_bufferLen + left) > FLASH_SECTOR_SIZE) {
257-
size_t toBuff = FLASH_SECTOR_SIZE - _bufferLen;
264+
while((_bufferLen + left) > _bufferSize) {
265+
size_t toBuff = _bufferSize - _bufferLen;
258266
memcpy(_buffer + _bufferLen, data + (len - left), toBuff);
259267
_bufferLen += toBuff;
260268
if(!_writeBuffer()){
@@ -340,10 +348,10 @@ size_t UpdaterClass::writeStream(Stream &data) {
340348
}
341349

342350
while(remaining()) {
343-
toRead = data.readBytes(_buffer + _bufferLen, (FLASH_SECTOR_SIZE - _bufferLen));
351+
toRead = data.readBytes(_buffer + _bufferLen, (_bufferSize - _bufferLen));
344352
if(toRead == 0) { //Timeout
345353
delay(100);
346-
toRead = data.readBytes(_buffer + _bufferLen, (FLASH_SECTOR_SIZE - _bufferLen));
354+
toRead = data.readBytes(_buffer + _bufferLen, (_bufferSize - _bufferLen));
347355
if(toRead == 0) { //Timeout
348356
_error = UPDATE_ERROR_STREAM;
349357
_currentAddress = (_startAddress + _size);
@@ -355,7 +363,7 @@ size_t UpdaterClass::writeStream(Stream &data) {
355363
}
356364
}
357365
_bufferLen += toRead;
358-
if((_bufferLen == remaining() || _bufferLen == FLASH_SECTOR_SIZE) && !_writeBuffer())
366+
if((_bufferLen == remaining() || _bufferLen == _bufferSize) && !_writeBuffer())
359367
return written;
360368
written += toRead;
361369
yield();

cores/esp8266/Updater.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ class UpdaterClass {
116116
if(_bufferLen + available > remaining()){
117117
available = remaining() - _bufferLen;
118118
}
119-
if(_bufferLen + available > FLASH_SECTOR_SIZE) {
120-
size_t toBuff = FLASH_SECTOR_SIZE - _bufferLen;
119+
if(_bufferLen + available > _bufferSize) {
120+
size_t toBuff = _bufferSize - _bufferLen;
121121
data.read(_buffer + _bufferLen, toBuff);
122122
_bufferLen += toBuff;
123123
if(!_writeBuffer())
@@ -151,7 +151,8 @@ class UpdaterClass {
151151
bool _async;
152152
uint8_t _error;
153153
uint8_t *_buffer;
154-
size_t _bufferLen;
154+
size_t _bufferLen; // amount of data written into _buffer
155+
size_t _bufferSize; // total size of _buffer
155156
size_t _size;
156157
uint32_t _startAddress;
157158
uint32_t _currentAddress;

0 commit comments

Comments
 (0)