endif
# Setup wraps to memory allocations routines if we want to tag heap allocations.
-HEAP_WRAPS=
ifeq "$(HEAP_TAGS)" "1"
-HEAP_WRAPS=,--wrap=malloc,--wrap=realloc,--wrap=free
DEFINES += -DHEAP_TAGS
endif
# Linker Options.
LDFLAGS = $(DEVICE_FLAGS) -specs=$(BUILD_DIR)/startfile.spec
-LDFLAGS += -Wl,-Map=$(OUTDIR)/$(PROJECT).map,--cref,--gc-sections,--wrap=_isatty$(MRI_WRAPS)$(HEAP_WRAPS)
+LDFLAGS += -Wl,-Map=$(OUTDIR)/$(PROJECT).map,--cref,--gc-sections,--wrap=_isatty,--wrap=malloc,--wrap=realloc,--wrap=free$(MRI_WRAPS)
LDFLAGS += -T$(LSCRIPT) -L $(EXTERNAL_DIR)/gcc/LPC1768
ifneq "$(NO_FLOAT_SCANF)" "1"
LDFLAGS += -u _scanf_float
return (void*)1;
}
+#else
+
+/* Wrap memory allocation routines to make sure that they aren't being called from interrupt handler. */
+static void breakOnHeapOpFromInterruptHandler(void)
+{
+ if (__get_IPSR() != 0)
+ __debugbreak();
+}
+
+extern "C" void* __real_malloc(size_t size);
+extern "C" void* __wrap_malloc(size_t size)
+{
+ breakOnHeapOpFromInterruptHandler();
+ return __real_malloc(size);
+}
+
+
+extern "C" void* __real_realloc(void* ptr, size_t size);
+extern "C" void* __wrap_realloc(void* ptr, size_t size)
+{
+ breakOnHeapOpFromInterruptHandler();
+ return __real_realloc(ptr, size);
+}
+
+
+extern "C" void __real_free(void* ptr);
+extern "C" void __wrap_free(void* ptr)
+{
+ breakOnHeapOpFromInterruptHandler();
+ __real_free(ptr);
+}
+
#endif // HEAP_TAGS