|
ChibiOS/HAL
6.1.0
|
|
Queues are mostly used in serial-like device drivers. Serial device drivers are usually designed to have a lower side (lower driver, it is usually an interrupt service routine) and an upper side (upper driver, accessed by the application threads).
There are several kind of queues:
Queue functions returned status value | |
| #define | Q_OK MSG_OK |
| Operation successful. More... | |
| #define | Q_TIMEOUT MSG_TIMEOUT |
| Timeout condition. More... | |
| #define | Q_RESET MSG_RESET |
| Queue has been reset. More... | |
| #define | Q_EMPTY MSG_TIMEOUT |
| Queue empty. More... | |
| #define | Q_FULL MSG_TIMEOUT |
| Queue full,. More... | |
Macro Functions | |
| #define | qSizeX(qp) |
| Returns the queue's buffer size. More... | |
| #define | qSpaceI(qp) ((qp)->q_counter) |
| Queue space. More... | |
| #define | qGetLink(qp) ((qp)->q_link) |
| Returns the queue application-defined link. More... | |
| #define | qSetLink(qp, lk) ((qp)->q_link = lk) |
| Sets the queue application-defined link. More... | |
| #define | iqGetFullI(iqp) qSpaceI(iqp) |
| Returns the filled space into an input queue. More... | |
| #define | iqGetEmptyI(iqp) (qSizeX(iqp) - qSpaceI(iqp)) |
| Returns the empty space into an input queue. More... | |
| #define | iqIsEmptyI(iqp) ((bool)(qSpaceI(iqp) == 0U)) |
Evaluates to true if the specified input queue is empty. More... | |
| #define | iqIsFullI(iqp) |
Evaluates to true if the specified input queue is full. More... | |
| #define | iqGet(iqp) iqGetTimeout(iqp, TIME_INFINITE) |
| Input queue read. More... | |
| #define | oqGetFullI(oqp) (qSizeX(oqp) - qSpaceI(oqp)) |
| Returns the filled space into an output queue. More... | |
| #define | oqGetEmptyI(oqp) qSpaceI(oqp) |
| Returns the empty space into an output queue. More... | |
| #define | oqIsEmptyI(oqp) |
Evaluates to true if the specified output queue is empty. More... | |
| #define | oqIsFullI(oqp) ((bool)(qSpaceI(oqp) == 0U)) |
Evaluates to true if the specified output queue is full. More... | |
| #define | oqPut(oqp, b) oqPutTimeout(oqp, b, TIME_INFINITE) |
| Output queue write. More... | |
Typedefs | |
| typedef struct io_queue | io_queue_t |
| Type of a generic I/O queue structure. More... | |
| typedef void(* | qnotify_t) (io_queue_t *qp) |
| Queue notification callback type. More... | |
| typedef io_queue_t | input_queue_t |
| Type of an input queue structure. More... | |
| typedef io_queue_t | output_queue_t |
| Type of an output queue structure. More... | |
Data Structures | |
| struct | io_queue |
| Generic I/O queue structure. More... | |
Functions | |
| static size_t | iq_read (input_queue_t *iqp, uint8_t *bp, size_t n) |
| Non-blocking input queue read. More... | |
| static size_t | oq_write (output_queue_t *oqp, const uint8_t *bp, size_t n) |
| Non-blocking output queue write. More... | |
| void | iqObjectInit (input_queue_t *iqp, uint8_t *bp, size_t size, qnotify_t infy, void *link) |
| Initializes an input queue. More... | |
| void | iqResetI (input_queue_t *iqp) |
| Resets an input queue. More... | |
| msg_t | iqPutI (input_queue_t *iqp, uint8_t b) |
| Input queue write. More... | |
| msg_t | iqGetI (input_queue_t *iqp) |
| Input queue non-blocking read. More... | |
| msg_t | iqGetTimeout (input_queue_t *iqp, sysinterval_t timeout) |
| Input queue read with timeout. More... | |
| size_t | iqReadI (input_queue_t *iqp, uint8_t *bp, size_t n) |
| Input queue non-blocking read. More... | |
| size_t | iqReadTimeout (input_queue_t *iqp, uint8_t *bp, size_t n, sysinterval_t timeout) |
| Input queue read with timeout. More... | |
| void | oqObjectInit (output_queue_t *oqp, uint8_t *bp, size_t size, qnotify_t onfy, void *link) |
| Initializes an output queue. More... | |
| void | oqResetI (output_queue_t *oqp) |
| Resets an output queue. More... | |
| msg_t | oqPutI (output_queue_t *oqp, uint8_t b) |
| Output queue non-blocking write. More... | |
| msg_t | oqPutTimeout (output_queue_t *oqp, uint8_t b, sysinterval_t timeout) |
| Output queue write with timeout. More... | |
| msg_t | oqGetI (output_queue_t *oqp) |
| Output queue read. More... | |
| size_t | oqWriteI (output_queue_t *oqp, const uint8_t *bp, size_t n) |
| Output queue non-blocking write. More... | |
| size_t | oqWriteTimeout (output_queue_t *oqp, const uint8_t *bp, size_t n, sysinterval_t timeout) |
| Output queue write with timeout. More... | |
| #define Q_OK MSG_OK |
Operation successful.
Definition at line 36 of file hal_queues.h.
| #define Q_TIMEOUT MSG_TIMEOUT |
Timeout condition.
Definition at line 37 of file hal_queues.h.
| #define Q_RESET MSG_RESET |
Queue has been reset.
Definition at line 38 of file hal_queues.h.
| #define Q_EMPTY MSG_TIMEOUT |
Queue empty.
Definition at line 39 of file hal_queues.h.
| #define Q_FULL MSG_TIMEOUT |
Queue full,.
Definition at line 40 of file hal_queues.h.
| #define qSizeX | ( | qp | ) |
Returns the queue's buffer size.
| [in] | qp | pointer to a io_queue_t structure |
Definition at line 127 of file hal_queues.h.
Referenced by oqResetI().
| #define qSpaceI | ( | qp | ) | ((qp)->q_counter) |
Queue space.
Returns the used space if used on an input queue or the empty space if used on an output queue.
| [in] | qp | pointer to a io_queue_t structure |
Definition at line 142 of file hal_queues.h.
| #define qGetLink | ( | qp | ) | ((qp)->q_link) |
Returns the queue application-defined link.
| [in] | qp | pointer to a io_queue_t structure |
Definition at line 153 of file hal_queues.h.
| #define qSetLink | ( | qp, | |
| lk | |||
| ) | ((qp)->q_link = lk) |
Sets the queue application-defined link.
| [in] | qp | pointer to a io_queue_t structure |
| [in] | lk | The application-defined link. |
Definition at line 164 of file hal_queues.h.
| #define iqGetFullI | ( | iqp | ) | qSpaceI(iqp) |
Returns the filled space into an input queue.
| [in] | iqp | pointer to an input_queue_t structure |
| 0 | if the queue is empty. |
Definition at line 175 of file hal_queues.h.
Referenced by iq_read().
Returns the empty space into an input queue.
| [in] | iqp | pointer to an input_queue_t structure |
| 0 | if the queue is full. |
Definition at line 186 of file hal_queues.h.
| #define iqIsEmptyI | ( | iqp | ) | ((bool)(qSpaceI(iqp) == 0U)) |
Evaluates to true if the specified input queue is empty.
| [in] | iqp | pointer to an input_queue_t structure |
| false | if the queue is not empty. |
| true | if the queue is empty. |
Definition at line 198 of file hal_queues.h.
Referenced by iqGetI(), iqGetTimeout(), sdGetWouldBlock(), and sdIncomingDataI().
| #define iqIsFullI | ( | iqp | ) |
Evaluates to true if the specified input queue is full.
| [in] | iqp | pointer to an input_queue_t structure |
| false | if the queue is not full. |
| true | if the queue is full. |
Definition at line 210 of file hal_queues.h.
Referenced by iqPutI().
| #define iqGet | ( | iqp | ) | iqGetTimeout(iqp, TIME_INFINITE) |
Input queue read.
This function reads a byte value from an input queue. If the queue is empty then the calling thread is suspended until a byte arrives in the queue.
| [in] | iqp | pointer to an input_queue_t structure |
| MSG_RESET | if the queue has been reset. |
Definition at line 227 of file hal_queues.h.
Returns the filled space into an output queue.
| [in] | oqp | pointer to an output_queue_t structure |
| 0 | if the queue is empty. |
Definition at line 238 of file hal_queues.h.
| #define oqGetEmptyI | ( | oqp | ) | qSpaceI(oqp) |
Returns the empty space into an output queue.
| [in] | oqp | pointer to an output_queue_t structure |
| 0 | if the queue is full. |
Definition at line 249 of file hal_queues.h.
Referenced by oq_write().
| #define oqIsEmptyI | ( | oqp | ) |
Evaluates to true if the specified output queue is empty.
| [in] | oqp | pointer to an output_queue_t structure |
| false | if the queue is not empty. |
| true | if the queue is empty. |
Definition at line 261 of file hal_queues.h.
Referenced by oqGetI().
| #define oqIsFullI | ( | oqp | ) | ((bool)(qSpaceI(oqp) == 0U)) |
Evaluates to true if the specified output queue is full.
| [in] | oqp | pointer to an output_queue_t structure |
| false | if the queue is not full. |
| true | if the queue is full. |
Definition at line 276 of file hal_queues.h.
Referenced by oqPutI(), oqPutTimeout(), and sdPutWouldBlock().
| #define oqPut | ( | oqp, | |
| b | |||
| ) | oqPutTimeout(oqp, b, TIME_INFINITE) |
Output queue write.
This function writes a byte value to an output queue. If the queue is full then the calling thread is suspended until there is space in the queue.
| [in] | oqp | pointer to an output_queue_t structure |
| [in] | b | the byte value to be written in the queue |
| MSG_OK | if the operation succeeded. |
| MSG_RESET | if the queue has been reset. |
Definition at line 292 of file hal_queues.h.
| typedef struct io_queue io_queue_t |
Type of a generic I/O queue structure.
Definition at line 58 of file hal_queues.h.
| typedef void(* qnotify_t) (io_queue_t *qp) |
Queue notification callback type.
| [in] | qp | the queue pointer |
Definition at line 65 of file hal_queues.h.
| typedef io_queue_t input_queue_t |
Type of an input queue structure.
This structure represents a generic asymmetrical input queue. Writing to the queue is non-blocking and can be performed from interrupt handlers or from within a kernel lock zone. Reading the queue can be a blocking operation and is supposed to be performed by a system thread.
Definition at line 97 of file hal_queues.h.
| typedef io_queue_t output_queue_t |
Type of an output queue structure.
This structure represents a generic asymmetrical output queue. Reading from the queue is non-blocking and can be performed from interrupt handlers or from within a kernel lock zone. Writing the queue can be a blocking operation and is supposed to be performed by a system thread.
Definition at line 109 of file hal_queues.h.
|
static |
Non-blocking input queue read.
The function reads data from an input queue into a buffer. The operation completes when the specified amount of data has been transferred or when the input queue has been emptied.
| [in] | iqp | pointer to an input_queue_t structure |
| [out] | bp | pointer to the data buffer |
| [in] | n | the maximum amount of data to be transferred, the value 0 is reserved |
Definition at line 60 of file hal_queues.c.
References iqGetFullI, osalDbgCheck, io_queue::q_buffer, io_queue::q_counter, io_queue::q_rdptr, and io_queue::q_top.
Referenced by iqReadI(), and iqReadTimeout().
|
static |
Non-blocking output queue write.
The function writes data from a buffer to an output queue. The operation completes when the specified amount of data has been transferred or when the output queue has been filled.
| [in] | oqp | pointer to an output_queue_t structure |
| [in] | bp | pointer to the data buffer |
| [in] | n | the maximum amount of data to be transferred, the value 0 is reserved |
Definition at line 108 of file hal_queues.c.
References oqGetEmptyI, osalDbgCheck, io_queue::q_buffer, io_queue::q_counter, io_queue::q_top, and io_queue::q_wrptr.
Referenced by oqWriteI(), and oqWriteTimeout().
| void iqObjectInit | ( | input_queue_t * | iqp, |
| uint8_t * | bp, | ||
| size_t | size, | ||
| qnotify_t | infy, | ||
| void * | link | ||
| ) |
Initializes an input queue.
A Semaphore is internally initialized and works as a counter of the bytes contained in the queue.
| [out] | iqp | pointer to an input_queue_t structure |
| [in] | bp | pointer to a memory area allocated as queue buffer |
| [in] | size | size of the queue buffer |
| [in] | infy | pointer to a callback function that is invoked when data is read from the queue. The value can be NULL. |
| [in] | link | application defined pointer |
Definition at line 177 of file hal_queues.c.
References osalThreadQueueObjectInit(), io_queue::q_buffer, io_queue::q_counter, io_queue::q_link, io_queue::q_notify, io_queue::q_rdptr, io_queue::q_top, io_queue::q_waiting, and io_queue::q_wrptr.
Referenced by sdObjectInit().

| void iqResetI | ( | input_queue_t * | iqp | ) |
Resets an input queue.
All the data in the input queue is erased and lost, any waiting thread is resumed with status MSG_RESET.
| [in] | iqp | pointer to an input_queue_t structure |
Definition at line 201 of file hal_queues.c.
References osalDbgCheckClassI, osalThreadDequeueAllI(), io_queue::q_buffer, io_queue::q_counter, io_queue::q_rdptr, io_queue::q_waiting, and io_queue::q_wrptr.
Referenced by sdStop().

| msg_t iqPutI | ( | input_queue_t * | iqp, |
| uint8_t | b | ||
| ) |
Input queue write.
A byte value is written into the low end of an input queue. The operation completes immediately.
| [in] | iqp | pointer to an input_queue_t structure |
| [in] | b | the byte value to be written in the queue |
| MSG_OK | if the operation has been completed with success. |
| MSG_TIMEOUT | if the queue is full. |
Definition at line 224 of file hal_queues.c.
References iqIsFullI, osalDbgCheckClassI, osalThreadDequeueNextI(), io_queue::q_buffer, io_queue::q_counter, io_queue::q_top, io_queue::q_waiting, and io_queue::q_wrptr.
Referenced by sdIncomingDataI().

| msg_t iqGetI | ( | input_queue_t * | iqp | ) |
Input queue non-blocking read.
This function reads a byte value from an input queue. The operation completes immediately.
| [in] | iqp | pointer to an input_queue_t structure |
| MSG_TIMEOUT | if the queue is empty. |
| MSG_RESET | if the queue has been reset. |
Definition at line 258 of file hal_queues.c.
References iqIsEmptyI, osalDbgCheckClassI, io_queue::q_buffer, io_queue::q_counter, io_queue::q_notify, io_queue::q_rdptr, and io_queue::q_top.
| msg_t iqGetTimeout | ( | input_queue_t * | iqp, |
| sysinterval_t | timeout | ||
| ) |
Input queue read with timeout.
This function reads a byte value from an input queue. If the queue is empty then the calling thread is suspended until a byte arrives in the queue or a timeout occurs.
| [in] | iqp | pointer to an input_queue_t structure |
| [in] | timeout | the number of ticks before the operation timeouts, the following special values are allowed:
|
| MSG_TIMEOUT | if the specified time expired. |
| MSG_RESET | if the queue has been reset. |
Definition at line 304 of file hal_queues.c.
References iqIsEmptyI, osalSysLock(), osalSysUnlock(), osalThreadEnqueueTimeoutS(), io_queue::q_buffer, io_queue::q_counter, io_queue::q_notify, io_queue::q_rdptr, io_queue::q_top, and io_queue::q_waiting.

| size_t iqReadI | ( | input_queue_t * | iqp, |
| uint8_t * | bp, | ||
| size_t | n | ||
| ) |
Input queue non-blocking read.
The function reads data from an input queue into a buffer. The operation completes immediately.
| [in] | iqp | pointer to an input_queue_t structure |
| [out] | bp | pointer to the data buffer |
| [in] | n | the maximum amount of data to be transferred, the value 0 is reserved |
Definition at line 348 of file hal_queues.c.
References iq_read(), osalDbgCheckClassI, and io_queue::q_notify.

| size_t iqReadTimeout | ( | input_queue_t * | iqp, |
| uint8_t * | bp, | ||
| size_t | n, | ||
| sysinterval_t | timeout | ||
| ) |
Input queue read with timeout.
The function reads data from an input queue into a buffer. The operation completes when the specified amount of data has been transferred or after the specified timeout or if the queue has been reset.
| [in] | iqp | pointer to an input_queue_t structure |
| [out] | bp | pointer to the data buffer |
| [in] | n | the maximum amount of data to be transferred, the value 0 is reserved |
| [in] | timeout | the number of ticks before the operation timeouts, the following special values are allowed:
|
Definition at line 389 of file hal_queues.c.
References iq_read(), osalDbgCheck, osalSysLock(), osalSysUnlock(), osalThreadEnqueueTimeoutS(), io_queue::q_notify, and io_queue::q_waiting.

| void oqObjectInit | ( | output_queue_t * | oqp, |
| uint8_t * | bp, | ||
| size_t | size, | ||
| qnotify_t | onfy, | ||
| void * | link | ||
| ) |
Initializes an output queue.
A Semaphore is internally initialized and works as a counter of the free bytes in the queue.
| [out] | oqp | pointer to an output_queue_t structure |
| [in] | bp | pointer to a memory area allocated as queue buffer |
| [in] | size | size of the queue buffer |
| [in] | onfy | pointer to a callback function that is invoked when data is written to the queue. The value can be NULL. |
| [in] | link | application defined pointer |
Definition at line 446 of file hal_queues.c.
References osalThreadQueueObjectInit(), io_queue::q_buffer, io_queue::q_counter, io_queue::q_link, io_queue::q_notify, io_queue::q_rdptr, io_queue::q_top, io_queue::q_waiting, and io_queue::q_wrptr.
Referenced by sdObjectInit().

| void oqResetI | ( | output_queue_t * | oqp | ) |
Resets an output queue.
All the data in the output queue is erased and lost, any waiting thread is resumed with status MSG_RESET.
| [in] | oqp | pointer to an output_queue_t structure |
Definition at line 470 of file hal_queues.c.
References osalDbgCheckClassI, osalThreadDequeueAllI(), io_queue::q_buffer, io_queue::q_counter, io_queue::q_rdptr, io_queue::q_waiting, io_queue::q_wrptr, and qSizeX.
Referenced by sdStop().

| msg_t oqPutI | ( | output_queue_t * | oqp, |
| uint8_t | b | ||
| ) |
Output queue non-blocking write.
This function writes a byte value to an output queue. The operation completes immediately.
| [in] | oqp | pointer to an output_queue_t structure |
| [in] | b | the byte value to be written in the queue |
| MSG_OK | if the operation succeeded. |
| MSG_TIMEOUT | if the queue is full. |
| MSG_RESET | if the queue has been reset. |
Definition at line 494 of file hal_queues.c.
References oqIsFullI, osalDbgCheckClassI, io_queue::q_buffer, io_queue::q_counter, io_queue::q_notify, io_queue::q_top, and io_queue::q_wrptr.
| msg_t oqPutTimeout | ( | output_queue_t * | oqp, |
| uint8_t | b, | ||
| sysinterval_t | timeout | ||
| ) |
Output queue write with timeout.
This function writes a byte value to an output queue. If the queue is full then the calling thread is suspended until there is space in the queue or a timeout occurs.
| [in] | oqp | pointer to an output_queue_t structure |
| [in] | b | the byte value to be written in the queue |
| [in] | timeout | the number of ticks before the operation timeouts, the following special values are allowed:
|
| MSG_OK | if the operation succeeded. |
| MSG_TIMEOUT | if the specified time expired. |
| MSG_RESET | if the queue has been reset. |
Definition at line 540 of file hal_queues.c.
References oqIsFullI, osalSysLock(), osalSysUnlock(), osalThreadEnqueueTimeoutS(), io_queue::q_buffer, io_queue::q_counter, io_queue::q_notify, io_queue::q_top, io_queue::q_waiting, and io_queue::q_wrptr.

| msg_t oqGetI | ( | output_queue_t * | oqp | ) |
Output queue read.
A byte value is read from the low end of an output queue. The operation completes immediately.
| [in] | oqp | pointer to an output_queue_t structure |
| MSG_TIMEOUT | if the queue is empty. |
Definition at line 581 of file hal_queues.c.
References oqIsEmptyI, osalDbgCheckClassI, osalThreadDequeueNextI(), io_queue::q_buffer, io_queue::q_counter, io_queue::q_rdptr, io_queue::q_top, and io_queue::q_waiting.
Referenced by sdRequestDataI().

| size_t oqWriteI | ( | output_queue_t * | oqp, |
| const uint8_t * | bp, | ||
| size_t | n | ||
| ) |
Output queue non-blocking write.
The function writes data from a buffer to an output queue. The operation completes immediately.
| [in] | oqp | pointer to an output_queue_t structure |
| [in] | bp | pointer to the data buffer |
| [in] | n | the maximum amount of data to be transferred, the value 0 is reserved |
Definition at line 617 of file hal_queues.c.
References oq_write(), osalDbgCheckClassI, and io_queue::q_notify.

| size_t oqWriteTimeout | ( | output_queue_t * | oqp, |
| const uint8_t * | bp, | ||
| size_t | n, | ||
| sysinterval_t | timeout | ||
| ) |
Output queue write with timeout.
The function writes data from a buffer to an output queue. The operation completes when the specified amount of data has been transferred or after the specified timeout or if the queue has been reset.
| [in] | oqp | pointer to an output_queue_t structure |
| [in] | bp | pointer to the data buffer |
| [in] | n | the maximum amount of data to be transferred, the value 0 is reserved |
| [in] | timeout | the number of ticks before the operation timeouts, the following special values are allowed:
|
Definition at line 658 of file hal_queues.c.
References oq_write(), osalDbgCheck, osalSysLock(), osalSysUnlock(), osalThreadEnqueueTimeoutS(), io_queue::q_notify, and io_queue::q_waiting.
