You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
212 lines
7.1 KiB
C
212 lines
7.1 KiB
C
4 years ago
|
/*
|
||
|
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio.
|
||
|
|
||
|
This file is part of ChibiOS.
|
||
|
|
||
|
ChibiOS 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 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/>.
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @file oslib/include/chmemcore.h
|
||
|
* @brief Core memory manager macros and structures.
|
||
|
*
|
||
|
* @addtogroup oslib_memcore
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
#ifndef CHMEMCORE_H
|
||
|
#define CHMEMCORE_H
|
||
|
|
||
|
#if (CH_CFG_USE_MEMCORE == TRUE) || defined(__DOXYGEN__)
|
||
|
|
||
|
/*===========================================================================*/
|
||
|
/* Module constants. */
|
||
|
/*===========================================================================*/
|
||
|
|
||
|
/*===========================================================================*/
|
||
|
/* Module pre-compile time settings. */
|
||
|
/*===========================================================================*/
|
||
|
|
||
|
/**
|
||
|
* @brief Managed RAM size.
|
||
|
* @details Size of the RAM area to be managed by the OS. If set to zero
|
||
|
* then the whole available RAM is used. The core memory is made
|
||
|
* available to the heap allocator and/or can be used directly through
|
||
|
* the simplified core memory allocator.
|
||
|
*
|
||
|
* @note In order to let the OS manage the whole RAM the linker script must
|
||
|
* provide the @p __heap_base__ and @p __heap_end__ symbols.
|
||
|
* @note Requires @p CH_CFG_USE_MEMCORE.
|
||
|
*/
|
||
|
#if !defined(CH_CFG_MEMCORE_SIZE) || defined(__DOXYGEN__)
|
||
|
#define CH_CFG_MEMCORE_SIZE 0
|
||
|
#endif
|
||
|
|
||
|
/*===========================================================================*/
|
||
|
/* Derived constants and error checks. */
|
||
|
/*===========================================================================*/
|
||
|
|
||
|
#if CH_CFG_MEMCORE_SIZE < 0
|
||
|
#error "invalid CH_CFG_MEMCORE_SIZE value specified"
|
||
|
#endif
|
||
|
|
||
|
/*===========================================================================*/
|
||
|
/* Module data structures and types. */
|
||
|
/*===========================================================================*/
|
||
|
|
||
|
/**
|
||
|
* @brief Memory get function.
|
||
|
*/
|
||
|
typedef void *(*memgetfunc_t)(size_t size, unsigned align);
|
||
|
|
||
|
/**
|
||
|
* @brief Enhanced memory get function.
|
||
|
*/
|
||
|
typedef void *(*memgetfunc2_t)(size_t size, unsigned align, size_t offset);
|
||
|
|
||
|
/**
|
||
|
* @brief Type of memory core object.
|
||
|
*/
|
||
|
typedef struct {
|
||
|
/**
|
||
|
* @brief Next free address.
|
||
|
*/
|
||
|
uint8_t *basemem;
|
||
|
/**
|
||
|
* @brief Final address.
|
||
|
*/
|
||
|
uint8_t *topmem;
|
||
|
} memcore_t;
|
||
|
|
||
|
/*===========================================================================*/
|
||
|
/* Module macros. */
|
||
|
/*===========================================================================*/
|
||
|
|
||
|
/**
|
||
|
* @brief Allocates a memory block.
|
||
|
* @note This is a generic form with unspecified allocation position.
|
||
|
*
|
||
|
* @iclass
|
||
|
*/
|
||
|
#define chCoreAllocAlignedWithOffsetI chCoreAllocFromTopI
|
||
|
|
||
|
/**
|
||
|
* @brief Allocates a memory block.
|
||
|
* @note This is a generic form with unspecified allocation position.
|
||
|
*
|
||
|
* @api
|
||
|
*/
|
||
|
#define chCoreAllocAlignedWithOffset chCoreAllocFromTop
|
||
|
|
||
|
/*===========================================================================*/
|
||
|
/* External declarations. */
|
||
|
/*===========================================================================*/
|
||
|
|
||
|
#if !defined(__DOXYGEN__)
|
||
|
extern memcore_t ch_memcore;
|
||
|
#endif
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
void _core_init(void);
|
||
|
void *chCoreAllocFromBaseI(size_t size, unsigned align, size_t offset);
|
||
|
void *chCoreAllocFromTopI(size_t size, unsigned align, size_t offset);
|
||
|
void *chCoreAllocFromBase(size_t size, unsigned align, size_t offset);
|
||
|
void *chCoreAllocFromTop(size_t size, unsigned align, size_t offset);
|
||
|
size_t chCoreGetStatusX(void);
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/*===========================================================================*/
|
||
|
/* Module inline functions. */
|
||
|
/*===========================================================================*/
|
||
|
|
||
|
/**
|
||
|
* @brief Allocates a memory block.
|
||
|
* @details The allocated block is guaranteed to be properly aligned to the
|
||
|
* specified alignment.
|
||
|
* @note This is a generic form with unspecified allocation position.
|
||
|
*
|
||
|
* @param[in] size the size of the block to be allocated.
|
||
|
* @param[in] align desired memory alignment
|
||
|
* @return A pointer to the allocated memory block.
|
||
|
* @retval NULL allocation failed, core memory exhausted.
|
||
|
*
|
||
|
* @iclass
|
||
|
*/
|
||
|
static inline void *chCoreAllocAlignedI(size_t size, unsigned align) {
|
||
|
|
||
|
return chCoreAllocAlignedWithOffsetI(size, align, 0U);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Allocates a memory block.
|
||
|
* @details The allocated block is guaranteed to be properly aligned to the
|
||
|
* specified alignment.
|
||
|
* @note This is a generic form with unspecified allocation position.
|
||
|
*
|
||
|
* @param[in] size the size of the block to be allocated
|
||
|
* @param[in] align desired memory alignment
|
||
|
* @return A pointer to the allocated memory block.
|
||
|
* @retval NULL allocation failed, core memory exhausted.
|
||
|
*
|
||
|
* @api
|
||
|
*/
|
||
|
static inline void *chCoreAllocAligned(size_t size, unsigned align) {
|
||
|
|
||
|
return chCoreAllocAlignedWithOffset(size, align, 0U);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Allocates a memory block.
|
||
|
* @details The allocated block is guaranteed to be properly aligned for a
|
||
|
* pointer data type.
|
||
|
* @note This is a generic form with unspecified allocation position.
|
||
|
*
|
||
|
* @param[in] size the size of the block to be allocated.
|
||
|
* @return A pointer to the allocated memory block.
|
||
|
* @retval NULL allocation failed, core memory exhausted.
|
||
|
*
|
||
|
* @iclass
|
||
|
*/
|
||
|
static inline void *chCoreAllocI(size_t size) {
|
||
|
|
||
|
return chCoreAllocAlignedWithOffsetI(size, PORT_NATURAL_ALIGN, 0U);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Allocates a memory block.
|
||
|
* @details The allocated block is guaranteed to be properly aligned for a
|
||
|
* pointer data type.
|
||
|
* @note This is a generic form with unspecified allocation position.
|
||
|
*
|
||
|
* @param[in] size the size of the block to be allocated.
|
||
|
* @return A pointer to the allocated memory block.
|
||
|
* @retval NULL allocation failed, core memory exhausted.
|
||
|
*
|
||
|
* @api
|
||
|
*/
|
||
|
static inline void *chCoreAlloc(size_t size) {
|
||
|
|
||
|
return chCoreAllocAlignedWithOffset(size, PORT_NATURAL_ALIGN, 0U);
|
||
|
}
|
||
|
|
||
|
#endif /* CH_CFG_USE_MEMCORE == TRUE */
|
||
|
|
||
|
#endif /* CHMEMCORE_H */
|
||
|
|
||
|
/** @} */
|