qpc/include/qmpool.h

172 lines
5.5 KiB
C
Raw Normal View History

2014-04-06 11:43:13 -04:00
/**
2015-04-28 13:45:35 -04:00
* @file
* @brief QP native, platform-independent memory pool ::QMPool interface.
* @ingroup qf
* @cond
2014-04-06 11:43:13 -04:00
******************************************************************************
2020-10-01 12:48:48 -04:00
* Last updated for version 6.9.1
* Last updated on 2020-09-08
2012-08-14 18:07:04 -04:00
*
2019-10-27 11:57:33 -04:00
* Q u a n t u m L e a P s
* ------------------------
* Modern Embedded Software
2012-08-14 18:07:04 -04:00
*
2020-03-17 21:33:20 -04:00
* Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved.
2012-08-14 18:07:04 -04:00
*
* This program is open source 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
2012-08-14 18:07:04 -04:00
* (at your option) any later version.
*
* Alternatively, this program may be distributed and modified under the
* terms of Quantum Leaps commercial licenses, which expressly supersede
* the GNU General Public License and are specifically designed for
* licensees interested in retaining the proprietary status of their code.
*
* This program 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
2019-10-27 11:57:33 -04:00
* along with this program. If not, see <www.gnu.org/licenses>.
2012-08-14 18:07:04 -04:00
*
* Contact information:
2019-12-31 15:55:08 -05:00
* <www.state-machine.com/licensing>
2019-10-27 11:57:33 -04:00
* <info@state-machine.com>
2014-04-06 11:43:13 -04:00
******************************************************************************
2015-04-28 13:45:35 -04:00
* @endcond
2014-04-06 11:43:13 -04:00
*/
2019-10-27 11:57:33 -04:00
#ifndef QMPOOL_H
#define QMPOOL_H
2012-08-14 18:07:04 -04:00
/****************************************************************************/
#ifndef QF_MPOOL_SIZ_SIZE
2020-03-17 21:33:20 -04:00
/*! macro to override the default ::QMPoolSize size [bytes].
* Valid values 1U, 2U, or 4U; default 2U
2012-08-14 18:07:04 -04:00
*/
2020-03-17 21:33:20 -04:00
#define QF_MPOOL_SIZ_SIZE 2U
2012-08-14 18:07:04 -04:00
#endif
2020-03-17 21:33:20 -04:00
#if (QF_MPOOL_SIZ_SIZE == 1U)
2012-08-14 18:07:04 -04:00
2014-04-06 11:43:13 -04:00
/*! The data type to store the block-size based on the macro
* #QF_MPOOL_SIZ_SIZE.
*/
2014-04-06 11:43:13 -04:00
/**
2015-04-28 13:45:35 -04:00
* @description
2012-08-14 18:07:04 -04:00
* The dynamic range of this data type determines the maximum size
* of blocks that can be managed by the native QF event pool.
*/
typedef uint8_t QMPoolSize;
2020-03-17 21:33:20 -04:00
#elif (QF_MPOOL_SIZ_SIZE == 2U)
2012-08-14 18:07:04 -04:00
typedef uint16_t QMPoolSize;
2020-03-17 21:33:20 -04:00
#elif (QF_MPOOL_SIZ_SIZE == 4U)
2012-08-14 18:07:04 -04:00
typedef uint32_t QMPoolSize;
#else
2020-03-17 21:33:20 -04:00
#error "QF_MPOOL_SIZ_SIZE defined incorrectly, expected 1U, 2U, or 4U"
2012-08-14 18:07:04 -04:00
#endif
/****************************************************************************/
#ifndef QF_MPOOL_CTR_SIZE
2020-03-17 21:33:20 -04:00
/*! macro to override the default ::QMPoolCtr size [bytes].
* Valid values 1U, 2U, or 4U; default 2U
2012-08-14 18:07:04 -04:00
*/
2020-03-17 21:33:20 -04:00
#define QF_MPOOL_CTR_SIZE 2U
2012-08-14 18:07:04 -04:00
#endif
2020-03-17 21:33:20 -04:00
#if (QF_MPOOL_CTR_SIZE == 1U)
2012-08-14 18:07:04 -04:00
2014-04-06 11:43:13 -04:00
/*! The data type to store the block-counter based on the macro
* #QF_MPOOL_CTR_SIZE.
*/
2014-04-06 11:43:13 -04:00
/**
2015-04-28 13:45:35 -04:00
* @description
2012-08-14 18:07:04 -04:00
* The dynamic range of this data type determines the maximum number
* of blocks that can be stored in the pool.
*/
typedef uint8_t QMPoolCtr;
2020-03-17 21:33:20 -04:00
#elif (QF_MPOOL_CTR_SIZE == 2U)
2012-08-14 18:07:04 -04:00
typedef uint16_t QMPoolCtr;
2020-03-17 21:33:20 -04:00
#elif (QF_MPOOL_CTR_SIZE == 4U)
2012-08-14 18:07:04 -04:00
typedef uint32_t QMPoolCtr;
#else
2020-03-17 21:33:20 -04:00
#error "QF_MPOOL_CTR_SIZE defined incorrectly, expected 1U, 2U, or 4U"
2012-08-14 18:07:04 -04:00
#endif
/****************************************************************************/
2014-04-06 11:43:13 -04:00
/*! Native QF Memory Pool */
/**
2015-04-28 13:45:35 -04:00
* @description
* A fixed block-size memory pool is a very fast and efficient data
* structure for dynamic allocation of fixed block-size chunks of memory.
* A memory pool offers fast and deterministic allocation and recycling of
2015-04-28 13:45:35 -04:00
* memory blocks and is not subject to fragmenation.@n
* @n
* The ::QMPool class describes the native QF memory pool, which can be used as
2012-08-14 18:07:04 -04:00
* the event pool for dynamic event allocation, or as a fast, deterministic
* fixed block-size heap for any other objects in your application.
*
2015-04-28 13:45:35 -04:00
* @note
2014-04-06 11:43:13 -04:00
* ::QMPool contains only data members for managing a memory pool, but
* does not contain the pool storage, which must be provided externally
* during the pool initialization.
2012-08-14 18:07:04 -04:00
*
2015-04-28 13:45:35 -04:00
* @note
2012-08-14 18:07:04 -04:00
* The native QF event pool is configured by defining the macro
* #QF_EPOOL_TYPE_ as ::QMPool in the specific QF port header file.
2012-08-14 18:07:04 -04:00
*/
2014-04-06 11:43:13 -04:00
typedef struct {
/*! The head of the linked list of free blocks */
2013-09-23 14:34:35 -04:00
void * volatile free_head;
2012-08-14 18:07:04 -04:00
2014-04-06 11:43:13 -04:00
/*! the original start this pool */
2012-08-14 18:07:04 -04:00
void *start;
2014-04-06 11:43:13 -04:00
/*! the last memory block managed by this memory pool */
2012-08-14 18:07:04 -04:00
void *end;
2014-04-06 11:43:13 -04:00
/*! maximum block size (in bytes) */
2012-08-14 18:07:04 -04:00
QMPoolSize blockSize;
2014-04-06 11:43:13 -04:00
/*! total number of blocks */
2012-08-14 18:07:04 -04:00
QMPoolCtr nTot;
2014-04-06 11:43:13 -04:00
/*! number of free blocks remaining */
2013-09-23 14:34:35 -04:00
QMPoolCtr volatile nFree;
2012-08-14 18:07:04 -04:00
2014-04-06 11:43:13 -04:00
/*! minimum number of free blocks ever present in this pool */
/**
2015-04-28 13:45:35 -04:00
* @description
2014-04-06 11:43:13 -04:00
* this attribute remembers the low watermark of the pool, which
* provides a valuable information for sizing event pools.
2015-04-28 13:45:35 -04:00
* @sa QF_getPoolMin().
2012-08-14 18:07:04 -04:00
*/
QMPoolCtr nMin;
} QMPool;
/* public functions: */
2014-04-06 11:43:13 -04:00
/*! Initializes the native QF memory pool */
2012-08-14 18:07:04 -04:00
void QMPool_init(QMPool * const me, void * const poolSto,
2015-04-28 13:45:35 -04:00
uint_fast32_t poolSize, uint_fast16_t blockSize);
2012-08-14 18:07:04 -04:00
2014-04-06 11:43:13 -04:00
/*! Obtains a memory block from a memory pool. */
2020-10-01 12:48:48 -04:00
void *QMPool_get(QMPool * const me, uint_fast16_t const margin,
uint_fast8_t const qs_id);
2012-08-14 18:07:04 -04:00
2014-04-06 11:43:13 -04:00
/*! Recycles a memory block back to a memory pool. */
2020-10-01 12:48:48 -04:00
void QMPool_put(QMPool * const me, void *b,
uint_fast8_t const qs_id);
2012-08-14 18:07:04 -04:00
2014-04-06 11:43:13 -04:00
/*! Memory pool element to allocate correctly aligned storage
2012-08-14 18:07:04 -04:00
* for QMPool class.
*/
2014-04-06 11:43:13 -04:00
/**
2015-04-28 13:45:35 -04:00
* @param[in] evType_ event type (name of the subclass of QEvt)
2014-04-06 11:43:13 -04:00
*/
#define QF_MPOOL_EL(evType_) \
struct { void *sto_[((sizeof(evType_) - 1U)/sizeof(void*)) + 1U]; }
2012-08-14 18:07:04 -04:00
2019-10-27 11:57:33 -04:00
#endif /* QMPOOL_H */
2012-08-14 18:07:04 -04:00