aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/include
diff options
context:
space:
mode:
authorGiovanni Di Sirio <gdisirio@gmail.com>2015-12-20 09:45:43 +0000
committerGiovanni Di Sirio <gdisirio@gmail.com>2015-12-20 09:45:43 +0000
commitddcc89f8d136acd94bba873c2e851a5d2f50e67c (patch)
tree30496a1ecea8aa3532b53794b43e78edbe949e71 /os/hal/include
parentf6616d570865fce92ae7a669611e495038e9c111 (diff)
downloadChibiOS-ddcc89f8d136acd94bba873c2e851a5d2f50e67c.tar.gz
ChibiOS-ddcc89f8d136acd94bba873c2e851a5d2f50e67c.tar.bz2
ChibiOS-ddcc89f8d136acd94bba873c2e851a5d2f50e67c.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@8619 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/hal/include')
-rw-r--r--os/hal/include/hal_buffers.h129
-rw-r--r--os/hal/include/hal_queues.h38
2 files changed, 104 insertions, 63 deletions
diff --git a/os/hal/include/hal_buffers.h b/os/hal/include/hal_buffers.h
index 02f21f5cd..0acf9ebd9 100644
--- a/os/hal/include/hal_buffers.h
+++ b/os/hal/include/hal_buffers.h
@@ -29,8 +29,6 @@
/* Driver constants. */
/*===========================================================================*/
-#define HAL_BUFFERS_QUEUE_SIZE 2
-
/*===========================================================================*/
/* Driver pre-compile time settings. */
/*===========================================================================*/
@@ -44,44 +42,21 @@
/*===========================================================================*/
/**
- * @brief Type of an I/O buffer.
- */
-typedef struct hal_buffer io_buffer_t;
-
-/**
- * @brief Structure of a generic buffer.
- */
-struct hal_buffer {
- /**
- * @brief Pointer to the buffer in memory.
- */
- uint8_t *buffer;
- /**
- * @brief Pointer to the first non-used location in the buffer.
- */
- uint8_t *limit;
- /**
- * @brief Pointer to the buffer boundary.
- */
- uint8_t *top;
-};
-
-/**
- * @brief Type of a generic double buffer.
+ * @brief Type of a generic queue of buffers.
*/
-typedef struct io_double_buffer io_double_buffer_t;
+typedef struct io_buffers_queue io_buffers_queue_t;
/**
* @brief Double buffer notification callback type.
*
- * @param[in] iodbp the double buffer pointer
+ * @param[in] iodbp the buffers queue pointer
*/
-typedef void (*dbnotify_t)(io_double_buffer_t *iodbp);
+typedef void (*dbnotify_t)(io_buffers_queue_t *bqp);
/**
- * @brief Structure of a generic double buffer.
+ * @brief Structure of a generic buffers queue.
*/
-struct io_double_buffer {
+struct io_buffers_queue {
/**
* @brief Queue of waiting threads.
*/
@@ -89,23 +64,38 @@ struct io_double_buffer {
/**
* @brief Active buffers counter.
*/
- volatile size_t counter;
+ volatile size_t bcounter;
/**
* @brief Buffer write pointer.
*/
- io_buffer_t *bwrptr;
+ uint8_t *bwrptr;
/**
* @brief Buffer read pointer.
*/
- io_buffer_t *brdptr;
+ uint8_t *brdptr;
/**
- * @brief Pointer for R/W sequential access.
+ * @brief Pointer to the buffers boundary.
*/
- uint8_t *ptr;
+ uint8_t *btop;
+ /**
+ * @brief Size of buffers.
+ * @note The buffer size must be not lower than <tt>sizeof(size_t) + 2</tt>
+ * because the first bytes are used to store the used size of the
+ * buffer.
+ */
+ size_t bsize;
+ /**
+ * @brief Number of buffers.
+ */
+ size_t bn;
/**
* @brief Queue of buffer objects.
*/
- io_buffer_t buffers[HAL_BUFFERS_QUEUE_SIZE];
+ uint8_t *buffers;
+ /**
+ * @brief Pointer for R/W sequential access.
+ */
+ uint8_t *ptr;
/**
* @brief Data notification callback.
*/
@@ -117,19 +107,71 @@ struct io_double_buffer {
};
/**
- * @brief Type of an input double buffer.
+ * @brief Type of an input buffers queue.
*/
-typedef io_double_buffer_t input_double_buffer_t;
+typedef io_buffers_queue_t input_buffers_queue_t;
/**
- * @brief Type of an output double buffer.
+ * @brief Type of an output buffers queue.
*/
-typedef io_double_buffer_t output_double_buffer_t;
+typedef io_buffers_queue_t output_buffers_queue_t;
/*===========================================================================*/
/* Driver macros. */
/*===========================================================================*/
+/**
+ * @name Macro Functions
+ * @{
+ */
+/**
+ * @brief Returns the queue's number of buffers.
+ *
+ * @param[in] bqp pointer to an @p io_buffers_queue_t structure
+ * @return The number of buffers.
+ *
+ * @xclass
+ */
+#define bqSizeX(bqp) ((bqp)->bn)
+
+/**
+ * @brief Return the ready buffers number.
+ * @details Returns the number of filled buffers if used on an input queue
+ * or the number of empty buffers if used on an output queue.
+ *
+ * @param[in] bqp pointer to an @p io_buffers_queue_t structure
+ * @return The number of ready buffers.
+ *
+ * @iclass
+ */
+#define bqSpaceI(bqp) ((bqp)->bcounter)
+
+/**
+ * @brief Evaluates to @p TRUE if the specified input buffered queue is empty.
+ *
+ * @param[in] ibqp pointer to an @p input_buffers_queue_t structure
+ * @return The queue status.
+ * @retval false if the queue is not empty.
+ * @retval true if the queue is empty.
+ *
+ * @iclass
+ */
+#define iqbIsEmptyI(ibqp) ((bool)(bqSpaceI(ibqp) == 0U))
+
+/**
+ * @brief Evaluates to @p TRUE if the specified input buffered queue is full.
+ *
+ * @param[in] ibqp pointer to an @p input_buffers_queue_t structure
+ * @return The queue status.
+ * @retval false if the queue is not full.
+ * @retval true if the queue is full.
+ *
+ * @iclass
+ */
+#define ibqIsFullI(ibqp) ((bool)(((ibqp)->bwrptr == (ibqp)->brdptr) && \
+ ((ibqp)->bcounter != 0U)))
+/** @} */
+
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
@@ -137,9 +179,8 @@ typedef io_double_buffer_t output_double_buffer_t;
#ifdef __cplusplus
extern "C" {
#endif
- void iobInit(io_buffer_t *iobp, uint8_t *bp, size_t size);
- void idbObjectInit(input_double_buffer_t *idbp,
- uint8_t *b1p, uint8_t *b2p, size_t size,
+ void ibqObjectInit(io_buffers_queue_t *ibqp, uint8_t *bp,
+ size_t size, size_t n,
dbnotify_t infy, void *link);
#ifdef __cplusplus
}
diff --git a/os/hal/include/hal_queues.h b/os/hal/include/hal_queues.h
index da76aac8f..a2149f9fe 100644
--- a/os/hal/include/hal_queues.h
+++ b/os/hal/include/hal_queues.h
@@ -80,7 +80,7 @@ struct io_queue {
/**
* @brief Returns the queue's buffer size.
*
- * @param[in] qp pointer to a @p io_queue_t structure.
+ * @param[in] qp pointer to a @p io_queue_t structure
* @return The buffer size.
*
* @xclass
@@ -95,7 +95,7 @@ struct io_queue {
* @details Returns the used space if used on an input queue or the empty
* space if used on an output queue.
*
- * @param[in] qp pointer to a @p io_queue_t structure.
+ * @param[in] qp pointer to a @p io_queue_t structure
* @return The buffer space.
*
* @iclass
@@ -106,7 +106,7 @@ struct io_queue {
* @brief Returns the queue application-defined link.
* @note This function can be called in any context.
*
- * @param[in] qp pointer to a @p io_queue_t structure.
+ * @param[in] qp pointer to a @p io_queue_t structure
* @return The application-defined link.
*
* @special
@@ -153,24 +153,24 @@ typedef io_queue_t input_queue_t;
#define iqGetEmptyI(iqp) (qSizeX(iqp) - qSpaceI(iqp))
/**
- * @brief Evaluates to @p TRUE if the specified input queue is empty.
+ * @brief Evaluates to @p true if the specified input queue is empty.
*
- * @param[in] iqp pointer to an @p input_queue_t structure.
+ * @param[in] iqp pointer to an @p input_queue_t structure
* @return The queue status.
- * @retval FALSE if the queue is not empty.
- * @retval TRUE if the queue is empty.
+ * @retval false if the queue is not empty.
+ * @retval true if the queue is empty.
*
* @iclass
*/
#define iqIsEmptyI(iqp) ((bool)(qSpaceI(iqp) == 0U))
/**
- * @brief Evaluates to @p TRUE if the specified input queue is full.
+ * @brief Evaluates to @p true if the specified input queue is full.
*
- * @param[in] iqp pointer to an @p input_queue_t structure.
+ * @param[in] iqp pointer to an @p input_queue_t structure
* @return The queue status.
- * @retval FALSE if the queue is not full.
- * @retval TRUE if the queue is full.
+ * @retval false if the queue is not full.
+ * @retval true if the queue is full.
*
* @iclass
*/
@@ -267,12 +267,12 @@ typedef io_queue_t output_queue_t;
#define oqGetEmptyI(oqp) qSpaceI(oqp)
/**
- * @brief Evaluates to @p TRUE if the specified output queue is empty.
+ * @brief Evaluates to @p true if the specified output queue is empty.
*
- * @param[in] oqp pointer to an @p output_queue_t structure.
+ * @param[in] oqp pointer to an @p output_queue_t structure
* @return The queue status.
- * @retval FALSE if the queue is not empty.
- * @retval TRUE if the queue is empty.
+ * @retval false if the queue is not empty.
+ * @retval true if the queue is empty.
*
* @iclass
*/
@@ -280,12 +280,12 @@ typedef io_queue_t output_queue_t;
((oqp)->q_counter != 0U)))
/**
- * @brief Evaluates to @p TRUE if the specified output queue is full.
+ * @brief Evaluates to @p true if the specified output queue is full.
*
- * @param[in] oqp pointer to an @p output_queue_t structure.
+ * @param[in] oqp pointer to an @p output_queue_t structure
* @return The queue status.
- * @retval FALSE if the queue is not full.
- * @retval TRUE if the queue is full.
+ * @retval false if the queue is not full.
+ * @retval true if the queue is full.
*
* @iclass
*/