From e5d9c583013bfee238ebb454b83ed8efaa02c7c1 Mon Sep 17 00:00:00 2001 From: Peter Mitsis Date: Fri, 14 Oct 2016 14:44:57 -0400 Subject: [PATCH] unified: Tweak pipe API parameters - Reorders parameters where necessary - Adds alignment parameter to K_PIPE_DEFINE() - Renames parameters where necessary so they are sync'd between header and source files Change-Id: I4f2367abc28aff646cc90beb9f08bb266e143b0c Signed-off-by: Peter Mitsis --- doc/kernel_v2/data_passing/pipes.rst | 6 ++-- include/kernel.h | 53 ++++++++++++++-------------- include/legacy.h | 2 +- kernel/unified/pipes.c | 10 +++--- scripts/sysgen | 2 +- 5 files changed, 37 insertions(+), 36 deletions(-) diff --git a/doc/kernel_v2/data_passing/pipes.rst b/doc/kernel_v2/data_passing/pipes.rst index 848f4074c25..ac9336e4397 100644 --- a/doc/kernel_v2/data_passing/pipes.rst +++ b/doc/kernel_v2/data_passing/pipes.rst @@ -57,12 +57,12 @@ optional character buffer of type :c:type:`unsigned char`. It must then be initialized by calling :c:func:`k_pipe_init()`. The following code defines and initializes an empty pipe that has a ring -buffer capable of holding 100 bytes. +buffer capable of holding 100 bytes and is aligned to a 4-byte boundary. .. code-block:: c - unsigned char my_ring_buffer[100]; + unsigned char __aligned(4) my_ring_buffer[100]; struct k_pipe my_pipe; k_pipe_init(&my_pipe, my_ring_buffer, sizeof(my_ring_buffer)); @@ -75,7 +75,7 @@ that that macro defines both the pipe and its ring buffer. .. code-block:: c - K_PIPE_DEFINE(my_pipe, 100); + K_PIPE_DEFINE(my_pipe, 100, 4); Writing to a Pipe ================= diff --git a/include/kernel.h b/include/kernel.h index ca8b14363af..2bed90c12ca 100644 --- a/include/kernel.h +++ b/include/kernel.h @@ -920,7 +920,7 @@ struct k_pipe { _DEBUG_TRACING_KERNEL_OBJECTS_NEXT_PTR(k_pipe); }; -#define K_PIPE_INITIALIZER(obj, pipe_buffer_size, pipe_buffer) \ +#define K_PIPE_INITIALIZER(obj, pipe_buffer, pipe_buffer_size) \ { \ .buffer = pipe_buffer, \ .size = pipe_buffer_size, \ @@ -932,10 +932,11 @@ struct k_pipe { _DEBUG_TRACING_KERNEL_OBJECTS_INIT \ } -#define K_PIPE_DEFINE(name, pipe_buffer_size) \ - static unsigned char __noinit _k_pipe_buf_##name[pipe_buffer_size]; \ +#define K_PIPE_DEFINE(name, pipe_buffer_size, pipe_align) \ + static unsigned char __noinit __aligned(pipe_align) \ + _k_pipe_buf_##name[pipe_buffer_size]; \ struct k_pipe name = \ - K_PIPE_INITIALIZER(name, pipe_buffer_size, _k_pipe_buf_##name) + K_PIPE_INITIALIZER(name, _k_pipe_buf_##name, pipe_buffer_size) /** * @brief Runtime initialization of a pipe @@ -954,48 +955,48 @@ extern void k_pipe_init(struct k_pipe *pipe, unsigned char *buffer, * * This routine synchronously adds a message into the pipe specified by * @a pipe. It will wait up to @a timeout for the pipe to accept - * @a num_bytes_to_write bytes of data. If by @a timeout, the pipe could not - * accept @a min_bytes bytes of data, it fails. Fewer than @a min_bytes will + * @a bytes_to_write bytes of data. If by @a timeout, the pipe could not + * accept @a min_xfer bytes of data, it fails. Fewer than @a min_xfer will * only ever be written to the pipe if K_NO_WAIT < @a timeout < K_FOREVER. * * @param pipe Pointer to the pipe - * @param buffer Data to put into the pipe - * @param num_bytes_to_write Desired number of bytes to put into the pipe - * @param num_bytes_written Number of bytes the pipe accepted - * @param min_bytes Minimum number of bytes accepted for success + * @param data Data to put into the pipe + * @param bytes_to_write Desired number of bytes to put into the pipe + * @param bytes_written Number of bytes the pipe accepted + * @param min_xfer Minimum number of bytes accepted for success * @param timeout Maximum number of milliseconds to wait * - * @retval 0 At least @a min_bytes were sent + * @retval 0 At least @a min_xfer were sent * @retval -EIO Request can not be satisfied (@a timeout is K_NO_WAIT) - * @retval -EAGAIN Fewer than @a min_bytes were sent + * @retval -EAGAIN Fewer than @a min_xfer were sent */ -extern int k_pipe_put(struct k_pipe *pipe, void *buffer, - size_t num_bytes_to_write, size_t *num_bytes_written, - size_t min_bytes, int32_t timeout); +extern int k_pipe_put(struct k_pipe *pipe, void *data, + size_t bytes_to_write, size_t *bytes_written, + size_t min_xfer, int32_t timeout); /** * @brief Get a message from the specified pipe * * This routine synchronously retrieves a message from the pipe specified by - * @a pipe. It will wait up to @a timeout to retrieve @a num_bytes_to_read + * @a pipe. It will wait up to @a timeout to retrieve @a bytes_to_read * bytes of data from the pipe. If by @a timeout, the pipe could not retrieve - * @a min_bytes bytes of data, it fails. Fewer than @a min_bytes will + * @a min_xfer bytes of data, it fails. Fewer than @a min_xfer will * only ever be retrieved from the pipe if K_NO_WAIT < @a timeout < K_FOREVER. * * @param pipe Pointer to the pipe - * @param buffer Location to place retrieved data - * @param num_bytes_to_read Desired number of bytes to retrieve from the pipe - * @param num_bytes_read Number of bytes retrieved from the pipe - * @param min_bytes Minimum number of bytes retrieved for success + * @param data Location to place retrieved data + * @param bytes_to_read Desired number of bytes to retrieve from the pipe + * @param bytes_read Number of bytes retrieved from the pipe + * @param min_xfer Minimum number of bytes retrieved for success * @param timeout Maximum number of milliseconds to wait * - * @retval 0 At least @a min_bytes were transferred + * @retval 0 At least @a min_xfer were transferred * @retval -EIO Request can not be satisfied (@a timeout is K_NO_WAIT) - * @retval -EAGAIN Fewer than @a min_bytes were retrieved + * @retval -EAGAIN Fewer than @a min_xfer were retrieved */ -extern int k_pipe_get(struct k_pipe *pipe, void *buffer, - size_t num_bytes_to_read, size_t *num_bytes_read, - size_t min_bytes, int32_t timeout); +extern int k_pipe_get(struct k_pipe *pipe, void *data, + size_t bytes_to_read, size_t *bytes_read, + size_t min_xfer, int32_t timeout); /** * @brief Send a message to the specified pipe diff --git a/include/legacy.h b/include/legacy.h index 3cfead7e379..10cb27fd46d 100644 --- a/include/legacy.h +++ b/include/legacy.h @@ -567,7 +567,7 @@ static inline int task_pipe_block_put(kpipe_t id, struct k_block block, } #define DEFINE_PIPE(name, pipe_buffer_size) \ - K_PIPE_DEFINE(_k_pipe_obj_##name, pipe_buffer_size); \ + K_PIPE_DEFINE(_k_pipe_obj_##name, pipe_buffer_size, 4); \ struct k_pipe * const name = &_k_pipe_obj_##name #define nano_fifo k_fifo diff --git a/kernel/unified/pipes.c b/kernel/unified/pipes.c index 94054f8884b..017fc1d6c1c 100644 --- a/kernel/unified/pipes.c +++ b/kernel/unified/pipes.c @@ -523,7 +523,7 @@ int _k_pipe_put_internal(struct k_pipe *pipe, struct k_pipe_async *async_desc, bytes_to_write); } -int k_pipe_get(struct k_pipe *pipe, void *buffer, size_t bytes_to_read, +int k_pipe_get(struct k_pipe *pipe, void *data, size_t bytes_to_read, size_t *bytes_read, size_t min_xfer, int32_t timeout) { struct k_thread *writer; @@ -554,7 +554,7 @@ int k_pipe_get(struct k_pipe *pipe, void *buffer, size_t bytes_to_read, k_sched_lock(); irq_unlock(key); - num_bytes_read = _pipe_buffer_get(pipe, buffer, bytes_to_read); + num_bytes_read = _pipe_buffer_get(pipe, data, bytes_to_read); /* * 1. 'xfer_list' currently contains a list of writer threads that can @@ -574,7 +574,7 @@ int k_pipe_get(struct k_pipe *pipe, void *buffer, size_t bytes_to_read, sys_dlist_get(&xfer_list); while (thread && (num_bytes_read < bytes_to_read)) { desc = (struct k_pipe_desc *)thread->swap_data; - bytes_copied = _pipe_xfer(buffer + num_bytes_read, + bytes_copied = _pipe_xfer(data + num_bytes_read, bytes_to_read - num_bytes_read, desc->buffer, desc->bytes_to_xfer); @@ -598,7 +598,7 @@ int k_pipe_get(struct k_pipe *pipe, void *buffer, size_t bytes_to_read, if (writer && (num_bytes_read < bytes_to_read)) { desc = (struct k_pipe_desc *)writer->swap_data; - bytes_copied = _pipe_xfer(buffer + num_bytes_read, + bytes_copied = _pipe_xfer(data + num_bytes_read, bytes_to_read - num_bytes_read, desc->buffer, desc->bytes_to_xfer); @@ -647,7 +647,7 @@ int k_pipe_get(struct k_pipe *pipe, void *buffer, size_t bytes_to_read, struct k_pipe_desc pipe_desc; - pipe_desc.buffer = buffer + num_bytes_read; + pipe_desc.buffer = data + num_bytes_read; pipe_desc.bytes_to_xfer = bytes_to_read - num_bytes_read; if (timeout != K_NO_WAIT) { diff --git a/scripts/sysgen b/scripts/sysgen index 92be176f88e..b05acb0a111 100755 --- a/scripts/sysgen +++ b/scripts/sysgen @@ -724,7 +724,7 @@ def kernel_main_c_pipes(): for pipe in pipe_list: name = pipe[0] size = pipe[1] - kernel_main_c_out("K_PIPE_DEFINE(_k_pipe_obj_%s, %d);\n" % + kernel_main_c_out("K_PIPE_DEFINE(_k_pipe_obj_%s, %d, 4);\n" % (name, size))