summaryrefslogtreecommitdiff
path: root/acorn
diff options
context:
space:
mode:
Diffstat (limited to 'acorn')
-rw-r--r--acorn/Makefile18
-rw-r--r--acorn/config.mk1
-rw-r--r--acorn/include/malloc_wrapper.h6
-rw-r--r--acorn/src/malloc_wrapper.c41
4 files changed, 66 insertions, 0 deletions
diff --git a/acorn/Makefile b/acorn/Makefile
new file mode 100644
index 0000000..f445bc6
--- /dev/null
+++ b/acorn/Makefile
@@ -0,0 +1,18 @@
+TARGET_LIB = libacorn.a
+
+all: $(TARGET_LIB)
+
+include $(ROOTDIR)/common.mk
+include config.mk
+include $(ROOTDIR)/FreeRTOS/config.mk
+include $(ROOTDIR)/arch/config.mk
+include $(ROOTDIR)/os/config.mk
+include $(ROOTDIR)/libc/config.mk
+include $(ROOTDIR)/libm/config.mk
+
+TARGET_SRCS = \
+src/malloc_wrapper.c \
+
+include $(ROOTDIR)/target-rules.mk
+
+clean: clean-generic
diff --git a/acorn/config.mk b/acorn/config.mk
new file mode 100644
index 0000000..c4bfb1b
--- /dev/null
+++ b/acorn/config.mk
@@ -0,0 +1 @@
+TARGET_INCLUDES += $(ROOTDIR)/acorn/include
diff --git a/acorn/include/malloc_wrapper.h b/acorn/include/malloc_wrapper.h
new file mode 100644
index 0000000..bbaef9f
--- /dev/null
+++ b/acorn/include/malloc_wrapper.h
@@ -0,0 +1,6 @@
+#ifndef __MALLOC_WRAPPER_H__
+#define __MALLOC_WRAPPER_H__
+
+void init_malloc_wrapper();
+
+#endif
diff --git a/acorn/src/malloc_wrapper.c b/acorn/src/malloc_wrapper.c
new file mode 100644
index 0000000..3b5f9df
--- /dev/null
+++ b/acorn/src/malloc_wrapper.c
@@ -0,0 +1,41 @@
+#include <malloc.h>
+#include <FreeRTOS.h>
+#include <semphr.h>
+
+static xSemaphoreHandle malloc_sem = NULL;
+static malloc_t old_malloc;
+static realloc_t old_realloc;
+static free_t old_free;
+
+static void * malloc_wrap(size_t s) {
+ void * r;
+ xSemaphoreTakeRecursive(malloc_sem, portMAX_DELAY);
+ r = old_malloc(s);
+ xSemaphoreGiveRecursive(malloc_sem);
+ return r;
+}
+
+static void * realloc_wrap(void * p, size_t s) {
+ void * r;
+ xSemaphoreTakeRecursive(malloc_sem, portMAX_DELAY);
+ r = old_realloc(p, s);
+ xSemaphoreGiveRecursive(malloc_sem);
+ return r;
+}
+
+static void free_wrap(void * p) {
+ xSemaphoreTakeRecursive(malloc_sem, portMAX_DELAY);
+ old_free(p);
+ xSemaphoreGiveRecursive(malloc_sem);
+}
+
+void init_malloc_wrapper() {
+ malloc_sem = xSemaphoreCreateRecursiveMutex();
+ old_malloc = malloc;
+ old_realloc = realloc;
+ old_free = free;
+ malloc = malloc_wrap;
+ realloc = realloc_wrap;
+ free = free_wrap;
+}
+