git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@10726 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
Giovanni Di Sirio 2017-10-01 12:07:01 +00:00
parent 0daa851127
commit 6568f70bd8
11 changed files with 174 additions and 92 deletions

View File

@ -34,8 +34,8 @@
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/> <stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/> <stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.FORMAT" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&lt;contentList/&gt;"/> <stringAttribute key="org.eclipse.cdt.launch.FORMAT" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&lt;contentList/&gt;"/>
<stringAttribute key="org.eclipse.cdt.launch.GLOBAL_VARIABLES" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;globalVariableList/&gt;&#13;&#10;"/> <stringAttribute key="org.eclipse.cdt.launch.GLOBAL_VARIABLES" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;globalVariableList/&gt;&#10;"/>
<stringAttribute key="org.eclipse.cdt.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;memoryBlockExpressionList/&gt;&#13;&#10;"/> <stringAttribute key="org.eclipse.cdt.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;memoryBlockExpressionList/&gt;&#10;"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="./build/ch.elf"/> <stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="./build/ch.elf"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="RT-STM32F303-DISCOVERY"/> <stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="RT-STM32F303-DISCOVERY"/>
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/> <booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/>

View File

@ -68,7 +68,21 @@
/** /**
* @brief Memory get function. * @brief Memory get function.
*/ */
typedef void *(*memgetfunc_t)(size_t size, unsigned align); typedef void *(*memgetfunc_t)(size_t size, unsigned align, size_t offset);
/**
* @brief Type of memory core object.
*/
typedef struct {
/**
* @brief Next free address.
*/
uint8_t *nextmem;
/**
* @brief Final address.
*/
uint8_t *endmem;
} memcore_t;
/*===========================================================================*/ /*===========================================================================*/
/* Module macros. */ /* Module macros. */
@ -78,12 +92,20 @@ typedef void *(*memgetfunc_t)(size_t size, unsigned align);
/* External declarations. */ /* External declarations. */
/*===========================================================================*/ /*===========================================================================*/
#if !defined(__DOXYGEN__)
extern memcore_t ch_memcore;
#endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
void _core_init(void); void _core_init(void);
void *chCoreAllocAlignedI(size_t size, unsigned align); void *chCoreAllocAlignedWithOffsetI(size_t size,
void *chCoreAllocAligned(size_t size, unsigned align); unsigned align,
size_t offset);
void *chCoreAllocAlignedWithOffset(size_t size,
unsigned align,
size_t offset);
size_t chCoreGetStatusX(void); size_t chCoreGetStatusX(void);
#ifdef __cplusplus #ifdef __cplusplus
} }
@ -93,6 +115,45 @@ extern "C" {
/* Module inline functions. */ /* Module inline functions. */
/*===========================================================================*/ /*===========================================================================*/
/**
* @brief Allocates a memory block.
* @details The allocated block is guaranteed to be properly aligned to the
* specified alignment.
*
* @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.
*
* @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) {
void *p;
chSysLock();
p = chCoreAllocAlignedWithOffsetI(size, align, 0U);
chSysUnlock();
return p;
}
/** /**
* @brief Allocates a memory block. * @brief Allocates a memory block.
* @details The allocated block is guaranteed to be properly aligned for a * @details The allocated block is guaranteed to be properly aligned for a
@ -106,7 +167,7 @@ extern "C" {
*/ */
static inline void *chCoreAllocI(size_t size) { static inline void *chCoreAllocI(size_t size) {
return chCoreAllocAlignedI(size, PORT_NATURAL_ALIGN); return chCoreAllocAlignedWithOffsetI(size, PORT_NATURAL_ALIGN, 0U);
} }
/** /**
@ -122,7 +183,7 @@ static inline void *chCoreAllocI(size_t size) {
*/ */
static inline void *chCoreAlloc(size_t size) { static inline void *chCoreAlloc(size_t size) {
return chCoreAllocAligned(size, PORT_NATURAL_ALIGN); return chCoreAllocAlignedWithOffsetI(size, PORT_NATURAL_ALIGN, 0U);
} }
#endif /* CH_CFG_USE_MEMCORE == TRUE */ #endif /* CH_CFG_USE_MEMCORE == TRUE */

View File

@ -106,7 +106,7 @@ static memory_heap_t default_heap;
*/ */
void _heap_init(void) { void _heap_init(void) {
default_heap.provider = chCoreAllocAligned; default_heap.provider = chCoreAllocAlignedWithOffset;
H_NEXT(&default_heap.header) = NULL; H_NEXT(&default_heap.header) = NULL;
H_PAGES(&default_heap.header) = 0; H_PAGES(&default_heap.header) = 0;
#if (CH_CFG_USE_MUTEXES == TRUE) || defined(__DOXYGEN__) #if (CH_CFG_USE_MUTEXES == TRUE) || defined(__DOXYGEN__)
@ -164,7 +164,7 @@ void chHeapObjectInit(memory_heap_t *heapp, void *buf, size_t size) {
* @api * @api
*/ */
void *chHeapAllocAligned(memory_heap_t *heapp, size_t size, unsigned align) { void *chHeapAllocAligned(memory_heap_t *heapp, size_t size, unsigned align) {
heap_header_t *qp, *hp; heap_header_t *qp, *hp, *ahp;
size_t pages; size_t pages;
chDbgCheck((size > 0U) && MEM_IS_VALID_ALIGNMENT(align)); chDbgCheck((size > 0U) && MEM_IS_VALID_ALIGNMENT(align));
@ -188,7 +188,6 @@ void *chHeapAllocAligned(memory_heap_t *heapp, size_t size, unsigned align) {
/* Start of the free blocks list.*/ /* Start of the free blocks list.*/
qp = &heapp->header; qp = &heapp->header;
while (H_NEXT(qp) != NULL) { while (H_NEXT(qp) != NULL) {
heap_header_t *ahp;
/* Next free block.*/ /* Next free block.*/
hp = H_NEXT(qp); hp = H_NEXT(qp);
@ -261,13 +260,16 @@ void *chHeapAllocAligned(memory_heap_t *heapp, size_t size, unsigned align) {
/* More memory is required, tries to get it from the associated provider /* More memory is required, tries to get it from the associated provider
else fails.*/ else fails.*/
if (heapp->provider != NULL) { if (heapp->provider != NULL) {
hp = heapp->provider((pages + 1U) * CH_HEAP_ALIGNMENT, align); ahp = heapp->provider((pages + 1U) * CH_HEAP_ALIGNMENT,
if (hp != NULL) { align,
sizeof (heap_header_t));
if (ahp != NULL) {
hp = ahp - 1U;
H_HEAP(hp) = heapp; H_HEAP(hp) = heapp;
H_SIZE(hp) = size; H_SIZE(hp) = size;
/*lint -save -e9087 [11.3] Safe cast.*/ /*lint -save -e9087 [11.3] Safe cast.*/
return (void *)H_BLOCK(hp); return (void *)ahp;
/*lint -restore*/ /*lint -restore*/
} }
} }

View File

@ -52,6 +52,11 @@
/* Module exported variables. */ /* Module exported variables. */
/*===========================================================================*/ /*===========================================================================*/
/**
* @brief Memory core descriptor.
*/
memcore_t ch_memcore;
/*===========================================================================*/ /*===========================================================================*/
/* Module local types. */ /* Module local types. */
/*===========================================================================*/ /*===========================================================================*/
@ -60,9 +65,6 @@
/* Module local variables. */ /* Module local variables. */
/*===========================================================================*/ /*===========================================================================*/
static uint8_t *nextmem;
static uint8_t *endmem;
/*===========================================================================*/ /*===========================================================================*/
/* Module local functions. */ /* Module local functions. */
/*===========================================================================*/ /*===========================================================================*/
@ -82,63 +84,74 @@ void _core_init(void) {
extern uint8_t __heap_end__[]; extern uint8_t __heap_end__[];
/*lint -save -e9033 [10.8] Required cast operations.*/ /*lint -save -e9033 [10.8] Required cast operations.*/
nextmem = __heap_base__; ch_memcore.nextmem = __heap_base__;
endmem = __heap_end__; ch_memcore.endmem = __heap_end__;
/*lint restore*/ /*lint restore*/
#else #else
static uint8_t static_heap[CH_CFG_MEMCORE_SIZE]; static uint8_t static_heap[CH_CFG_MEMCORE_SIZE];
nextmem = &static_heap[0]; ch_memcore.nextmem = &static_heap[0];
endmem = &static_heap[CH_CFG_MEMCORE_SIZE]; ch_memcore.endmem = &static_heap[CH_CFG_MEMCORE_SIZE];
#endif #endif
} }
/** /**
* @brief Allocates a memory block. * @brief Allocates a memory block.
* @details The allocated block is guaranteed to be properly aligned to the * @details This function allocates a block of @p offset + @p size bytes. The
* specified alignment. * returned pointer has @p offset bytes before its address and
* @p size bytes after.
* *
* @param[in] size the size of the block to be allocated. * @param[in] size the size of the block to be allocated.
* @param[in] align desired memory alignment * @param[in] align desired memory alignment
* @param[in] offset aligned pointer offset
* @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.
* *
* @iclass * @iclass
*/ */
void *chCoreAllocAlignedI(size_t size, unsigned align) { void *chCoreAllocAlignedWithOffsetI(size_t size,
uint8_t *p; unsigned align,
size_t offset) {
uint8_t *p, *next;
chDbgCheckClassI(); chDbgCheckClassI();
chDbgCheck(MEM_IS_VALID_ALIGNMENT(align)); chDbgCheck(MEM_IS_VALID_ALIGNMENT(align));
size = MEM_ALIGN_NEXT(size, align); size = MEM_ALIGN_NEXT(size, align);
p = (uint8_t *)MEM_ALIGN_NEXT(nextmem, align); p = (uint8_t *)MEM_ALIGN_NEXT(ch_memcore.nextmem + offset, align);
next = p + size;
if (((size_t)endmem - (size_t)p) < size) { /* Considering also the case where there is numeric overflow.*/
if ((next > ch_memcore.endmem) || (next < ch_memcore.nextmem)) {
return NULL; return NULL;
} }
nextmem = p + size;
ch_memcore.nextmem = next;
return p; return p;
} }
/** /**
* @brief Allocates a memory block. * @brief Allocates a memory block.
* @details The allocated block is guaranteed to be properly aligned to the * @details This function allocates a block of @p offset + @p size bytes. The
* specified alignment. * returned pointer has @p offset bytes before its address and
* @p size bytes after.
* *
* @param[in] size the size of the block to be allocated * @param[in] size the size of the block to be allocated.
* @param[in] align desired memory alignment * @param[in] align desired memory alignment
* @param[in] offset aligned pointer offset
* @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.
* *
* @api * @api
*/ */
void *chCoreAllocAligned(size_t size, unsigned align) { void *chCoreAllocAlignedWithOffset(size_t size,
unsigned align,
size_t offset) {
void *p; void *p;
chSysLock(); chSysLock();
p = chCoreAllocAlignedI(size, align); p = chCoreAllocAlignedWithOffsetI(size, align, offset);
chSysUnlock(); chSysUnlock();
return p; return p;
@ -154,7 +167,7 @@ void *chCoreAllocAligned(size_t size, unsigned align) {
size_t chCoreGetStatusX(void) { size_t chCoreGetStatusX(void) {
/*lint -save -e9033 [10.8] The cast is safe.*/ /*lint -save -e9033 [10.8] The cast is safe.*/
return (size_t)(endmem - nextmem); return (size_t)(ch_memcore.endmem - ch_memcore.nextmem);
/*lint -restore*/ /*lint -restore*/
} }
#endif /* CH_CFG_USE_MEMCORE == TRUE */ #endif /* CH_CFG_USE_MEMCORE == TRUE */

View File

@ -130,7 +130,7 @@ void *chPoolAllocI(memory_pool_t *mp) {
mp->next = mp->next->next; mp->next = mp->next->next;
} }
else if (mp->provider != NULL) { else if (mp->provider != NULL) {
objp = mp->provider(mp->object_size, PORT_NATURAL_ALIGN); /* TODO: Alignment is not properly handled */ objp = mp->provider(mp->object_size, PORT_NATURAL_ALIGN, 0U); /* TODO: Alignment is not properly handled */
} }
/*lint -restore*/ /*lint -restore*/

View File

@ -48,12 +48,12 @@
/** /**
* @brief Kernel version string. * @brief Kernel version string.
*/ */
#define CH_KERNEL_VERSION "4.0.0" #define CH_KERNEL_VERSION "5.0.0"
/** /**
* @brief Kernel version major number. * @brief Kernel version major number.
*/ */
#define CH_KERNEL_MAJOR 4 #define CH_KERNEL_MAJOR 5
/** /**
* @brief Kernel version minor number. * @brief Kernel version minor number.

View File

@ -124,6 +124,8 @@
dependencies and configuration directories. This makes possible dependencies and configuration directories. This makes possible
to have multiple non-conflicting makefiles in the same project. to have multiple non-conflicting makefiles in the same project.
Updated the various platform.mk implementing "smart build" mode. Updated the various platform.mk implementing "smart build" mode.
- LIB: Fixed heap allocator returning unaligned blocks (bug #888)(backported
to 17.6.2).
- NIL: Fixed duplicated entries in NIL documentation (bug #887)(backported - NIL: Fixed duplicated entries in NIL documentation (bug #887)(backported
to 17.6.1). to 17.6.1).
- HAL: Fixed USB GET_DESCRIPTOR not handled for Interface Recipients (bug #885) - HAL: Fixed USB GET_DESCRIPTOR not handled for Interface Recipients (bug #885)

View File

@ -1158,10 +1158,11 @@ static MEMORYPOOL_DECL(mp1, sizeof (uint32_t), NULL);
static GUARDEDMEMORYPOOL_DECL(gmp1, sizeof (uint32_t)); static GUARDEDMEMORYPOOL_DECL(gmp1, sizeof (uint32_t));
#endif #endif
static void *null_provider(size_t size, unsigned align) { static void *null_provider(size_t size, unsigned align, size_t offset) {
(void)size; (void)size;
(void)align; (void)align;
(void)offset;
return NULL; return NULL;
}]]></value> }]]></value>

View File

@ -58,10 +58,11 @@ static MEMORYPOOL_DECL(mp1, sizeof (uint32_t), NULL);
static GUARDEDMEMORYPOOL_DECL(gmp1, sizeof (uint32_t)); static GUARDEDMEMORYPOOL_DECL(gmp1, sizeof (uint32_t));
#endif #endif
static void *null_provider(size_t size, unsigned align) { static void *null_provider(size_t size, unsigned align, size_t offset) {
(void)size; (void)size;
(void)align; (void)align;
(void)offset;
return NULL; return NULL;
} }

View File

@ -3547,10 +3547,11 @@ static MEMORYPOOL_DECL(mp1, sizeof (uint32_t), NULL);
static GUARDEDMEMORYPOOL_DECL(gmp1, sizeof (uint32_t)); static GUARDEDMEMORYPOOL_DECL(gmp1, sizeof (uint32_t));
#endif #endif
static void *null_provider(size_t size, unsigned align) { static void *null_provider(size_t size, unsigned align, size_t offset) {
(void)size; (void)size;
(void)align; (void)align;
(void)offset;
return NULL; return NULL;
}]]></value> }]]></value>

View File

@ -58,10 +58,11 @@ static MEMORYPOOL_DECL(mp1, sizeof (uint32_t), NULL);
static GUARDEDMEMORYPOOL_DECL(gmp1, sizeof (uint32_t)); static GUARDEDMEMORYPOOL_DECL(gmp1, sizeof (uint32_t));
#endif #endif
static void *null_provider(size_t size, unsigned align) { static void *null_provider(size_t size, unsigned align, size_t offset) {
(void)size; (void)size;
(void)align; (void)align;
(void)offset;
return NULL; return NULL;
} }