2009-10-11 19:43:13 +00:00
|
|
|
/*
|
|
|
|
ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
|
|
|
|
|
|
|
|
This file is part of ChibiOS/RT.
|
|
|
|
|
|
|
|
ChibiOS/RT is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
ChibiOS/RT is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
2009-10-16 17:45:19 +00:00
|
|
|
* @file chmemcore.c
|
|
|
|
* @brief Core memory manager code.
|
|
|
|
* @addtogroup memcore
|
2009-10-11 19:43:13 +00:00
|
|
|
* @{
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <ch.h>
|
|
|
|
|
2009-10-16 17:45:19 +00:00
|
|
|
#if CH_USE_MEMCORE
|
2009-10-11 19:43:13 +00:00
|
|
|
|
2009-10-16 17:45:19 +00:00
|
|
|
#if CH_MEMCORE_SIZE == 0
|
2009-10-11 19:43:13 +00:00
|
|
|
extern align_t __heap_base__;
|
|
|
|
extern align_t __heap_end__;
|
|
|
|
#else
|
2009-10-17 07:35:31 +00:00
|
|
|
align_t buffer[MEM_ALIGN_SIZE(CH_MEMCORE_SIZE) / sizeof(align_t)];
|
2009-10-11 19:43:13 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
static align_t *nextmem;
|
|
|
|
static align_t *endmem;
|
|
|
|
|
2009-10-16 17:45:19 +00:00
|
|
|
/**
|
|
|
|
* @brief Low level memory manager initialization.
|
|
|
|
*
|
|
|
|
* @note Internal use only.
|
|
|
|
*/
|
|
|
|
void core_init(void) {
|
|
|
|
#if CH_MEMCORE_SIZE == 0
|
2009-10-11 19:43:13 +00:00
|
|
|
nextmem = &__heap_base__;
|
|
|
|
endmem = &__heap_end__;
|
|
|
|
#else
|
|
|
|
nextmem = &buffer[0];
|
2009-10-17 07:35:31 +00:00
|
|
|
endmem = &buffer[MEM_ALIGN_SIZE(CH_MEMCORE_SIZE) / sizeof(align_t)];
|
2009-10-11 19:43:13 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Allocates a block of memory.
|
|
|
|
* @details The size of the returned block is aligned to the alignment
|
|
|
|
* type @p align_t so it is not possible to allocate less than
|
|
|
|
* <code>sizeof(align_t)</code>.
|
|
|
|
*
|
|
|
|
*
|
2009-10-17 09:21:59 +00:00
|
|
|
* @param[in] size the size of the block to be allocated
|
2009-10-11 19:43:13 +00:00
|
|
|
* @return A pointer to the allocated memory block.
|
|
|
|
* @retval NULL allocation failed, core memory exhausted.
|
|
|
|
*/
|
|
|
|
void *chCoreAlloc(size_t size) {
|
|
|
|
void *p;
|
|
|
|
|
|
|
|
chSysLock();
|
|
|
|
p = chCoreAllocI(size);
|
|
|
|
chSysUnlock();
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Allocates a block of memory.
|
|
|
|
* @details The size of the returned block is aligned to the alignment
|
|
|
|
* type @p align_t so it is not possible to allocate less than
|
|
|
|
* <code>sizeof(align_t)</code>.
|
|
|
|
*
|
2009-10-17 09:21:59 +00:00
|
|
|
* @param[in] size the size of the block to be allocated.
|
2009-10-11 19:43:13 +00:00
|
|
|
* @return A pointer to the allocated memory block.
|
|
|
|
* @retval NULL allocation failed, core memory exhausted.
|
|
|
|
*/
|
|
|
|
void *chCoreAllocI(size_t size) {
|
|
|
|
void *p;
|
|
|
|
|
2009-10-16 17:45:19 +00:00
|
|
|
size = MEM_ALIGN_SIZE(size);
|
2009-10-17 08:05:52 +00:00
|
|
|
if ((size_t)((uint8_t *)endmem - (uint8_t *)nextmem) < size)
|
2009-10-11 19:43:13 +00:00
|
|
|
return NULL;
|
|
|
|
p = nextmem;
|
|
|
|
nextmem += size;
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
2009-10-16 17:45:19 +00:00
|
|
|
#endif /* CH_USE_MEMCORE */
|
2009-10-11 19:43:13 +00:00
|
|
|
|
|
|
|
/** @} */
|