aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorinmarket <andrewh@inmarket.com.au>2015-11-27 10:15:46 +1000
committerinmarket <andrewh@inmarket.com.au>2015-11-27 10:15:46 +1000
commit0313756ea38d71cfce21a0a905f4fc43ac68d197 (patch)
tree035235b019041b5f75a64ab95a93ff8f7d027cb2
parent3681542e242bc6170b5c98aaa52a6df9ad21cae3 (diff)
downloaduGFX-0313756ea38d71cfce21a0a905f4fc43ac68d197.tar.gz
uGFX-0313756ea38d71cfce21a0a905f4fc43ac68d197.tar.bz2
uGFX-0313756ea38d71cfce21a0a905f4fc43ac68d197.zip
Add ability to emulate malloc() and free() to prevent nasty hard to find link errors from C library routines that need malloc
-rw-r--r--gfxconf.example.h1
-rw-r--r--src/gos/gos.h17
-rw-r--r--src/gos/gos_options.h5
-rw-r--r--src/gos/gos_rules.h11
-rw-r--r--src/gos/gos_x_heap.c11
5 files changed, 43 insertions, 2 deletions
diff --git a/gfxconf.example.h b/gfxconf.example.h
index 36b4cda4..c0b1cf6c 100644
--- a/gfxconf.example.h
+++ b/gfxconf.example.h
@@ -53,6 +53,7 @@
// #define GFX_OS_PRE_INIT_FUNCTION myHardwareInitRoutine
// #define GFX_OS_EXTRA_INIT_FUNCTION myOSInitRoutine
// #define GFX_OS_EXTRA_DEINIT_FUNCTION myOSDeInitRoutine
+// #define GFX_EMULATE_MALLOC FALSE
///////////////////////////////////////////////////////////////////////////
diff --git a/src/gos/gos.h b/src/gos/gos.h
index 445e4b3a..172a813e 100644
--- a/src/gos/gos.h
+++ b/src/gos/gos.h
@@ -176,6 +176,23 @@
void gfxFree(void *ptr);
/**
+ * @brief Use gfxAlloc and gfxFree to implement malloc() and free()
+ *
+ * @notes Sometimes your application will include functions that
+ * want to internally use malloc() and free(). As the default
+ * implementations of these in your C library are almost
+ * invariably incorrect for an embedded platform, this option
+ * allows you to emulate those calls with gfxAlloc() and gfxFree().
+ * An example is the C library routine rand() which on many
+ * implementations internally uses malloc().
+ *
+ * @api
+ */
+ #ifndef GFX_EMULATE_MALLOC
+ #define GFX_EMULATE_MALLOC FALSE
+ #endif
+
+ /**
* @brief Yield the current thread
* @details Give up the rest of the current time slice for this thread in order to give other threads
* a chance to run.
diff --git a/src/gos/gos_options.h b/src/gos/gos_options.h
index 8a724e12..78b8781b 100644
--- a/src/gos/gos_options.h
+++ b/src/gos/gos_options.h
@@ -174,9 +174,10 @@
#define GFX_FREERTOS_USE_TRACE FALSE
#endif
/**
- * @brief How much RAM should uGFX use for the heap
+ * @brief How much RAM should uGFX use for the heap when using its own internal heap allocator
* @details Defaults to 0.
- * @note Only used when the generic ugfx heap code is used (GFX_USE_OS_RAW32, GFX_USE_OS_ARDUINO, GFX_US_OS_KEIL, GFX_USE_OS_CMSIS)
+ * @note Only used when the internal ugfx heap allocator is used
+ * (GFX_USE_OS_RAW32, GFX_USE_OS_ARDUINO, GFX_US_OS_KEIL, GFX_USE_OS_CMSIS)
* @note If 0 then the standard C runtime malloc(), free() and realloc()
* are used.
* @note If it is non-zero then this is the number of bytes of RAM
diff --git a/src/gos/gos_rules.h b/src/gos/gos_rules.h
index 0f0f6596..de30befe 100644
--- a/src/gos/gos_rules.h
+++ b/src/gos/gos_rules.h
@@ -32,5 +32,16 @@
#error "GOS: GFX_FREERTOS_USE_TRACE is only available for the FreeRTOS port."
#endif
+#if GFX_EMULATE_MALLOC
+ #if GFX_USE_OS_WIN32 || GFX_USE_OS_LINUX || GFX_USE_OS_OSX || GFX_USE_OS_ECOS || \
+ (GFX_OS_HEAP_SIZE == 0 && (GFX_USE_OS_RAW32 || GFX_USE_OS_ARDUINO || GFX_USE_OS_CMSIS || GFX_USE_OS_KEIL))
+ #if GFX_DISPLAY_RULE_WARNINGS
+ #warning "GOS: Cannot emulate malloc as gfxAlloc() internally uses malloc on this platform"
+ #endif
+ #undef GFX_EMULATE_MALLOC
+ #define GFX_EMULATE_MALLOC FALSE
+ #endif
+#endif
+
#endif /* _GOS_RULES_H */
/** @} */
diff --git a/src/gos/gos_x_heap.c b/src/gos/gos_x_heap.c
index cd78f403..7e79d1c6 100644
--- a/src/gos/gos_x_heap.c
+++ b/src/gos/gos_x_heap.c
@@ -194,3 +194,14 @@
#endif
#endif /* GOS_NEED_X_HEAP */
+
+#if GFX_EMULATE_MALLOC
+ #include <stdlib.h>
+
+ void* malloc(size_t size) {
+ return gfxAlloc(size);
+ }
+ void free(void *ptr) {
+ gfxFree(ptr);
+ }
+#endif