summaryrefslogtreecommitdiff
path: root/tmk_core/tool/mbed/mbed-sdk/libraries/tests/mbed/heap_and_stack/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tmk_core/tool/mbed/mbed-sdk/libraries/tests/mbed/heap_and_stack/main.cpp')
-rw-r--r--tmk_core/tool/mbed/mbed-sdk/libraries/tests/mbed/heap_and_stack/main.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/tmk_core/tool/mbed/mbed-sdk/libraries/tests/mbed/heap_and_stack/main.cpp b/tmk_core/tool/mbed/mbed-sdk/libraries/tests/mbed/heap_and_stack/main.cpp
new file mode 100644
index 0000000000..a127efedb4
--- /dev/null
+++ b/tmk_core/tool/mbed/mbed-sdk/libraries/tests/mbed/heap_and_stack/main.cpp
@@ -0,0 +1,76 @@
+#include "test_env.h"
+
+static char *initial_stack_p;
+static char *initial_heap_p;
+
+static char line[256];
+static unsigned int iterations = 0;
+
+void report_iterations(void) {
+ unsigned int tot = (0x100 * iterations)*2;
+ printf("\nAllocated (%d)Kb in (%u) iterations\n", tot/1024, iterations);
+#if !defined(TOOLCHAIN_GCC_CR)
+ // EA: This causes a crash when compiling with GCC_CR???
+ printf("%.2f\n", ((float)(tot)/(float)(initial_stack_p - initial_heap_p))*100.);
+#endif
+#ifdef TOOLCHAIN_ARM
+#ifndef __MICROLIB
+ __heapvalid((__heapprt) fprintf, stdout, 1);
+#endif
+#endif
+}
+
+void stack_test(char *latest_heap_pointer) {
+ char stack_line[256];
+ iterations++;
+
+ sprintf(stack_line, "\nstack pointer: %p", &stack_line[255]);
+ puts(stack_line);
+
+ char *heap_pointer = (char*)malloc(0x100);
+
+ if (heap_pointer == NULL) {
+ int diff = (&stack_line[255] - latest_heap_pointer);
+ if (diff > 0x200) {
+ sprintf(stack_line, "\n[WARNING] Malloc failed to allocate memory too soon. There are (0x%x) free bytes", diff);
+ report_iterations();
+ puts(stack_line);
+ } else {
+ puts("\n[SUCCESS] Stack/Heap collision detected");
+ report_iterations();
+ }
+ return;
+ } else {
+ heap_pointer += 0x100;
+ sprintf(line, "heap pointer: %p", heap_pointer);
+ puts(line);
+ }
+
+ if ((&stack_line[255]) > heap_pointer) {
+ stack_test(heap_pointer);
+ } else {
+ puts("\n[WARNING] The Stack/Heap collision was not detected");
+ report_iterations();
+ }
+}
+
+
+int main (void) {
+ char c;
+ initial_stack_p = &c;
+
+ initial_heap_p = (char*)malloc(1);
+ if (initial_heap_p == NULL) {
+ printf("Unable to malloc a single byte\n");
+ notify_completion(false);
+ }
+
+ printf("Initial stack/heap geometry:\n");
+ printf(" stack pointer:V %p\n", initial_stack_p);
+ printf(" heap pointer :^ %p\n", initial_heap_p);
+
+ initial_heap_p++;
+ stack_test(initial_heap_p);
+
+ notify_completion(true);
+}