git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1226 35acf78f-673a-0410-8e92-d51de3d6d3f4
parent
a7cfbdaf10
commit
34fd822f84
|
@ -1299,14 +1299,13 @@ PREDEFINED = __DOXYGEN__ \
|
||||||
CH_USE_WAITEXIT=1 \
|
CH_USE_WAITEXIT=1 \
|
||||||
CH_USE_SEMAPHORES=1 \
|
CH_USE_SEMAPHORES=1 \
|
||||||
CH_USE_SEMSW=1 \
|
CH_USE_SEMSW=1 \
|
||||||
CH_USE_SEMAPHORES_TIMEOUT=1 \
|
|
||||||
CH_USE_MUTEXES=1 \
|
CH_USE_MUTEXES=1 \
|
||||||
CH_USE_CONDVARS=1 \
|
CH_USE_CONDVARS=1 \
|
||||||
CH_USE_CONDVARS_TIMEOUT=1 \
|
CH_USE_CONDVARS_TIMEOUT=1 \
|
||||||
CH_USE_EVENTS=1 \
|
CH_USE_EVENTS=1 \
|
||||||
CH_USE_EVENTS_TIMEOUT=1 \
|
CH_USE_EVENTS_TIMEOUT=1 \
|
||||||
CH_USE_QUEUES=1 \
|
CH_USE_QUEUES=1 \
|
||||||
CH_USE_SERIAL_FULLDUPLEX=1 \
|
CH_USE_MEMCORE=1 \
|
||||||
CH_USE_HEAP=1 \
|
CH_USE_HEAP=1 \
|
||||||
CH_USE_MEMPOOLS=1 \
|
CH_USE_MEMPOOLS=1 \
|
||||||
CH_USE_MESSAGES=1 \
|
CH_USE_MESSAGES=1 \
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
* @a ch\<group\>\<action\>\<suffix\>().
|
* @a ch\<group\>\<action\>\<suffix\>().
|
||||||
* The possible groups are: @a Sys, @a Sch, @a Time, @a VT, @a Thd, @a Sem,
|
* The possible groups are: @a Sys, @a Sch, @a Time, @a VT, @a Thd, @a Sem,
|
||||||
* @a Mtx, @a Cond, @a Evt, @a Msg, @a IQ, @a OQ, @a IO, @a Dbg,
|
* @a Mtx, @a Cond, @a Evt, @a Msg, @a IQ, @a OQ, @a IO, @a Dbg,
|
||||||
* @a Heap, @a Pool.
|
* @a Core, @a Heap, @a Pool.
|
||||||
*
|
*
|
||||||
* @section api_suffixes API Names Suffixes
|
* @section api_suffixes API Names Suffixes
|
||||||
* The suffix can be one of the following:
|
* The suffix can be one of the following:
|
||||||
|
|
|
@ -27,10 +27,8 @@
|
||||||
#ifndef _MEMCORE_H_
|
#ifndef _MEMCORE_H_
|
||||||
#define _MEMCORE_H_
|
#define _MEMCORE_H_
|
||||||
|
|
||||||
#if CH_USE_MEMCORE
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Memory alignment type.
|
* @brief Memory alignment type.
|
||||||
*/
|
*/
|
||||||
typedef void *align_t;
|
typedef void *align_t;
|
||||||
|
|
||||||
|
@ -42,21 +40,23 @@ typedef void *align_t;
|
||||||
typedef void *(*memgetfunc_t)(size_t size);
|
typedef void *(*memgetfunc_t)(size_t size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Alignment mask constant.
|
* @brief Alignment mask constant.
|
||||||
*/
|
*/
|
||||||
#define MEM_ALIGN_MASK (sizeof(align_t) - 1)
|
#define MEM_ALIGN_MASK (sizeof(align_t) - 1)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Alignment helper macro.
|
* @brief Alignment helper macro.
|
||||||
*/
|
*/
|
||||||
#define MEM_ALIGN_SIZE(p) (((size_t)(p) + MEM_ALIGN_MASK) & ~MEM_ALIGN_MASK)
|
#define MEM_ALIGN_SIZE(p) (((size_t)(p) + MEM_ALIGN_MASK) & ~MEM_ALIGN_MASK)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Returns whatever a pointer or memory size is aligned to
|
* @brief Returns whatever a pointer or memory size is aligned to
|
||||||
* the type @p align_t.
|
* the type @p align_t.
|
||||||
*/
|
*/
|
||||||
#define MEM_IS_ALIGNED(p) (((size_t)(p) & MEM_ALIGN_MASK) == 0)
|
#define MEM_IS_ALIGNED(p) (((size_t)(p) & MEM_ALIGN_MASK) == 0)
|
||||||
|
|
||||||
|
#if CH_USE_MEMCORE
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -40,14 +40,19 @@ struct pool_header {
|
||||||
* @brief Memory pool descriptor.
|
* @brief Memory pool descriptor.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
struct pool_header *mp_next; /**< Pointer to the header.*/
|
struct pool_header *mp_next; /**< Pointer to the header. */
|
||||||
size_t mp_object_size; /**< Memory pool objects size.*/
|
size_t mp_object_size; /**< Memory pool objects size. */
|
||||||
|
#if CH_USE_MEMCORE
|
||||||
|
bool_t mp_usecore; /**< Feed from the memory code
|
||||||
|
allocator if empty. */
|
||||||
|
#endif
|
||||||
} MemoryPool;
|
} MemoryPool;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Data part of a static memory pool initializer.
|
* @brief Data part of a static memory pool initializer.
|
||||||
* @details This macro should be used when statically initializing a
|
* @details This macro should be used when statically initializing a
|
||||||
* memory pool that is part of a bigger structure.
|
* memory pool that is part of a bigger structure.
|
||||||
|
*
|
||||||
* @param name the name of the memory pool variable
|
* @param name the name of the memory pool variable
|
||||||
* @param size size of the memory pool contained objects
|
* @param size size of the memory pool contained objects
|
||||||
*/
|
*/
|
||||||
|
@ -57,12 +62,25 @@ typedef struct {
|
||||||
* @brief Static memory pool initializer.
|
* @brief Static memory pool initializer.
|
||||||
* @details Statically initialized memory pools require no explicit
|
* @details Statically initialized memory pools require no explicit
|
||||||
* initialization using @p chPoolInit().
|
* initialization using @p chPoolInit().
|
||||||
|
*
|
||||||
* @param name the name of the memory pool variable
|
* @param name the name of the memory pool variable
|
||||||
* @param size size of the memory pool contained objects
|
* @param size size of the memory pool contained objects
|
||||||
*/
|
*/
|
||||||
#define MEMORYPOOL_DECL(name, size) \
|
#define MEMORYPOOL_DECL(name, size) \
|
||||||
MemoryPool name = _MEMORYPOOL_DATA(name, size)
|
MemoryPool name = _MEMORYPOOL_DATA(name, size)
|
||||||
|
|
||||||
|
#if CH_USE_MEMCORE || defined(__DOXYGEN__)
|
||||||
|
/**
|
||||||
|
* @brief Enables or disables the hungry mode.
|
||||||
|
* @details If enabled, the hungry mode, makes an empty memory pool feed
|
||||||
|
* new objects from the core memory manager.
|
||||||
|
*
|
||||||
|
* @param[in] mp pointer to a @p MemoryPool structure
|
||||||
|
* @param[in] mode hungry mode flag
|
||||||
|
*/
|
||||||
|
#define chPoolSetHungryMode(mp, mode) ((mp)->mp_usecore = (mode))
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -230,7 +230,28 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @defgroup heap Heap
|
* @defgroup memcore Core Memory Manager
|
||||||
|
* Core Memory Manager related APIs.
|
||||||
|
* <h2>Operation mode</h2>
|
||||||
|
* The core memory manager is a simplified allocator that only allows to
|
||||||
|
* allocate memory blocks without the possibility to free them.<br>
|
||||||
|
* This allocator is meant as a memory blocks provider for the other
|
||||||
|
* allocators such as:
|
||||||
|
* - C-Runtime allocator.
|
||||||
|
* - Heap allocator (see @ref heaps).
|
||||||
|
* - @ref Memory pools allocator (see @ref pools).
|
||||||
|
* .
|
||||||
|
* By having a centralized memory provider the various allocators can coexist
|
||||||
|
* and share the main memory.<br>
|
||||||
|
* This allocator, alone, is also useful for very simple applications that
|
||||||
|
* just require a simple way to get memory blocks.<br>
|
||||||
|
* In order to use the core memory manager APIs the @p CH_USE_MEMCORE option
|
||||||
|
* must be specified in @p chconf.h.
|
||||||
|
* @ingroup memory
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup heaps Heaps
|
||||||
* Heap Allocator related APIs.
|
* Heap Allocator related APIs.
|
||||||
* <h2>Operation mode</h2>
|
* <h2>Operation mode</h2>
|
||||||
* The heap allocator implements a first-fit strategy and its APIs are
|
* The heap allocator implements a first-fit strategy and its APIs are
|
||||||
|
|
|
@ -60,7 +60,7 @@ void core_init(void) {
|
||||||
* <code>sizeof(align_t)</code>.
|
* <code>sizeof(align_t)</code>.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* @param[in] the size of the block to be allocated
|
* @param[in] size the size of the block to be allocated
|
||||||
* @return A pointer to the allocated memory block.
|
* @return A pointer to the allocated memory block.
|
||||||
* @retval NULL allocation failed, core memory exhausted.
|
* @retval NULL allocation failed, core memory exhausted.
|
||||||
*/
|
*/
|
||||||
|
@ -79,7 +79,7 @@ void *chCoreAlloc(size_t size) {
|
||||||
* type @p align_t so it is not possible to allocate less than
|
* type @p align_t so it is not possible to allocate less than
|
||||||
* <code>sizeof(align_t)</code>.
|
* <code>sizeof(align_t)</code>.
|
||||||
*
|
*
|
||||||
* @param[in] the size of the block to be allocated.
|
* @param[in] size the size of the block to be allocated.
|
||||||
* @return A pointer to the allocated memory block.
|
* @return A pointer to the allocated memory block.
|
||||||
* @retval NULL allocation failed, core memory exhausted.
|
* @retval NULL allocation failed, core memory exhausted.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -32,14 +32,20 @@
|
||||||
*
|
*
|
||||||
* @param[out] mp pointer to a @p MemoryPool structure
|
* @param[out] mp pointer to a @p MemoryPool structure
|
||||||
* @param[in] size the size of the objects contained in this memory pool,
|
* @param[in] size the size of the objects contained in this memory pool,
|
||||||
* the minimum accepted size is the size of a pointer to void
|
* the minimum accepted size is the size of a pointer to void.
|
||||||
|
*
|
||||||
|
* @note The size is internally aligned to be a multiple of the @p align_t
|
||||||
|
* type size.
|
||||||
*/
|
*/
|
||||||
void chPoolInit(MemoryPool *mp, size_t size) {
|
void chPoolInit(MemoryPool *mp, size_t size) {
|
||||||
|
|
||||||
chDbgCheck((mp != NULL) && (size >= sizeof(void *)), "chPoolInit");
|
chDbgCheck((mp != NULL) && (size >= sizeof(void *)), "chPoolInit");
|
||||||
|
|
||||||
mp->mp_next = NULL;
|
mp->mp_next = NULL;
|
||||||
mp->mp_object_size = size;
|
mp->mp_object_size = MEM_ALIGN_SIZE(size);
|
||||||
|
#if CH_USE_MEMCORE
|
||||||
|
mp->mp_usecore = FALSE;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -56,7 +62,10 @@ void *chPoolAllocI(MemoryPool *mp) {
|
||||||
|
|
||||||
if ((objp = mp->mp_next) != NULL)
|
if ((objp = mp->mp_next) != NULL)
|
||||||
mp->mp_next = mp->mp_next->ph_next;
|
mp->mp_next = mp->mp_next->ph_next;
|
||||||
|
#if CH_USE_MEMCORE
|
||||||
|
else if (mp->mp_usecore)
|
||||||
|
objp = chCoreAllocI(mp->mp_object_size);
|
||||||
|
#endif
|
||||||
return objp;
|
return objp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,13 +90,17 @@ void *chPoolAlloc(MemoryPool *mp) {
|
||||||
*
|
*
|
||||||
* @param[in] mp pointer to a @p MemoryPool structure
|
* @param[in] mp pointer to a @p MemoryPool structure
|
||||||
* @param[in] objp the pointer to the object to be released or added
|
* @param[in] objp the pointer to the object to be released or added
|
||||||
* @note the object is assumed to be of the right size for the specified
|
*
|
||||||
|
* @note The object is assumed to be of the right size for the specified
|
||||||
* memory pool.
|
* memory pool.
|
||||||
|
* @note The object is assumed to be memory aligned to the size of @p align_t
|
||||||
|
* type.
|
||||||
*/
|
*/
|
||||||
void chPoolFreeI(MemoryPool *mp, void *objp) {
|
void chPoolFreeI(MemoryPool *mp, void *objp) {
|
||||||
struct pool_header *php = objp;
|
struct pool_header *php = objp;
|
||||||
|
|
||||||
chDbgCheck((mp != NULL) && (objp != NULL), "chPoolFreeI");
|
chDbgCheck((mp != NULL) && (objp != NULL) && MEM_IS_ALIGNED(objp),
|
||||||
|
"chPoolFreeI");
|
||||||
|
|
||||||
php->ph_next = mp->mp_next;
|
php->ph_next = mp->mp_next;
|
||||||
mp->mp_next = php;
|
mp->mp_next = php;
|
||||||
|
|
|
@ -7,11 +7,13 @@
|
||||||
Removed the old EMAC driver, updated the uIP WEB demo to use the new
|
Removed the old EMAC driver, updated the uIP WEB demo to use the new
|
||||||
driver model.
|
driver model.
|
||||||
- NEW: Added a simple lwIP demo (web server) for the AT91SAM7X.
|
- NEW: Added a simple lwIP demo (web server) for the AT91SAM7X.
|
||||||
- NEW: Centralized memory heap manager. This simple allocator implements a
|
- NEW: Centralized core memory manager. This simple allocator implements a
|
||||||
sbrk()-like API: chCoreAlloc(). The other allocators now use this manager
|
sbrk()-like API: chCoreAlloc(). The other allocators now use this manager
|
||||||
in order to get memory blocks.
|
in order to get memory blocks.
|
||||||
- NEW: The heap allocator has been modified, now it is possible to have
|
- NEW: The heap allocator has been modified, now it is possible to have
|
||||||
multiple heaps. The default heap gets its memory from the new heap manager.
|
multiple heaps. The default heap gets its memory from the new heap manager.
|
||||||
|
- NEW: Added a "hungry" mode to the memory pools allocator, when enabled, this
|
||||||
|
mode makes a memory pool to feed memory from the core memory manager.
|
||||||
- CHANGE: Because the changes in the allocators some API prototypes changed:
|
- CHANGE: Because the changes in the allocators some API prototypes changed:
|
||||||
chHeapAlloc(), chHeapStatus(), chThdCreateFromHeap().
|
chHeapAlloc(), chHeapStatus(), chThdCreateFromHeap().
|
||||||
- CHANGE: Because the changes in the allocators some configuration options
|
- CHANGE: Because the changes in the allocators some configuration options
|
||||||
|
|
|
@ -47,6 +47,7 @@ struct testcase {
|
||||||
void (*execute)(void);
|
void (*execute)(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef __DOXYGEN__
|
||||||
union test_buffers {
|
union test_buffers {
|
||||||
struct {
|
struct {
|
||||||
WORKING_AREA(waT0, THREADS_STACK_SIZE);
|
WORKING_AREA(waT0, THREADS_STACK_SIZE);
|
||||||
|
@ -57,6 +58,7 @@ union test_buffers {
|
||||||
};
|
};
|
||||||
uint8_t buffer[WA_SIZE * 5];
|
uint8_t buffer[WA_SIZE * 5];
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
|
@ -85,7 +85,7 @@ static void heap1_execute(void) {
|
||||||
p1 = chHeapAlloc(NULL, SIZE);
|
p1 = chHeapAlloc(NULL, SIZE);
|
||||||
test_assert(1, p1 != NULL, "allocation failed");
|
test_assert(1, p1 != NULL, "allocation failed");
|
||||||
chHeapFree(p1);
|
chHeapFree(p1);
|
||||||
p1 = chHeapAlloc(NULL, 0x1000000);
|
p1 = chHeapAlloc(NULL, (size_t)-256);
|
||||||
test_assert(2, p1 == NULL, "allocation not failed");
|
test_assert(2, p1 == NULL, "allocation not failed");
|
||||||
|
|
||||||
/* Initial local heap state.*/
|
/* Initial local heap state.*/
|
||||||
|
|
Loading…
Reference in New Issue