From b16e783aaed6f30f1e276d68bcebc0cac7ed644a Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Sat, 17 Mar 2018 21:44:30 +0000 Subject: Typo. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@11804 110e8d01-0319-4d1e-a829-52ad28d1bb01 --- os/lib/include/chfifo.h | 338 -------------------------------------------- os/lib/include/chheap.h | 178 ----------------------- os/lib/include/chlib.h | 4 +- os/lib/include/chmemheaps.h | 178 +++++++++++++++++++++++ os/lib/include/chobjfifos.h | 338 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 518 insertions(+), 518 deletions(-) delete mode 100644 os/lib/include/chfifo.h delete mode 100644 os/lib/include/chheap.h create mode 100644 os/lib/include/chmemheaps.h create mode 100644 os/lib/include/chobjfifos.h (limited to 'os/lib/include') diff --git a/os/lib/include/chfifo.h b/os/lib/include/chfifo.h deleted file mode 100644 index 066de53e6..000000000 --- a/os/lib/include/chfifo.h +++ /dev/null @@ -1,338 +0,0 @@ -/* - 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 . -*/ - -/** - * @file chfifo.h - * @brief Objects FIFO structures and macros. - * @details This module implements a generic FIFO queue of objects by - * coupling a Guarded Memory Pool (for objects storage) and - * a MailBox.
- * On the sender side free objects are taken from the pool, filled - * and then sent to the receiver, on the receiver side objects are - * fetched, used and then returned to the pool. - * Operations defined for object FIFOs: - * - Take: An object is taken from the pool of the free - * objects, can be blocking. - * - Return: An object is returned to the pool of the - * free objects, it is guaranteed to be non-blocking. - * - Send: An object is sent through the mailbox, it is - * guaranteed to be non-blocking - * - Receive: An object is received from the mailbox, - * can be blocking. - * . - * - * @addtogroup objects_fifo - * @{ - */ - -#ifndef CHFIFO_H -#define CHFIFO_H - -#if (CH_CFG_USE_OBJ_FIFOS == TRUE) || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Module constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if CH_CFG_USE_MEMPOOLS == FALSE -#error "CH_CFG_USE_OBJ_FIFOS requires CH_CFG_USE_MEMPOOLS" -#endif - -#if CH_CFG_USE_SEMAPHORES == FALSE -#error "CH_CFG_USE_OBJ_FIFOS requires CH_CFG_USE_SEMAPHORES" -#endif - -#if CH_CFG_USE_MAILBOXES == FALSE -#error "CH_CFG_USE_OBJ_FIFOS requires CH_CFG_USE_MAILBOXES" -#endif - -/*===========================================================================*/ -/* Module data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type of an objects FIFO. - */ -typedef struct ch_objects_fifo { - /** - * @brief Pool of the free objects. - */ - guarded_memory_pool_t free; - /** - * @brief Mailbox of the sent objects. - */ - mailbox_t mbx; -} objects_fifo_t; - -/*===========================================================================*/ -/* Module macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __cplusplus -} -#endif - -/*===========================================================================*/ -/* Module inline functions. */ -/*===========================================================================*/ - -/** - * @brief Initializes a FIFO object. - * @pre The messages size must be a multiple of the alignment - * requirement. - * - * @param[out] ofp pointer to a @p objects_fifo_t structure - * @param[in] objsize size of objects - * @param[in] objn number of objects available - * @param[in] objalign required objects alignment - * @param[in] objbuf pointer to the buffer of objects, it must be able - * to hold @p objn objects of @p objsize size with - * @p objealign alignment - * @param[in] msgbuf pointer to the buffer of messages, it must be able - * to hold @p objn messages - * - * @init - */ -static inline void chFifoObjectInit(objects_fifo_t *ofp, size_t objsize, - size_t objn, unsigned objalign, - void *objbuf, msg_t *msgbuf) { - - chGuardedPoolObjectInitAligned(&ofp->free, objsize, objalign); - chGuardedPoolLoadArray(&ofp->free, objbuf, objn); - chMBObjectInit(&ofp->mbx, msgbuf, objn); -} - -/** - * @brief Allocates a free object. - * - * @param[in] ofp pointer to a @p objects_fifo_t structure - * @return The pointer to the allocated object. - * @retval NULL if an object is not immediately available. - * - * @iclass - */ -static inline void *chFifoTakeObjectI(objects_fifo_t *ofp) { - - return chGuardedPoolAllocI(&ofp->free); -} - -/** - * @brief Allocates a free object. - * - * @param[in] ofp pointer to a @p objects_fifo_t structure - * @param[in] timeout the number of ticks before the operation timeouts, - * the following special values are allowed: - * - @a TIME_IMMEDIATE immediate timeout. - * - @a TIME_INFINITE no timeout. - * . - * @return The pointer to the allocated object. - * @retval NULL if an object is not available within the specified - * timeout. - * - * @sclass - */ -static inline void *chFifoTakeObjectTimeoutS(objects_fifo_t *ofp, - sysinterval_t timeout) { - - return chGuardedPoolAllocTimeoutS(&ofp->free, timeout); -} - -/** - * @brief Allocates a free object. - * - * @param[in] ofp pointer to a @p objects_fifo_t structure - * @param[in] timeout the number of ticks before the operation timeouts, - * the following special values are allowed: - * - @a TIME_IMMEDIATE immediate timeout. - * - @a TIME_INFINITE no timeout. - * . - * @return The pointer to the allocated object. - * @retval NULL if an object is not available within the specified - * timeout. - * - * @api - */ -static inline void *chFifoTakeObjectTimeout(objects_fifo_t *ofp, - sysinterval_t timeout) { - - return chGuardedPoolAllocTimeout(&ofp->free, timeout); -} - -/** - * @brief Releases a fetched object. - * - * @param[in] ofp pointer to a @p objects_fifo_t structure - * @param[in] objp pointer to the object to be released - * - * @iclass - */ -static inline void chFifoReturnObjectI(objects_fifo_t *ofp, - void *objp) { - - chGuardedPoolFreeI(&ofp->free, objp); -} - -/** - * @brief Releases a fetched object. - * - * @param[in] ofp pointer to a @p objects_fifo_t structure - * @param[in] objp pointer to the object to be released - * - * @api - */ -static inline void chFifoReturnObject(objects_fifo_t *ofp, - void *objp) { - - chGuardedPoolFree(&ofp->free, objp); -} - -/** - * @brief Posts an object. - * @note By design the object can be always immediately posted. - * - * @param[in] ofp pointer to a @p objects_fifo_t structure - * @param[in] objp pointer to the object to be posted - * - * @iclass - */ -static inline void chFifoSendObjectI(objects_fifo_t *ofp, - void *objp) { - msg_t msg; - - msg = chMBPostI(&ofp->mbx, (msg_t)objp); - chDbgAssert(msg == MSG_OK, "post failed"); -} - -/** - * @brief Posts an object. - * @note By design the object can be always immediately posted. - * - * @param[in] ofp pointer to a @p objects_fifo_t structure - * @param[in] objp pointer to the object to be posted - * - * @sclass - */ -static inline void chFifoSendObjectS(objects_fifo_t *ofp, - void *objp) { - msg_t msg; - - msg = chMBPostTimeoutS(&ofp->mbx, (msg_t)objp, TIME_IMMEDIATE); - chDbgAssert(msg == MSG_OK, "post failed"); -} - -/** - * @brief Posts an object. - * @note By design the object can be always immediately posted. - * - * @param[in] ofp pointer to a @p objects_fifo_t structure - * @param[in] objp pointer to the object to be released - * - * @api - */ -static inline void chFifoSendObject(objects_fifo_t *ofp, void *objp) { - - msg_t msg; - - msg = chMBPostTimeout(&ofp->mbx, (msg_t)objp, TIME_IMMEDIATE); - chDbgAssert(msg == MSG_OK, "post failed"); -} - -/** - * @brief Fetches an object. - * - * @param[in] ofp pointer to a @p objects_fifo_t structure - * @param[in] objpp pointer to the fetched object reference - * @return The operation status. - * @retval MSG_OK if an object has been correctly fetched. - * @retval MSG_TIMEOUT if the FIFO is empty and a message cannot be fetched. - * - * @iclass - */ -static inline msg_t chFifoReceiveObjectI(objects_fifo_t *ofp, - void **objpp) { - - return chMBFetchI(&ofp->mbx, (msg_t *)objpp); -} - -/** - * @brief Fetches an object. - * - * @param[in] ofp pointer to a @p objects_fifo_t structure - * @param[in] objpp pointer to the fetched object reference - * @param[in] timeout the number of ticks before the operation timeouts, - * the following special values are allowed: - * - @a TIME_IMMEDIATE immediate timeout. - * - @a TIME_INFINITE no timeout. - * . - * @return The operation status. - * @retval MSG_OK if an object has been correctly fetched. - * @retval MSG_TIMEOUT if the operation has timed out. - * - * @sclass - */ -static inline msg_t chFifoReceiveObjectTimeoutS(objects_fifo_t *ofp, - void **objpp, - sysinterval_t timeout) { - - return chMBFetchTimeoutS(&ofp->mbx, (msg_t *)objpp, timeout); -} - -/** - * @brief Fetches an object. - * - * @param[in] ofp pointer to a @p objects_fifo_t structure - * @param[in] objpp pointer to the fetched object reference - * @param[in] timeout the number of ticks before the operation timeouts, - * the following special values are allowed: - * - @a TIME_IMMEDIATE immediate timeout. - * - @a TIME_INFINITE no timeout. - * . - * @return The operation status. - * @retval MSG_OK if an object has been correctly fetched. - * @retval MSG_TIMEOUT if the operation has timed out. - * - * @api - */ -static inline msg_t chFifoReceiveObjectTimeout(objects_fifo_t *ofp, - void **objpp, - sysinterval_t timeout) { - - return chMBFetchTimeout(&ofp->mbx, (msg_t *)objpp, timeout); -} -#endif /* CH_CFG_USE_OBJ_FIFOS == TRUE */ - -#endif /* CHFIFO_H */ - -/** @} */ diff --git a/os/lib/include/chheap.h b/os/lib/include/chheap.h deleted file mode 100644 index 24e8e4761..000000000 --- a/os/lib/include/chheap.h +++ /dev/null @@ -1,178 +0,0 @@ -/* - 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 . -*/ - -/** - * @file chheap.h - * @brief Heaps macros and structures. - * - * @addtogroup heaps - * @{ - */ - -#ifndef CHHEAP_H -#define CHHEAP_H - -#if (CH_CFG_USE_HEAP == TRUE) || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Module constants. */ -/*===========================================================================*/ - -/** - * @brief Minimum alignment used for heap. - * @note Cannot use the sizeof operator in this macro. - */ -#if (SIZEOF_PTR == 4) || defined(__DOXYGEN__) -#define CH_HEAP_ALIGNMENT 8U -#elif (SIZEOF_PTR == 2) -#define CH_HEAP_ALIGNMENT 4U -#else -#error "unsupported pointer size" -#endif - -/*===========================================================================*/ -/* Module pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if CH_CFG_USE_MEMCORE == FALSE -#error "CH_CFG_USE_HEAP requires CH_CFG_USE_MEMCORE" -#endif - -#if (CH_CFG_USE_MUTEXES == FALSE) && (CH_CFG_USE_SEMAPHORES == FALSE) -#error "CH_CFG_USE_HEAP requires CH_CFG_USE_MUTEXES and/or CH_CFG_USE_SEMAPHORES" -#endif - -/*===========================================================================*/ -/* Module data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type of a memory heap. - */ -typedef struct memory_heap memory_heap_t; - -/** - * @brief Type of a memory heap header. - */ -typedef union heap_header heap_header_t; - -/** - * @brief Memory heap block header. - */ -union heap_header { - struct { - heap_header_t *next; /**< @brief Next block in free list. */ - size_t pages; /**< @brief Size of the area in pages. */ - } free; - struct { - memory_heap_t *heap; /**< @brief Block owner heap. */ - size_t size; /**< @brief Size of the area in bytes. */ - } used; -}; - -/** - * @brief Structure describing a memory heap. - */ -struct memory_heap { - memgetfunc2_t provider; /**< @brief Memory blocks provider for - this heap. */ - heap_header_t header; /**< @brief Free blocks list header. */ -#if CH_CFG_USE_MUTEXES == TRUE - mutex_t mtx; /**< @brief Heap access mutex. */ -#else - semaphore_t sem; /**< @brief Heap access semaphore. */ -#endif -}; - -/*===========================================================================*/ -/* Module macros. */ -/*===========================================================================*/ - -/** - * @brief Allocation of an aligned static heap buffer. - */ -#define CH_HEAP_AREA(name, size) \ - ALIGNED_VAR(CH_HEAP_ALIGNMENT) \ - uint8_t name[MEM_ALIGN_NEXT((size), CH_HEAP_ALIGNMENT)] - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void _heap_init(void); - void chHeapObjectInit(memory_heap_t *heapp, void *buf, size_t size); - void *chHeapAllocAligned(memory_heap_t *heapp, size_t size, unsigned align); - void chHeapFree(void *p); - size_t chHeapStatus(memory_heap_t *heapp, size_t *totalp, size_t *largestp); -#ifdef __cplusplus -} -#endif - -/*===========================================================================*/ -/* Module inline functions. */ -/*===========================================================================*/ - -/** - * @brief Allocates a block of memory from the heap by using the first-fit - * algorithm. - * @details The allocated block is guaranteed to be properly aligned for a - * pointer data type. - * - * @param[in] heapp pointer to a heap descriptor or @p NULL in order to - * access the default heap. - * @param[in] size the size of the block to be allocated. Note that the - * allocated block may be a bit bigger than the requested - * size for alignment and fragmentation reasons. - * @return A pointer to the allocated block. - * @retval NULL if the block cannot be allocated. - * - * @api - */ -static inline void *chHeapAlloc(memory_heap_t *heapp, size_t size) { - - return chHeapAllocAligned(heapp, size, CH_HEAP_ALIGNMENT); -} - -/** - * @brief Returns the size of an allocated block. - * @note The returned value is the requested size, the real size is the - * same value aligned to the next @p CH_HEAP_ALIGNMENT multiple. - * - * @param[in] p pointer to the memory block - * @return Size of the block. - * - * @api - */ -static inline size_t chHeapGetSize(const void *p) { - - return ((heap_header_t *)p - 1U)->used.size; -} - -#endif /* CH_CFG_USE_HEAP == TRUE */ - -#endif /* CHHEAP_H */ - -/** @} */ diff --git a/os/lib/include/chlib.h b/os/lib/include/chlib.h index 6a1944e53..674561cb8 100644 --- a/os/lib/include/chlib.h +++ b/os/lib/include/chlib.h @@ -210,9 +210,9 @@ #include "chbsem.h" #include "chmboxes.h" #include "chmemcore.h" -#include "chheap.h" +#include "chmemheaps.h" #include "chmempools.h" -#include "chfifo.h" +#include "chobjfifos.h" //#include "chpipes.h" #include "chfactory.h" diff --git a/os/lib/include/chmemheaps.h b/os/lib/include/chmemheaps.h new file mode 100644 index 000000000..59248a89e --- /dev/null +++ b/os/lib/include/chmemheaps.h @@ -0,0 +1,178 @@ +/* + 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 . +*/ + +/** + * @file chmemheaps.h + * @brief Memory heaps macros and structures. + * + * @addtogroup heaps + * @{ + */ + +#ifndef CHMEMHEAPS_H +#define CHMEMHEAPS_H + +#if (CH_CFG_USE_HEAP == TRUE) || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Module constants. */ +/*===========================================================================*/ + +/** + * @brief Minimum alignment used for heap. + * @note Cannot use the sizeof operator in this macro. + */ +#if (SIZEOF_PTR == 4) || defined(__DOXYGEN__) +#define CH_HEAP_ALIGNMENT 8U +#elif (SIZEOF_PTR == 2) +#define CH_HEAP_ALIGNMENT 4U +#else +#error "unsupported pointer size" +#endif + +/*===========================================================================*/ +/* Module pre-compile time settings. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +#if CH_CFG_USE_MEMCORE == FALSE +#error "CH_CFG_USE_HEAP requires CH_CFG_USE_MEMCORE" +#endif + +#if (CH_CFG_USE_MUTEXES == FALSE) && (CH_CFG_USE_SEMAPHORES == FALSE) +#error "CH_CFG_USE_HEAP requires CH_CFG_USE_MUTEXES and/or CH_CFG_USE_SEMAPHORES" +#endif + +/*===========================================================================*/ +/* Module data structures and types. */ +/*===========================================================================*/ + +/** + * @brief Type of a memory heap. + */ +typedef struct memory_heap memory_heap_t; + +/** + * @brief Type of a memory heap header. + */ +typedef union heap_header heap_header_t; + +/** + * @brief Memory heap block header. + */ +union heap_header { + struct { + heap_header_t *next; /**< @brief Next block in free list. */ + size_t pages; /**< @brief Size of the area in pages. */ + } free; + struct { + memory_heap_t *heap; /**< @brief Block owner heap. */ + size_t size; /**< @brief Size of the area in bytes. */ + } used; +}; + +/** + * @brief Structure describing a memory heap. + */ +struct memory_heap { + memgetfunc2_t provider; /**< @brief Memory blocks provider for + this heap. */ + heap_header_t header; /**< @brief Free blocks list header. */ +#if CH_CFG_USE_MUTEXES == TRUE + mutex_t mtx; /**< @brief Heap access mutex. */ +#else + semaphore_t sem; /**< @brief Heap access semaphore. */ +#endif +}; + +/*===========================================================================*/ +/* Module macros. */ +/*===========================================================================*/ + +/** + * @brief Allocation of an aligned static heap buffer. + */ +#define CH_HEAP_AREA(name, size) \ + ALIGNED_VAR(CH_HEAP_ALIGNMENT) \ + uint8_t name[MEM_ALIGN_NEXT((size), CH_HEAP_ALIGNMENT)] + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#ifdef __cplusplus +extern "C" { +#endif + void _heap_init(void); + void chHeapObjectInit(memory_heap_t *heapp, void *buf, size_t size); + void *chHeapAllocAligned(memory_heap_t *heapp, size_t size, unsigned align); + void chHeapFree(void *p); + size_t chHeapStatus(memory_heap_t *heapp, size_t *totalp, size_t *largestp); +#ifdef __cplusplus +} +#endif + +/*===========================================================================*/ +/* Module inline functions. */ +/*===========================================================================*/ + +/** + * @brief Allocates a block of memory from the heap by using the first-fit + * algorithm. + * @details The allocated block is guaranteed to be properly aligned for a + * pointer data type. + * + * @param[in] heapp pointer to a heap descriptor or @p NULL in order to + * access the default heap. + * @param[in] size the size of the block to be allocated. Note that the + * allocated block may be a bit bigger than the requested + * size for alignment and fragmentation reasons. + * @return A pointer to the allocated block. + * @retval NULL if the block cannot be allocated. + * + * @api + */ +static inline void *chHeapAlloc(memory_heap_t *heapp, size_t size) { + + return chHeapAllocAligned(heapp, size, CH_HEAP_ALIGNMENT); +} + +/** + * @brief Returns the size of an allocated block. + * @note The returned value is the requested size, the real size is the + * same value aligned to the next @p CH_HEAP_ALIGNMENT multiple. + * + * @param[in] p pointer to the memory block + * @return Size of the block. + * + * @api + */ +static inline size_t chHeapGetSize(const void *p) { + + return ((heap_header_t *)p - 1U)->used.size; +} + +#endif /* CH_CFG_USE_HEAP == TRUE */ + +#endif /* CHMEMHEAPS_H */ + +/** @} */ diff --git a/os/lib/include/chobjfifos.h b/os/lib/include/chobjfifos.h new file mode 100644 index 000000000..51e7bf0a8 --- /dev/null +++ b/os/lib/include/chobjfifos.h @@ -0,0 +1,338 @@ +/* + 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 . +*/ + +/** + * @file chobjfifos.h + * @brief Objects FIFO structures and macros. + * @details This module implements a generic FIFO queue of objects by + * coupling a Guarded Memory Pool (for objects storage) and + * a MailBox.
+ * On the sender side free objects are taken from the pool, filled + * and then sent to the receiver, on the receiver side objects are + * fetched, used and then returned to the pool. + * Operations defined for object FIFOs: + * - Take: An object is taken from the pool of the free + * objects, can be blocking. + * - Return: An object is returned to the pool of the + * free objects, it is guaranteed to be non-blocking. + * - Send: An object is sent through the mailbox, it is + * guaranteed to be non-blocking + * - Receive: An object is received from the mailbox, + * can be blocking. + * . + * + * @addtogroup objects_fifo + * @{ + */ + +#ifndef CHOBJFIFOS_H +#define CHOBJFIFOS_H + +#if (CH_CFG_USE_OBJ_FIFOS == TRUE) || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Module constants. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module pre-compile time settings. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +#if CH_CFG_USE_MEMPOOLS == FALSE +#error "CH_CFG_USE_OBJ_FIFOS requires CH_CFG_USE_MEMPOOLS" +#endif + +#if CH_CFG_USE_SEMAPHORES == FALSE +#error "CH_CFG_USE_OBJ_FIFOS requires CH_CFG_USE_SEMAPHORES" +#endif + +#if CH_CFG_USE_MAILBOXES == FALSE +#error "CH_CFG_USE_OBJ_FIFOS requires CH_CFG_USE_MAILBOXES" +#endif + +/*===========================================================================*/ +/* Module data structures and types. */ +/*===========================================================================*/ + +/** + * @brief Type of an objects FIFO. + */ +typedef struct ch_objects_fifo { + /** + * @brief Pool of the free objects. + */ + guarded_memory_pool_t free; + /** + * @brief Mailbox of the sent objects. + */ + mailbox_t mbx; +} objects_fifo_t; + +/*===========================================================================*/ +/* Module macros. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +/*===========================================================================*/ +/* Module inline functions. */ +/*===========================================================================*/ + +/** + * @brief Initializes a FIFO object. + * @pre The messages size must be a multiple of the alignment + * requirement. + * + * @param[out] ofp pointer to a @p objects_fifo_t structure + * @param[in] objsize size of objects + * @param[in] objn number of objects available + * @param[in] objalign required objects alignment + * @param[in] objbuf pointer to the buffer of objects, it must be able + * to hold @p objn objects of @p objsize size with + * @p objealign alignment + * @param[in] msgbuf pointer to the buffer of messages, it must be able + * to hold @p objn messages + * + * @init + */ +static inline void chFifoObjectInit(objects_fifo_t *ofp, size_t objsize, + size_t objn, unsigned objalign, + void *objbuf, msg_t *msgbuf) { + + chGuardedPoolObjectInitAligned(&ofp->free, objsize, objalign); + chGuardedPoolLoadArray(&ofp->free, objbuf, objn); + chMBObjectInit(&ofp->mbx, msgbuf, objn); +} + +/** + * @brief Allocates a free object. + * + * @param[in] ofp pointer to a @p objects_fifo_t structure + * @return The pointer to the allocated object. + * @retval NULL if an object is not immediately available. + * + * @iclass + */ +static inline void *chFifoTakeObjectI(objects_fifo_t *ofp) { + + return chGuardedPoolAllocI(&ofp->free); +} + +/** + * @brief Allocates a free object. + * + * @param[in] ofp pointer to a @p objects_fifo_t structure + * @param[in] timeout the number of ticks before the operation timeouts, + * the following special values are allowed: + * - @a TIME_IMMEDIATE immediate timeout. + * - @a TIME_INFINITE no timeout. + * . + * @return The pointer to the allocated object. + * @retval NULL if an object is not available within the specified + * timeout. + * + * @sclass + */ +static inline void *chFifoTakeObjectTimeoutS(objects_fifo_t *ofp, + sysinterval_t timeout) { + + return chGuardedPoolAllocTimeoutS(&ofp->free, timeout); +} + +/** + * @brief Allocates a free object. + * + * @param[in] ofp pointer to a @p objects_fifo_t structure + * @param[in] timeout the number of ticks before the operation timeouts, + * the following special values are allowed: + * - @a TIME_IMMEDIATE immediate timeout. + * - @a TIME_INFINITE no timeout. + * . + * @return The pointer to the allocated object. + * @retval NULL if an object is not available within the specified + * timeout. + * + * @api + */ +static inline void *chFifoTakeObjectTimeout(objects_fifo_t *ofp, + sysinterval_t timeout) { + + return chGuardedPoolAllocTimeout(&ofp->free, timeout); +} + +/** + * @brief Releases a fetched object. + * + * @param[in] ofp pointer to a @p objects_fifo_t structure + * @param[in] objp pointer to the object to be released + * + * @iclass + */ +static inline void chFifoReturnObjectI(objects_fifo_t *ofp, + void *objp) { + + chGuardedPoolFreeI(&ofp->free, objp); +} + +/** + * @brief Releases a fetched object. + * + * @param[in] ofp pointer to a @p objects_fifo_t structure + * @param[in] objp pointer to the object to be released + * + * @api + */ +static inline void chFifoReturnObject(objects_fifo_t *ofp, + void *objp) { + + chGuardedPoolFree(&ofp->free, objp); +} + +/** + * @brief Posts an object. + * @note By design the object can be always immediately posted. + * + * @param[in] ofp pointer to a @p objects_fifo_t structure + * @param[in] objp pointer to the object to be posted + * + * @iclass + */ +static inline void chFifoSendObjectI(objects_fifo_t *ofp, + void *objp) { + msg_t msg; + + msg = chMBPostI(&ofp->mbx, (msg_t)objp); + chDbgAssert(msg == MSG_OK, "post failed"); +} + +/** + * @brief Posts an object. + * @note By design the object can be always immediately posted. + * + * @param[in] ofp pointer to a @p objects_fifo_t structure + * @param[in] objp pointer to the object to be posted + * + * @sclass + */ +static inline void chFifoSendObjectS(objects_fifo_t *ofp, + void *objp) { + msg_t msg; + + msg = chMBPostTimeoutS(&ofp->mbx, (msg_t)objp, TIME_IMMEDIATE); + chDbgAssert(msg == MSG_OK, "post failed"); +} + +/** + * @brief Posts an object. + * @note By design the object can be always immediately posted. + * + * @param[in] ofp pointer to a @p objects_fifo_t structure + * @param[in] objp pointer to the object to be released + * + * @api + */ +static inline void chFifoSendObject(objects_fifo_t *ofp, void *objp) { + + msg_t msg; + + msg = chMBPostTimeout(&ofp->mbx, (msg_t)objp, TIME_IMMEDIATE); + chDbgAssert(msg == MSG_OK, "post failed"); +} + +/** + * @brief Fetches an object. + * + * @param[in] ofp pointer to a @p objects_fifo_t structure + * @param[in] objpp pointer to the fetched object reference + * @return The operation status. + * @retval MSG_OK if an object has been correctly fetched. + * @retval MSG_TIMEOUT if the FIFO is empty and a message cannot be fetched. + * + * @iclass + */ +static inline msg_t chFifoReceiveObjectI(objects_fifo_t *ofp, + void **objpp) { + + return chMBFetchI(&ofp->mbx, (msg_t *)objpp); +} + +/** + * @brief Fetches an object. + * + * @param[in] ofp pointer to a @p objects_fifo_t structure + * @param[in] objpp pointer to the fetched object reference + * @param[in] timeout the number of ticks before the operation timeouts, + * the following special values are allowed: + * - @a TIME_IMMEDIATE immediate timeout. + * - @a TIME_INFINITE no timeout. + * . + * @return The operation status. + * @retval MSG_OK if an object has been correctly fetched. + * @retval MSG_TIMEOUT if the operation has timed out. + * + * @sclass + */ +static inline msg_t chFifoReceiveObjectTimeoutS(objects_fifo_t *ofp, + void **objpp, + sysinterval_t timeout) { + + return chMBFetchTimeoutS(&ofp->mbx, (msg_t *)objpp, timeout); +} + +/** + * @brief Fetches an object. + * + * @param[in] ofp pointer to a @p objects_fifo_t structure + * @param[in] objpp pointer to the fetched object reference + * @param[in] timeout the number of ticks before the operation timeouts, + * the following special values are allowed: + * - @a TIME_IMMEDIATE immediate timeout. + * - @a TIME_INFINITE no timeout. + * . + * @return The operation status. + * @retval MSG_OK if an object has been correctly fetched. + * @retval MSG_TIMEOUT if the operation has timed out. + * + * @api + */ +static inline msg_t chFifoReceiveObjectTimeout(objects_fifo_t *ofp, + void **objpp, + sysinterval_t timeout) { + + return chMBFetchTimeout(&ofp->mbx, (msg_t *)objpp, timeout); +} +#endif /* CH_CFG_USE_OBJ_FIFOS == TRUE */ + +#endif /* CHOBJFIFOS_H */ + +/** @} */ -- cgit v1.2.3