mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
88e8915dfe
This is my second take on #669, because I was asked to separate it from #764. This change adds a malloc implementation as a PKG, which uses *TLSF* (two level segregated fit). The patch file removes the 64bit capatibilities, debug functions, and the option to have multiple "control blocks" (a control block holds multiple memory pools). It wraps `malloc()` and friends in `disableIRQ() … restoreIRQ()`. The implemention does not support 16bit platforms, yet, but probably only some constants would need fixing. I limited the maximum size of a memory pool to 2**30 bytes = 1GB. This PKG is not meant to be used by applicitions directly, but by the boards. The board's initialition code needs to call `int tlsf_add_pool(void *mem, size_t bytes)` for every free memory region it has. If the board in using newlib, then this call needs to happen before the first call to `puts`, `printf`, and friends, because newlib allocates the control data IO streams (stdin, stdout, stderr) on the heap. Adding a small (e.g. 1kB) pool before proper board initialization would be a possible solution. Please read the additional information in the website of the implementator, http://tlsf.baisoku.org/: > TLSF (two level segregated fit) is a relatively new memory allocator designed for embedded systems. It boasts constant time O(1) malloc/free response time and a 4-byte block overhead. Though it typically is slightly slower than other allocators such as dlmalloc, it has no worst-case behavior. > The original implementation, which comes alongside the white paper, is distributed under the GNU GPL/LGPL. The code found here is an original implementation, released into the public domain, therefore is not subject to any licensing restrictions. > Features: - O(1) cost for malloc, free, realloc, memalign - Extremely low overhead per allocation (4 bytes) - Low overhead per pool (~3kB) - Low fragmentation - Compiles to only a few kB of code and data > Caveats: - Currently, assumes architecture can make 4-byte aligned accesses - Not designed to be thread safe; the user must provide this > Known Issues: Due to the internal block structure size and the implementation details of tlsf_memalign, there is worst-case behavior when requesting small (<16 byte) blocks aligned to 8-byte boundaries. Overuse of memalign will generally increase fragmentation, but this particular case will leave lots of unusable "holes" in the heap. The solution would be to internally align all blocks to 8 bytes, but this will require significantl changes to the implementation. Contact me if you are interested. |
||
---|---|---|
.. | ||
libcoap | ||
oonf_api | ||
openwsn | ||
tlsf | ||
Makefile.git | ||
Makefile.http | ||
PORTING | ||
USING |