diff --git a/libraries/DataFlash/DataFlash_File.cpp b/libraries/DataFlash/DataFlash_File.cpp index 13a63ca332..48c659e1b7 100644 --- a/libraries/DataFlash/DataFlash_File.cpp +++ b/libraries/DataFlash/DataFlash_File.cpp @@ -105,9 +105,20 @@ void DataFlash_File::Init(const struct LogStructure *structure, uint8_t num_type if (_writebuf != NULL) { free(_writebuf); } - _writebuf = (uint8_t *)malloc(_writebuf_size); + + /* + if we can't allocate the full writebuf then try reducing it + until we can allocate it + */ + while (_writebuf == NULL && _writebuf_size >= _writebuf_chunk) { + _writebuf = (uint8_t *)malloc(_writebuf_size); + if (_writebuf == NULL) { + _writebuf_size /= 2; + } + } if (_writebuf == NULL) { - return; + hal.console->printf("Out of memory for logging\n"); + return; } _writebuf_head = _writebuf_tail = 0; _initialised = true; diff --git a/libraries/DataFlash/DataFlash_File.h b/libraries/DataFlash/DataFlash_File.h index 0eda11f598..1bd9657132 100644 --- a/libraries/DataFlash/DataFlash_File.h +++ b/libraries/DataFlash/DataFlash_File.h @@ -67,7 +67,7 @@ private: // write buffer uint8_t *_writebuf; - const uint16_t _writebuf_size; + uint16_t _writebuf_size; const uint16_t _writebuf_chunk; volatile uint16_t _writebuf_head; volatile uint16_t _writebuf_tail;