Mutila: Mouse's Utilities for Arduino
Oft-used utilities: debouncing buttons, averaging samples, and so on.
FreeRam.cpp
1 #include "FreeRam.h"
2 
3 #if defined(ARDUINO_ARCH_AVR)
4 
5 /* Note: code adapted from MemoryFree library, found at https://github.com/McNeight/MemoryFree
6  */
7 
8 #if (ARDUINO >= 100)
9 #include <Arduino.h>
10 #else
11 #include <WProgram.h>
12 #endif
13 
14 extern unsigned int __heap_start;
15 extern void *__brkval;
16 
17 /*
18  * * The free list structure as maintained by the
19  * * avr-libc memory allocation routines.
20  * */
21 struct __freelist
22 {
23  size_t sz;
24  struct __freelist *nx;
25 };
26 
27 /* The head of the free list structure */
28 extern struct __freelist *__flp;
29 
30 #include "FreeRam.h"
31 
32 /* Calculates the size of the free list */
33 int _freeListSize()
34 {
35  struct __freelist* current;
36  int total = 0;
37  for (current = __flp; current; current = current->nx)
38  {
39  total += 2; /* Add two bytes for the memory block's header */
40  total += (int) current->sz;
41  }
42 
43  return total;
44 }
45 
46 uint32_t FreeRam()
47 {
48  int free_memory;
49  if ((int)__brkval == 0)
50  {
51  free_memory = ((int)&free_memory) - ((int)&__heap_start);
52  }
53  else
54  {
55  free_memory = ((int)&free_memory) - ((int)__brkval);
56  free_memory += _freeListSize();
57  }
58  return free_memory;
59 }
60 
61 #elif defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32)
62 
63 extern "C" {
64 
65 #if defined(ARDUINO_ARCH_ESP8266)
66 #include "user_interface.h"
67 #elif defined(ARDUINO_ARCH_ESP32)
68 #include "esp_system.h"
69 #endif
70 
71 uint32_t FreeRam() {
72  return system_get_free_heap_size();
73 }
74 
75 }
76 
77 #endif
78