37
37
* Returns actual start of available / free heap
38
38
* Usage for print:
39
39
Serial.print(F("AvailableHeapStart=0x"));
40
- Serial.println((uint16_t) getAvailableHeapStart (), HEX);
40
+ Serial.println((uint16_t) getStartOfAvailableHeap (), HEX);
41
41
*/
42
- uint8_t * getAvailableHeapStart (void ) {
42
+
43
+ uint8_t * getStartOfAvailableHeap (void ) {
43
44
if (__brkval == 0 ) {
44
45
// __brkval is 0 if no malloc() has happened before
45
46
// __brkval = __malloc_heap_start;
46
47
__brkval = &__heap_start;
47
48
}
48
49
return (uint8_t *) __brkval;
49
50
}
50
- void printAvailableHeapStart (Print *aSerial) {
51
+
52
+ void printStartOfAvailableHeap (Print *aSerial) {
51
53
aSerial->print (F (" Heap start=" ));
52
- aSerial->println ((uint16_t ) getAvailableHeapStart ());
54
+ aSerial->println ((uint16_t ) getStartOfAvailableHeap ());
53
55
}
54
56
55
57
/*
56
58
* Initialize RAM between current stack and actual heap start (__brkval) with pattern 0x5A
57
59
*/
58
60
void initStackFreeMeasurement () {
59
- uint8_t *tHeapPtr = getAvailableHeapStart (); // This sets __brkval
61
+ uint8_t *tHeapPtr = getStartOfAvailableHeap (); // This sets __brkval
60
62
61
63
// Fill / paint stack
62
64
do {
@@ -79,7 +81,7 @@ int16_t getStackMaxUsedAndUnusedSizes(uint16_t *aStackUnusedSizePointer) {
79
81
* Search for first touched value from end of current heap.
80
82
*/
81
83
uint16_t tStackUnused = 0 ;
82
- uint8_t *tHeapPtr = getAvailableHeapStart (); // __brkval
84
+ uint8_t *tHeapPtr = getStartOfAvailableHeap (); // __brkval
83
85
while (*tHeapPtr == HEAP_STACK_UNTOUCHED_VALUE && tHeapPtr <= (uint8_t *) SP) {
84
86
tHeapPtr++;
85
87
tStackUnused++;
@@ -107,14 +109,14 @@ void printStackMaxUsedAndUnusedSizes(Print *aSerial) {
107
109
aSerial->print (F (" , unused=" ));
108
110
aSerial->print (tStackUnusedBytes);
109
111
aSerial->print (F (" of current total " ));
110
- aSerial->println ((RAMEND + 1 ) - (uint16_t ) getAvailableHeapStart ());
112
+ aSerial->println ((RAMEND + 1 ) - (uint16_t ) getStartOfAvailableHeap ());
111
113
}
112
114
113
115
/*
114
116
* Search upwards the first two HEAP_STACK_UNTOUCHED_VALUE values after current begin of heap
115
117
*/
116
118
uint16_t getHeapMaxUsedSize () {
117
- uint8_t *tHeapPtr = getAvailableHeapStart ();
119
+ uint8_t *tHeapPtr = getStartOfAvailableHeap ();
118
120
while (*tHeapPtr != HEAP_STACK_UNTOUCHED_VALUE && *(tHeapPtr + 1 ) != HEAP_STACK_UNTOUCHED_VALUE && tHeapPtr <= (uint8_t *) SP) {
119
121
tHeapPtr++;
120
122
}
@@ -150,7 +152,7 @@ bool printStackMaxUsedAndUnusedSizesIfChanged(Print *aSerial) {
150
152
* Value computed depends on current stackpointer!
151
153
*/
152
154
uint16_t getCurrentAvailableStackSize (void ) {
153
- uint16_t tAvailableHeapStart = (uint16_t ) getAvailableHeapStart (); // __brkval
155
+ uint16_t tAvailableHeapStart = (uint16_t ) getStartOfAvailableHeap (); // __brkval
154
156
if (tAvailableHeapStart >= SP) {
155
157
return 0 ;
156
158
}
@@ -183,7 +185,7 @@ uint16_t getTheoreticalMaximumAvailableHeapSize(void) {
183
185
if (RAMEND <= __malloc_margin) {
184
186
return 0 ;
185
187
}
186
- return RAMEND - __malloc_margin; // (128)
188
+ return ( RAMEND - RAMSTART) - __malloc_margin; // (128)
187
189
}
188
190
189
191
/*
@@ -194,7 +196,6 @@ void printCurrentAvailableHeapSize(Print *aSerial) {
194
196
aSerial->println (getCurrentAvailableHeapSize ());
195
197
}
196
198
197
-
198
199
/*
199
200
* Simple and short implementation, does not work before initStackFreeMeasurement() or first malloc()
200
201
* The STACK required for this function is 4 bytes, so available numbers are 4 less than for caller.
@@ -205,7 +206,7 @@ void printCurrentAvailableHeapSizeSimple(Print *aSerial) {
205
206
}
206
207
207
208
// This define is in AVRUtils.h
208
- // #define PRINT_AVAILABLE_HEAP Serial.print(F("available="));Serial.println(SP - (uint16_t) __brkval + 1 - ((uint16_t) __malloc_margin + HEURISTIC_ADDITIONAL_MALLOC_MARGIN ))
209
+ // #define PRINT_AVAILABLE_HEAP Serial.print(F("available="));Serial.println(SP - (uint16_t) __brkval + 1 - HEURISTIC_ADDITIONAL_MALLOC_MARGIN - ((uint16_t) __malloc_margin))
209
210
210
211
void printBaseRAMData (Print *aSerial) {
211
212
// __malloc_heap_end seems to be 0
@@ -245,7 +246,7 @@ void printBaseRAMData(Print *aSerial) {
245
246
246
247
/*
247
248
* RAM starts with Data, i.e. variables initialized with values != 0,
248
- * followed by BSS, i.e. uninitalized variables (which are initialized with 0)
249
+ * followed by BSS, i.e. uninitialized variables (which are initialized with 0)
249
250
* and variables not initialized by using attribute "__attribute__((section(".noinit")))".
250
251
* It ends with the heap and the stack.
251
252
*
@@ -264,14 +265,14 @@ void printRAMInfo(Print *aSerial) {
264
265
aSerial->print ((uint16_t ) &__heap_start - RAMSTART);
265
266
266
267
aSerial->print (F (" . Heap: used=" ));
267
- aSerial->print ((uint16_t ) getAvailableHeapStart () - (uint16_t ) &__heap_start);
268
+ aSerial->print ((uint16_t ) getStartOfAvailableHeap () - (uint16_t ) &__heap_start);
268
269
aSerial->print (F (" , max written=" )); // if Stack uses total heap, we see the stack size here :-(
269
270
aSerial->print (getHeapMaxUsedSize ());
270
271
aSerial->print (F (" , max available=" ));
271
- aSerial->print (RAMEND - (uint16_t ) __malloc_margin);
272
+ aSerial->print (RAMEND - (uint16_t ) getStartOfAvailableHeap () + 1 - ( uint16_t ) __malloc_margin);
272
273
273
274
aSerial->print (F (" . Stack: available=" ));
274
- aSerial->print (SP - (uint16_t ) getAvailableHeapStart () + 1 );
275
+ aSerial->print (SP - (uint16_t ) getStartOfAvailableHeap () + 1 );
275
276
aSerial->print (F (" , used=" ));
276
277
aSerial->print (RAMEND - SP);
277
278
uint16_t tStackUnusedBytes;
@@ -280,7 +281,7 @@ void printRAMInfo(Print *aSerial) {
280
281
aSerial->print (F (" , unused=" ));
281
282
aSerial->print (tStackUnusedBytes);
282
283
aSerial->print (F (" of current total " ));
283
- aSerial->print ((RAMEND + 1 ) - (uint16_t ) getAvailableHeapStart ()); // getAvailableHeapStart ()
284
+ aSerial->print ((RAMEND + 1 ) - (uint16_t ) getStartOfAvailableHeap ()); // getStartOfAvailableHeap ()
284
285
285
286
aSerial->println ();
286
287
}
@@ -302,7 +303,7 @@ bool isAddressInRAM(void *aAddressToCheck) {
302
303
}
303
304
304
305
bool isAddressBelowAvailableHeapStart (void *aAddressToCheck) {
305
- return (aAddressToCheck < getAvailableHeapStart ());
306
+ return (aAddressToCheck < getStartOfAvailableHeap ());
306
307
}
307
308
308
309
/*
@@ -315,8 +316,10 @@ void testCallocSizesAndPrint(Print *aSerial) {
315
316
while (true ) {
316
317
aSerial->print (F (" SP=0x" ));
317
318
aSerial->print (SP, HEX);
319
+ aSerial->print (F (" available=" ));
320
+ aSerial->print (SP - (uint16_t ) __brkval + 1 - ((uint16_t ) __malloc_margin)- HEURISTIC_ADDITIONAL_MALLOC_MARGIN);
318
321
aSerial->print (F (" max available=" ));
319
- aSerial->print (SP - (uint16_t ) __brkval + 1 - ((uint16_t ) __malloc_margin));
322
+ aSerial->print (RAMEND - (uint16_t ) __brkval + 1 - ((uint16_t ) __malloc_margin));
320
323
uint8_t *tMallocPtr = (uint8_t *) calloc (tMallocSize, 1 );
321
324
322
325
aSerial->print (F (" -> calloc(" ));
0 commit comments