Running better, but crashing because memory is filling up...

This commit is contained in:
Pascal Serrarens 2025-07-02 17:20:13 +02:00
parent fb64bca385
commit ca5abf097b

View File

@ -3,6 +3,11 @@
#include <iostream>
#endif
#include "esp_system.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
namespace LinearAlgebra {
#pragma region Matrix1
@ -70,15 +75,44 @@ float& Matrix1::operator()(int ix) {
#pragma region Matrix2
// Function to check available heap memory
size_t getAvailableHeapMemory() {
// This is a simple example; you may need to implement a more robust method
// depending on your platform. For ESP32, you can use heap_4.c or similar.
return esp_get_free_heap_size(); // Example for ESP32
}
Matrix2::Matrix2() {}
Matrix2::Matrix2(int nRows, int nCols) : nRows(nRows), nCols(nCols) {
this->nValues = nRows * nCols;
if (this->nValues == 0)
if (this->nValues <= 0) {
this->data = nullptr;
else {
this->externalData = false;
return;
}
// Check available heap memory before allocation
size_t availableMemory = getAvailableHeapMemory();
if (availableMemory < this->nValues * sizeof(float)) {
std::cerr << "Error: Not enough memory to allocate Matrix2 of size "
<< this->nValues << " floats." << std::endl;
this->data = nullptr; // Handle memory allocation failure
this->externalData = false;
return;
}
UBaseType_t stack_size =
uxTaskGetStackHighWaterMark(NULL); // NULL to check the main task
if (stack_size < 1000)
std::cerr << "Stack High Water Mark: " << stack_size << std::endl;
try {
this->data = new float[this->nValues];
this->externalData = false;
} catch (const std::bad_alloc& e) {
std::cerr << "Memory allocation failed: " << e.what() << std::endl;
this->data = nullptr; // Handle memory allocation failure
this->externalData = false;
}
}
@ -161,10 +195,10 @@ Matrix2 Matrix2::Zero(int nRows, int nCols) {
}
const float& Matrix2::operator()(int row, int col) const {
return data[row + this->nCols + col];
return data[row * this->nCols + col];
}
float& Matrix2::operator()(int row, int col) {
return data[row + this->nCols + col];
return data[row * this->nCols + col];
}
void Matrix2::Clear() {
@ -285,8 +319,8 @@ Matrix2 Matrix2::GetRows(int from, int to) {
Vector3 Matrix2::GetRow3(int rowIx) {
int cellIx = rowIx * this->nCols;
Vector3 row(this->data[cellIx, 0], this->data[cellIx, 1],
this->data[cellIx, 2]);
Vector3 row(this->data[cellIx + 0], this->data[cellIx + 1],
this->data[cellIx + 2]);
return row;
}