From 2ceb22f26cce5544e9d3fa225dd9e3a14c7576e9 Mon Sep 17 00:00:00 2001 From: Reinhold Kainhofer <reinhold@kainhofer.com> Date: Sat, 1 Jul 2017 19:47:11 +0200 Subject: [PATCH] Add debug statements printing out free memory --- MemoryFree.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ MemoryFree.h | 18 ++++++++++++++++++ NodeManager.cpp | 7 +++++++ NodeManager.h | 3 +++ 4 files changed, 72 insertions(+) create mode 100644 MemoryFree.cpp create mode 100644 MemoryFree.h diff --git a/MemoryFree.cpp b/MemoryFree.cpp new file mode 100644 index 0000000..3e9eab9 --- /dev/null +++ b/MemoryFree.cpp @@ -0,0 +1,44 @@ + #if (ARDUINO >= 100) +#include <Arduino.h> +#else +#include <WProgram.h> +#endif + +extern unsigned int __heap_start; +extern void *__brkval; + +/* + * The free list structure as maintained by the + * avr-libc memory allocation routines. + */ +struct __freelist { + size_t sz; + struct __freelist *nx; +}; + +/* The head of the free list structure */ +extern struct __freelist *__flp; + +#include "MemoryFree.h" + +/* Calculates the size of the free list */ +int freeListSize() { + struct __freelist* current; + int total = 0; + for (current = __flp; current; current = current->nx) { + total += 2; /* Add two bytes for the memory block's header */ + total += (int) current->sz; + } + return total; +} + +int freeMemory() { + int free_memory; + if ((int)__brkval == 0) { + free_memory = ((int)&free_memory) - ((int)&__heap_start); + } else { + free_memory = ((int)&free_memory) - ((int)__brkval); + free_memory += freeListSize(); + } + return free_memory; +} \ No newline at end of file diff --git a/MemoryFree.h b/MemoryFree.h new file mode 100644 index 0000000..3a7f2d5 --- /dev/null +++ b/MemoryFree.h @@ -0,0 +1,18 @@ + // MemoryFree library based on code posted here: +// http://forum.arduino.cc/index.php?topic=27536.msg204024#msg204024 +// Extended by Matthew Murdoch to include walking of the free list. + +#ifndef MEMORY_FREE_H +#define MEMORY_FREE_H + +#ifdef __cplusplus +extern "C" { +#endif + +int freeMemory(); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/NodeManager.cpp b/NodeManager.cpp index 8012987..390a69c 100755 --- a/NodeManager.cpp +++ b/NodeManager.cpp @@ -4,6 +4,10 @@ #include "NodeManager.h" +void printFM() { + Serial.print (F("Free memory = ")); + Serial.println (freeMemory ()); +} /*************************************** PowerManager */ @@ -3293,6 +3297,7 @@ void NodeManager::presentation() { // setup NodeManager void NodeManager::setup() { + Serial.print(F("NodeManager::setup: ")); printFM(); // retrieve and store isMetric from the controller if (_get_controller_config) _is_metric = getControllerConfig().isMetric; #if DEBUG == 1 @@ -3307,9 +3312,11 @@ void NodeManager::setup() { // run setup for all the registered sensors for (int i = 1; i <= MAX_SENSORS; i++) { if (_sensors[i] == 0) continue; + Serial.print(F("NodeManager::setup: Before sensor "));Serial.print(i);printFM(); // call each sensor's setup() _sensors[i]->setup(); } + Serial.print(F("NodeManager::setup: END"));printFM(); } // run the main function for all the register sensors diff --git a/NodeManager.h b/NodeManager.h index 8728831..2cd0f0c 100755 --- a/NodeManager.h +++ b/NodeManager.h @@ -5,10 +5,13 @@ #define NodeManager_h #include <Arduino.h> +#include "MemoryFree.h" // define NodeManager version #define VERSION "1.6-dev" +void printFM(); + /*********************************** Constants */ -- GitLab