14
14
#include < malloc.h>
15
15
16
16
extern " C" char *sbrk (int i);
17
- extern char _end; /* Defined by the linker */
17
+ /* Use linker definition */
18
+ extern char _end;
19
+ extern char _sdata;
20
+ extern char _estack;
21
+ extern char _Min_Stack_Size;
18
22
19
- // Get from memory area defined in linker script
20
- // Example for STM32F103C8
21
- // RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
22
- char *ramstart=(char *)0x20000000 ;
23
- char *ramend=(char *)0x20005000 ;
23
+ static char *ramstart = &_sdata;
24
+ static char *ramend = &_estack;
25
+ static char *minSP = (char *)(ramend - &_Min_Stack_Size);
24
26
25
27
#define NUM_BLOCKS 100
26
28
#define BLOCK_SIZE 4
27
29
28
30
void display_mallinfo (void )
29
31
{
30
- char *heapend= (char *)sbrk (0 );
31
- register char * stack_ptr asm ( " sp " );
32
- struct mallinfo mi= mallinfo ();
32
+ char *heapend = (char *)sbrk (0 );
33
+ char * stack_ptr = ( char *) __get_MSP ( );
34
+ struct mallinfo mi = mallinfo ();
33
35
34
36
Serial.print (" Total non-mmapped bytes (arena): " );
35
37
Serial.println (mi.arena );
@@ -52,26 +54,25 @@ void display_mallinfo(void)
52
54
Serial.print (" Topmost releasable block (keepcost): " );
53
55
Serial.println (mi.keepcost );
54
56
55
- Serial.print (" RAM Start 0x" );
57
+ Serial.print (" RAM Start at: 0x" );
56
58
Serial.println ((unsigned long )ramstart, HEX);
57
- Serial.print (" Data/Bss end 0x" );
59
+ Serial.print (" Data/Bss end at: 0x" );
58
60
Serial.println ((unsigned long )&_end, HEX);
59
- Serial.print (" Heap End 0x" );
61
+ Serial.print (" Heap end at: 0x" );
60
62
Serial.println ((unsigned long )heapend, HEX);
61
- Serial.print (" Stack Ptr 0x" );
63
+ Serial.print (" Stack Ptr end at: 0x" );
62
64
Serial.println ((unsigned long )stack_ptr, HEX);
63
- Serial.print (" RAM End 0x" );
65
+ Serial.print (" RAM End at: 0x" );
64
66
Serial.println ((unsigned long )ramend, HEX);
65
67
66
- Serial.print (" Heap RAM Used: " );
68
+ Serial.print (" Heap RAM Used: " );
67
69
Serial.println (mi.uordblks );
68
- Serial.print (" Program RAM Used " );
70
+ Serial.print (" Program RAM Used: " );
69
71
Serial.println (&_end - ramstart);
70
- Serial.print (" Stack RAM Used " );
72
+ Serial.print (" Stack RAM Used: " );
71
73
Serial.println (ramend - stack_ptr);
72
-
73
74
Serial.print (" Estimated Free RAM: " );
74
- Serial.println (stack_ptr - heapend + mi.fordblks );
75
+ Serial.println ((( stack_ptr < minSP) ? stack_ptr : minSP) - heapend + mi.fordblks );
75
76
}
76
77
77
78
void setup () {
@@ -81,7 +82,7 @@ void setup() {
81
82
}
82
83
83
84
void loop () {
84
- unsigned int n= 0 ;
85
+ unsigned int n = 0 ;
85
86
char *alloc[NUM_BLOCKS];
86
87
87
88
Serial.println (" ============== Before allocating blocks ==============" );
@@ -92,7 +93,7 @@ void loop() {
92
93
if (alloc[n] == NULL ) {
93
94
Serial.print (" Failed to allocate blocks " );
94
95
Serial.println (n);
95
- while (1 );
96
+ while (1 );
96
97
}
97
98
}
98
99
@@ -104,7 +105,7 @@ void loop() {
104
105
105
106
Serial.println (" ============== After freeing blocks ==============" );
106
107
display_mallinfo ();
107
- while (1 );
108
+ while (1 );
108
109
}
109
110
110
111
0 commit comments