Typical controller demo program based on Seeed Arch Max. Features: - Multi-thread architecture - Inter-thread message communication - Independent command shell using thread - HTTPD with CGI, WS, RPC - Key & value pair configuration load/save

Dependencies:   CMDB EthernetInterface HTTPD dconfig mbed-rpc mbed-rtos mbed storage_on_flash

Revision:
0:2ffd10976643
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/util.cpp	Wed Mar 25 21:56:51 2015 +0000
@@ -0,0 +1,70 @@
+/**
+ * @file util.cpp
+ *
+ * @brief system wide utility function
+ *
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+
+#if defined(__CC_ARM) && !defined(__MICROLIB)
+// Keil MDK with microlib supports __heapstats();
+#define SUPPORT_HEAPSTATS
+#endif
+
+#if defined(SUPPORT_HEAPSTATS)
+
+static void heap_printf(void *dummy, const char *fmt, ...)
+{
+    va_list	arg_ptr;
+
+    if (strchr(fmt, '\n') != NULL) {
+        putchar('\r');
+    }
+    va_start(arg_ptr, fmt);
+    vprintf(fmt, arg_ptr);
+    va_end(arg_ptr);
+}
+
+void print_memstat(void)
+{
+    __heapstats((__heapprt)heap_printf, NULL);
+    printf("\r\n");
+}
+
+#else
+
+/**
+ * Compute max consecutive memory chunk, by trying to allocate it.
+ */
+static uint32_t comput_free_heap(uint32_t resolution, uint32_t maximum)
+{
+    int low = 0;
+    int high = maximum + 1;
+
+    while (high - low > resolution) {
+        int mid = (low + high) / 2;
+        void* p = malloc(mid);
+        if (p == NULL) {
+            high = mid;
+        } else {
+            free(p);
+            low = mid;
+        }
+    }
+
+    return low;
+}
+
+void print_memstat(void)
+{
+    printf("heap free %u\r\n", comput_free_heap(512, 192*1024));
+}
+
+#endif
+
+