From 1b89f334e396cf2d097605ac56629d8d7e709585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Kijewski?= Date: Thu, 15 May 2014 16:30:47 +0200 Subject: [PATCH 1/3] msp430: provide oneway-malloc implicitly For MSP430 boards oneway-malloc is already used *if* `malloc.h` was included. The problem is that `malloc.h` is not a standard header, even though it is common. `stdlib.h` in the right place to look for `malloc()` and friends. This change removes this discrepancy. `malloc()` is just named like that, without the leading underscore. The symbols now are weak, which means that they won't override library functions if MSP's standard library will provide these functions at some point. (Unlikely, since using `malloc()` on tiny systems is less then optimal ...) Closes #1061 and #863. --- core/include/oneway_malloc.h | 75 ---------------------------- core/oneway_malloc.c | 67 ------------------------- cpu/msp430-common/Makefile.include | 2 + cpu/msp430-common/include/malloc.h | 11 ----- sys/Makefile | 3 ++ sys/Makefile.include | 4 ++ sys/oneway-malloc/Makefile | 3 ++ sys/oneway-malloc/include/malloc.h | 11 +++++ sys/oneway-malloc/oneway-malloc.c | 78 ++++++++++++++++++++++++++++++ 9 files changed, 101 insertions(+), 153 deletions(-) delete mode 100644 core/include/oneway_malloc.h delete mode 100644 core/oneway_malloc.c delete mode 100644 cpu/msp430-common/include/malloc.h create mode 100644 sys/oneway-malloc/Makefile create mode 100644 sys/oneway-malloc/include/malloc.h create mode 100644 sys/oneway-malloc/oneway-malloc.c diff --git a/core/include/oneway_malloc.h b/core/include/oneway_malloc.h deleted file mode 100644 index 3f24ff3075..0000000000 --- a/core/include/oneway_malloc.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2013 Freie Universität Berlin - * - * This file is subject to the terms and conditions of the GNU Lesser General - * Public License. See the file LICENSE in the top level directory for more - * details. - */ - -/** - * @addtogroup core_util - * @{ - * - * @file oneway_malloc.h - * @brief Simple malloc wrapper for sbrk - * - * @author Freie Universität Berlin, Computer Systems & Telematics - * @author Kaspar Schleiser - * - * @detail Simple malloc implementation for plattforms - * without malloc in libc, e.g. msb430. - */ - -#ifndef _MALLOC_H_ -#define _MALLOC_H_ - -#include - -/** - * @brief Allocates a block of `size` bytes of memory - * - * @param[in] Size of the memory block, in bytes. - * - * @return On success, a pointer to the memory block allocated by the function. - * @return NULL otherwise. - */ -void *_malloc(size_t size); - -/** - * @brief Changes the size of the memory block pointed to by ptr. - * - * @param[in] Pointer to a memory block previously allocated with malloc, - * calloc or realloc. - * - * @param[in] New size for the memory block, in bytes. - * - * @return A pointer to the reallocated memory block, which may be either - * the same as ptr or a new location. - */ -void *_realloc(void *ptr, size_t size); - -/** - * @brief Allocates a block of memory for an array of num elements, - * each of them size bytes long, and initializes all its bits to zero. - * - * @param[in] Number of elements to allocate. - * @param[in] Size of each element. - * - * @return On success, a pointer to the memory block allocated by the function. - * If the function failed to allocate the requested block of memory, - * a null pointer is returned. - */ -void *_calloc(int size, size_t cnt); - -/** - * @brief A block of memory previously allocated by a call to malloc, - * calloc or realloc is deallocated, making it available again - * for further allocations. - * - * @param[in] Pointer to a memory block previously allocated with malloc, - * calloc or realloc. - */ -void _free(void *ptr); - -/** @} */ -#endif /* _MALLOC_H_ */ diff --git a/core/oneway_malloc.c b/core/oneway_malloc.c deleted file mode 100644 index 348ab641de..0000000000 --- a/core/oneway_malloc.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2013 Freie Universität Berlin - * - * This file is subject to the terms and conditions of the GNU Lesser General - * Public License. See the file LICENSE in the top level directory for more - * details. - */ - -/** - * @ingroup core_util - * @{ - * - * @file oneway_malloc.c - * @brief Simple malloc wrapper for SBRK - - * @author Kaspar Schleiser - * - * @} - */ - -#include -#include -#include - -#define ENABLE_DEBUG (0) -#include "debug.h" - -extern void *sbrk(int incr); - -void *_malloc(size_t size) -{ - void *ptr = sbrk(size); - - DEBUG("_malloc(): allocating block of size %u at 0x%X.\n", (unsigned int) size, (unsigned int)ptr); - - if (ptr != (void*) - 1) { - return ptr; - } - else { - return NULL; - } -} - -void *_realloc(void *ptr, size_t size) -{ - void *newptr = _malloc(size); - memcpy(newptr, ptr, size); - free(ptr); - return newptr; -} - -void *_calloc(int size, size_t cnt) -{ - void *mem = _malloc(size * cnt); - if (mem) { - memset(mem, 0, size * cnt); - } - return mem; -} - -void _free(void *ptr) -{ - /* who cares about pointers? */ - (void) ptr; - - DEBUG("_free(): block at 0x%X lost.\n", (unsigned int)ptr); -} diff --git a/cpu/msp430-common/Makefile.include b/cpu/msp430-common/Makefile.include index caa62451a9..02ed2b915e 100644 --- a/cpu/msp430-common/Makefile.include +++ b/cpu/msp430-common/Makefile.include @@ -1 +1,3 @@ INCLUDES += -I$(RIOTBASE)/cpu/msp430-common/include/ + +DEFAULT_MODULE += oneway_malloc diff --git a/cpu/msp430-common/include/malloc.h b/cpu/msp430-common/include/malloc.h deleted file mode 100644 index f465d2c11b..0000000000 --- a/cpu/msp430-common/include/malloc.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef __MALLOC_H -#define __MALLOC_H - -#include "oneway_malloc.h" - -#define malloc _malloc -#define calloc _calloc -#define realloc _realloc -#define free _free - -#endif /* __MALLOC_H */ diff --git a/sys/Makefile b/sys/Makefile index e9e61c1ccf..c20e4781f9 100644 --- a/sys/Makefile +++ b/sys/Makefile @@ -89,6 +89,9 @@ endif ifneq (,$(filter quad_math,$(USEMODULE))) DIRS += quad_math endif +ifneq (,$(filter oneway_malloc,$(USEMODULE))) + DIRS += oneway-malloc +endif all: $(BINDIR)$(MODULE).a @for i in $(DIRS) ; do "$(MAKE)" -C $$i || exit 1; done ; diff --git a/sys/Makefile.include b/sys/Makefile.include index ddf496ce1b..2073b310a7 100644 --- a/sys/Makefile.include +++ b/sys/Makefile.include @@ -43,3 +43,7 @@ endif ifneq (,$(filter pthread,$(USEMODULE))) USEMODULE_INCLUDES += $(RIOTBASE)/sys/posix/pthread/include endif + +ifneq (,$(filter oneway_malloc,$(USEMODULE))) + USEMODULE_INCLUDES += $(RIOTBASE)/sys/oneway-malloc/include +endif diff --git a/sys/oneway-malloc/Makefile b/sys/oneway-malloc/Makefile new file mode 100644 index 0000000000..c5eae4a3c0 --- /dev/null +++ b/sys/oneway-malloc/Makefile @@ -0,0 +1,3 @@ +MODULE = oneway_malloc + +include $(RIOTBASE)/Makefile.base diff --git a/sys/oneway-malloc/include/malloc.h b/sys/oneway-malloc/include/malloc.h new file mode 100644 index 0000000000..0212e0c758 --- /dev/null +++ b/sys/oneway-malloc/include/malloc.h @@ -0,0 +1,11 @@ +#ifndef __MALLOC_H +#define __MALLOC_H + +#include + +void *malloc(size_t size); +void *realloc(void *ptr, size_t size); +void *calloc(int size, size_t cnt); +void free(void *ptr); + +#endif /* __MALLOC_H */ diff --git a/sys/oneway-malloc/oneway-malloc.c b/sys/oneway-malloc/oneway-malloc.c new file mode 100644 index 0000000000..35024717e3 --- /dev/null +++ b/sys/oneway-malloc/oneway-malloc.c @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2013 Freie Universität Berlin + * + * This file is subject to the terms and conditions of the GNU Lesser General + * Public License. See the file LICENSE in the top level directory for more + * details. + */ + +/** + * @addtogroup oneway_malloc + * @ingroup sys + * @{ + * + * @file oneway_malloc.c + * @brief Simple malloc wrapper for SBRK + + * @author Kaspar Schleiser + * + * @} + */ + +#include + +#include "malloc.h" + +#define ENABLE_DEBUG (0) +#include "debug.h" + +extern void *sbrk(int incr); + +void __attribute__((weak)) *malloc(size_t size) +{ + if (size != 0) { + void *ptr = sbrk(size); + + DEBUG("malloc(): allocating block of size %u at %p.\n", (unsigned int) size, ptr); + + if (ptr != (void*) -1) { + return ptr; + } + } + return NULL; +} + +void __attribute__((weak)) *realloc(void *ptr, size_t size) +{ + if (ptr == NULL) { + return malloc(size); + } + else if (size == 0) { + free(ptr); + return NULL; + } + else { + void *newptr = malloc(size); + if (newptr) { + memcpy(newptr, ptr, size); + } + return newptr; + } +} + +void __attribute__((weak)) *calloc(int size, size_t cnt) +{ + void *mem = malloc(size * cnt); + if (mem) { + memset(mem, 0, size * cnt); + } + return mem; +} + +void __attribute__((weak)) free(void *ptr) +{ + /* who cares about pointers? */ + (void) ptr; + + DEBUG("free(): block at %p lost.\n", ptr); +} From 75f71992e5477e787a54a823239cd4f48df22c81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Kijewski?= Date: Fri, 16 May 2014 00:19:02 +0200 Subject: [PATCH 2/3] Add doxygen comments to MSP's oneway malloc --- sys/oneway-malloc/include/malloc.h | 60 ++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/sys/oneway-malloc/include/malloc.h b/sys/oneway-malloc/include/malloc.h index 0212e0c758..ded0f4088b 100644 --- a/sys/oneway-malloc/include/malloc.h +++ b/sys/oneway-malloc/include/malloc.h @@ -1,11 +1,71 @@ +/* + * Copyright (C) 2014 Freie Universität Berlin + * + * This file is subject to the terms and conditions of the GNU Lesser General + * Public License. See the file LICENSE in the top level directory for more + * details. + */ + +/** + * @addtogroup oneway_malloc + * @{ + * @file malloc.h + * @brief A malloc implementation for MSP-430 boards without free. + * + * @details The toolchain of MSP-430 does not contain malloc() and friends. + * These functions provide the same interface as the stdlib functions, + * but the option to free memory. + * + * @note You should prefer statically allocated memory whenever possible. + * + * @author Kaspar Schleiser + * @author René Kijewski + */ + #ifndef __MALLOC_H #define __MALLOC_H #include +/** + * @brief Allocation a block of memory. + * @param[in] size Size of the block to allocate in bytes. + * @returns The new memory block. `NULL` if the "heap" is exhausted. + */ void *malloc(size_t size); + +/** + * @brief Allocated a new block of memory and move the existing content. + * @details This function allocates a new block of memory and memcpy()s the content of the ond `ptr` there. + * + * We do not know the size of the old block, so illegal reads would be likely, + * if it was not for the fact that the memory heap up. + * @param[in] ptr Old memory block that was allocated with malloc(), calloc() or realloc(). + * @param[in] size Size of the new block to allocted in bytes. + * @returns The new memory block. `NULL` if the "heap" is exhausted. + */ void *realloc(void *ptr, size_t size); + +/** + * @brief Allocate a memory block and set all its content to zeroes. + * @details Please see malloc() for more information. + * @note This implementation of calloc() does not catch integer overflows + * @param[in] size One factor of the number of bytes to allocated. + * @param[in] cnt The other factor of the number of bytes to allocated. + * @returns The new memory block. `NULL` if the "heap" is exhausted. + */ void *calloc(int size, size_t cnt); + +/** + * @brief This is a no-op. + * @details You read correctly: This function does noting. + * @note Keep in mind that this function does not free the memory. It does nothing. + * @param[in] ptr The ignored argument. + */ void free(void *ptr); #endif /* __MALLOC_H */ + +/** + * @} + */ From f3eeb98a01b7ca21d682c4fbf4707db56d1b4bf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Kijewski?= Date: Sun, 18 May 2014 00:53:10 +0200 Subject: [PATCH 3/3] msp/tests: remove blacklist from test_bloom_bytes Issue #1061 was fixed. --- tests/test_bloom_bytes/Makefile | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/tests/test_bloom_bytes/Makefile b/tests/test_bloom_bytes/Makefile index b91ddce6c4..2cbb1fdaf8 100644 --- a/tests/test_bloom_bytes/Makefile +++ b/tests/test_bloom_bytes/Makefile @@ -1,16 +1,6 @@ export PROJECT = test_bloom_bytes include ../Makefile.tests_common -BOARD_BLACKLIST := chronos msb-430 msb-430h \ - telosb wsn430-v1_3b wsn430-v1_4 z1 -# chronos: https://github.com/RIOT-OS/RIOT/issues/1061 -# msb-430: https://github.com/RIOT-OS/RIOT/issues/1061 -# msb-430h: https://github.com/RIOT-OS/RIOT/issues/1061 -# telosb: https://github.com/RIOT-OS/RIOT/issues/1061 -# wsn430-v1_3b: https://github.com/RIOT-OS/RIOT/issues/1061 -# wsn430-v1_4: https://github.com/RIOT-OS/RIOT/issues/1061 -# z1: https://github.com/RIOT-OS/RIOT/issues/1061 - USEMODULE += hashes USEMODULE += bloom USEMODULE += random