| /* |
| * Copyright (c) 1997-2014 Wind River Systems, Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /** |
| * @file |
| * |
| * @brief Microkernel FIFO header file. |
| * |
| */ |
| |
| /** |
| * @brief Microkernel FIFOs |
| * @defgroup microkernel_fifo Microkernel FIFOs |
| * @ingroup microkernel_services |
| * @{ |
| */ |
| |
| #ifndef FIFO_H |
| #define FIFO_H |
| |
| #include <sections.h> |
| |
| /* externs */ |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /** |
| * @cond internal |
| */ |
| extern int _task_fifo_put(kfifo_t queue, void *data, int32_t time); |
| extern int _task_fifo_get(kfifo_t queue, void *data, int32_t time); |
| extern int _task_fifo_ioctl(kfifo_t queue, int op); |
| |
| /** |
| * @brief Initializer for microkernel FIFO |
| */ |
| #define __K_FIFO_DEFAULT(depth, width, buffer) \ |
| { \ |
| .Nelms = depth,\ |
| .element_size = width,\ |
| .base = buffer,\ |
| .end_point = (buffer + (depth * width)),\ |
| .enqueue_point = buffer,\ |
| .dequeue_point = buffer,\ |
| .waiters = NULL,\ |
| .num_used = 0,\ |
| .high_watermark = 0,\ |
| .count = 0,\ |
| } |
| |
| /** |
| * @endcond |
| */ |
| |
| /** |
| * @brief FIFO enqueue request |
| * |
| * This routine puts an entry at the end of the FIFO queue. |
| * |
| * @param q FIFO queue. |
| * @param p Pointer to data to add to queue. |
| * |
| * @return RC_OK on success, RC_FAIL on failure. |
| */ |
| #define task_fifo_put(q, p) _task_fifo_put(q, p, TICKS_NONE) |
| |
| /** |
| * @brief FIFO enqueue request with waiting. |
| * |
| * This routine tries to put an entry at the end of the FIFO queue. |
| * |
| * @param q FIFO queue. |
| * @param p Pointer to data to add to queue. |
| * |
| * @return RC_OK on success, RC_FAIL on failure. |
| */ |
| #define task_fifo_put_wait(q, p) _task_fifo_put(q, p, TICKS_UNLIMITED) |
| |
| #ifdef CONFIG_SYS_CLOCK_EXISTS |
| |
| /** |
| * @brief FIFO enqueue request with a time out. |
| * |
| * This routine puts an entry at the end of the FIFO queue with a time out. |
| * |
| * @param q FIFO queue. |
| * @param p Pointer to data to add to queue. |
| * @param t Maximum number of ticks to wait. |
| * |
| * @return RC_OK on success, RC_FAIL on failure, RC_TIME on timeout. |
| */ |
| #define task_fifo_put_wait_timeout(q, p, t) _task_fifo_put(q, p, t) |
| #endif |
| |
| /** |
| * @brief FIFO dequeue request |
| * |
| * This routine tries to read a data element from the FIFO. |
| * |
| * If the FIFO is not empty, the oldest entry is removed and copied to the |
| * address provided by the caller. |
| * |
| * @param q FIFO queue. |
| * @param p Pointer to storage location of the FIFO entry. |
| * |
| * @return RC_OK on success, RC_FAIL on failure. |
| */ |
| #define task_fifo_get(q, p) _task_fifo_get(q, p, TICKS_NONE) |
| |
| /** |
| * @brief FIFO dequeue request |
| * |
| * This routine tries to read a data element from the FIFO with wait. |
| * |
| * If the FIFO is not empty, the oldest entry is removed and copied to the |
| * address provided by the caller. |
| * |
| * @param q FIFO queue. |
| * @param p Pointer to storage location of the FIFO entry. |
| * |
| * @return RC_OK on success, RC_FAIL on failure. |
| */ |
| #define task_fifo_get_wait(q, p) _task_fifo_get(q, p, TICKS_UNLIMITED) |
| |
| #ifdef CONFIG_SYS_CLOCK_EXISTS |
| |
| /** |
| * |
| * @brief FIFO dequeue request |
| * |
| * This routine tries to read a data element from the FIFO. |
| * |
| * If the FIFO is not empty, the oldest entry is removed and copied to the |
| * address provided by the caller. |
| * |
| * @param q FIFO queue. |
| * @param p Pointer to storage location of the FIFO entry. |
| * @param t Maximum number of ticks to wait. |
| * |
| * @return RC_OK on success, RC_FAIL on failure, RC_TIME on timeout. |
| */ |
| #define task_fifo_get_wait_timeout(q, p, t) _task_fifo_get(q, p, t) |
| #endif |
| |
| /** |
| * @brief Queries the number of FIFO entries. |
| * |
| * @param q FIFO queue. |
| * |
| * @return # of FIFO entries on query. |
| */ |
| #define task_fifo_size_get(q) _task_fifo_ioctl(q, 0) |
| |
| /** |
| * @brief Purge the FIFO of all its entries. |
| * |
| * @return RC_OK on purge. |
| */ |
| #define task_fifo_purge(q) _task_fifo_ioctl(q, 1) |
| |
| |
| /** |
| * @brief Define a private microkernel FIFO |
| * |
| * This declares and initializes a private FIFO. The new FIFO |
| * can be passed to the microkernel FIFO functions. |
| * |
| * @param name Name of the FIFO |
| * @param depth Depth of the FIFO |
| * @param width Width of the FIFO |
| */ |
| #define DEFINE_FIFO(name, depth, width) \ |
| static char __noinit __##name_buffer[(depth * width)]; \ |
| struct _k_fifo_struct _k_fifo_obj_##name = \ |
| __K_FIFO_DEFAULT(depth, width, __##name_buffer); \ |
| const kfifo_t name = (kfifo_t)&_k_fifo_obj_##name; |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| /** |
| * @} |
| */ |
| |
| #endif /* FIFO_H */ |