/* microkernel/pipe.h */ /* * 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. */ #ifndef PIPE_H #define PIPE_H #ifdef __cplusplus extern "C" { #endif /** * @brief Microkernel Pipes * @defgroup microkernel_pipe Microkernel Pipes * @ingroup microkernel_services * @{ */ #include /** * @cond internal */ extern int _task_pipe_put(kpipe_t id, void *pBuffer, int iNbrBytesToWrite, int *piNbrBytesWritten, K_PIPE_OPTION Option, int32_t TimeOut); /** * @internal * @brief Initialize a pipe struct. * * @param size Size of pipe buffer. * @param buffer Pointer to the buffer. * @endinternal */ #define __K_PIPE_INITIALIZER(size, buffer) \ { \ .buffer_size = size, \ .Buffer = buffer, \ } /** * @endcond */ /** * @brief Pipe write request * * Attempt to write data from a memory buffer area to the specified pipe. * Fail immediately if it is not possible. * * @param i Pipe ID * @param b Buffer * @param n Number of bytes to write * @param pn Pointer to number of bytes written * @param o Pipe options * * @return RC_OK, RC_INCOMPLETE, RC_FAIL, or RC_ALIGNMENT */ #define task_pipe_put(i, b, n, pn, o) \ _task_pipe_put(i, b, n, pn, o, TICKS_NONE) /** * @brief Pipe write request with unlimited wait * * Attempt to write data from a memory buffer area to the * specified pipe and wait forever until it succeeds. * * @param i Pipe ID * @param b Buffer * @param n Number of bytes to write * @param pn Pointer to number of bytes written * @param o Pipe options * * @return RC_OK, RC_INCOMPLETE or RC_ALIGNMENT */ #define task_pipe_put_wait(i, b, n, pn, o) \ _task_pipe_put(i, b, n, pn, o, TICKS_UNLIMITED) /** * @brief Pipe write request with timeout * * Attemp to write data from a memory buffer area to the * specified pipe with a timeout option. * * @param id Pipe ID * @param b Buffer * @param n Number of bytes to write * @param pn Pointer to number of bytes written * @param o Pipe options * @param t Timeout * * @return RC_OK, RC_INCOMPLETE, RC_FAIL, RC_TIME, or RC_ALIGNMENT */ #define task_pipe_put_wait_timeout(id, b, n, pn, o, t) \ _task_pipe_put(id, b, n, pn, o, t) extern int _task_pipe_get(kpipe_t id, void *pBuffer, int iNbrBytesToRead, int *piNbrBytesRead, K_PIPE_OPTION Option, int32_t TimeOut); /** * @brief Pipe read request * * Attempt to read data into a memory buffer area from the * specified pipe and fail immediately if not possible. * * @param id Pipe ID * @param b Buffer * @param n Number of bytes to read * @param pn Pointer to number of bytes read * @param o Pipe options * * @return RC_OK, RC_INCOMPLETE, RC_FAIL, or RC_ALIGNMENT */ #define task_pipe_get(id, b, n, pn, o) \ _task_pipe_get(id, b, n, pn, o, TICKS_NONE) /** * @brief Pipe read request and wait * * Attempt to read data into a memory buffer area from the * specified pipe and wait forever until it succeeds. * * @param id Pipe ID * @param b Buffer * @param n Number of bytes to read * @param pn Pointer to number of bytes read * @param o Pipe options * * @return RC_OK, RC_INCOMPLETE, or RC_ALIGNMENT */ #define task_pipe_get_wait(id, b, n, pn, o) \ _task_pipe_get(id, b, n, pn, o, TICKS_UNLIMITED) /** * @brief Pipe read request * * This routine attempts to read data into a memory buffer area from the * specified pipe, with a possible timeout option. * * @param id Pipe ID * @param b Buffer * @param n Number of bytes to read * @param pn Pointer to number of bytes read * @param o Pipe options * @param t Timeout * * @return RC_OK, RC_INCOMPLETE, RC_FAIL, RC_TIME, or RC_ALIGNMENT */ #define task_pipe_get_wait_timeout(id, b, n, pn, o, t) \ _task_pipe_get(id, b, n, pn, o, t) extern int _task_pipe_block_put(kpipe_t id, struct k_block block, int size, ksem_t sema); /** * @brief Asynchronous pipe write request * * This routine attempts to write data from a memory pool block to the * specified pipe. (Note that partial transfers and timeouts are not * supported, unlike the case for synchronous write requests.) * * @param id pipe ID * @param block Block * @param size Size of data to be transferred * @param sema Semphore ID * * @return RC_OK, RC_FAIL, or RC_ALIGNMENT */ #define task_pipe_block_put(id, block, size, sema) \ _task_pipe_block_put(id, block, size, sema) /** * @brief Define a private microkernel pipe. * * @param name Name of the pipe. * @param size Size of the pipe buffer, in bytes. */ #define DEFINE_PIPE(name, size) \ char __noinit __pipe_buffer_##name[size]; \ struct _k_pipe_struct _k_pipe_obj_##name = \ __K_PIPE_INITIALIZER(size, __pipe_buffer_##name); \ const kpipe_t name \ __section(_k_pipe_ptr, private, pipe) = \ (kpipe_t)&_k_pipe_obj_##name; /** * @} */ #ifdef __cplusplus } #endif #endif /* PIPE_H */