diff --git a/src/knx/memory.cpp b/src/knx/memory.cpp index a09eb55..23a737a 100644 --- a/src/knx/memory.cpp +++ b/src/knx/memory.cpp @@ -180,6 +180,7 @@ void Memory::writeMemory() if (block == nullptr) { println("_data of TableObject not in _usedList"); + clearMemory(); _platform.fatalError(); } @@ -199,6 +200,12 @@ void Memory::saveMemory() _platform.commitNonVolatileMemory(); } +void Memory::clearMemory() +{ + _platform.writeNonVolatileMemory(0, 0xFF, _metadataSize); + _platform.commitNonVolatileMemory(); +} + void Memory::addSaveRestore(SaveRestore* obj) { if (_saveCount >= MAXSAVE - 1) @@ -288,6 +295,7 @@ void Memory::freeMemory(uint8_t* ptr) if (!found) { println("freeMemory for not used pointer called"); + clearMemory(); _platform.fatalError(); } @@ -329,6 +337,7 @@ MemoryBlock* Memory::removeFromList(MemoryBlock* head, MemoryBlock* item) if (!head || !item) { println("invalid parameters of Memory::removeFromList"); + clearMemory(); _platform.fatalError(); } @@ -350,6 +359,7 @@ MemoryBlock* Memory::removeFromList(MemoryBlock* head, MemoryBlock* item) if (!found) { println("tried to remove block from list not in it"); + clearMemory(); _platform.fatalError(); } @@ -476,12 +486,14 @@ void Memory::addNewUsedBlock(uint8_t* address, size_t size) if (smallerFreeBlock == nullptr) { println("addNewUsedBlock: no smallerBlock found"); + clearMemory(); _platform.fatalError(); } if ((smallerFreeBlock->address + smallerFreeBlock->size) < (address + size)) { println("addNewUsedBlock: found block can't contain new block"); + clearMemory(); _platform.fatalError(); } diff --git a/src/knx/memory.h b/src/knx/memory.h index 6ac1757..30ba9b1 100644 --- a/src/knx/memory.h +++ b/src/knx/memory.h @@ -43,6 +43,7 @@ class Memory void readMemory(); void writeMemory(); void saveMemory(); + void clearMemory(); void addSaveRestore(SaveRestore* obj); void addSaveRestore(TableObject* obj);