mirror of
https://github.com/zephyrproject-rtos/zephyr
synced 2025-08-30 13:10:45 +00:00
The XCC compiler freaks out if a section name passed via __attribute__((section)) has parenthesis in it. This happens in the case of _MDEF_THREAD_DEFINE. It turns out the whole mechanism of placing kernel objects in completely unique sections is totally unnecessary. This patch is a workaround until we can clean this up. Change-Id: I12c88a1b8f5b27bec27d608614356c1b479c0a8c Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
3587 lines
101 KiB
C
3587 lines
101 KiB
C
/*
|
|
* Copyright (c) 2016, Wind River Systems, Inc.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
*
|
|
* @brief Public legacy kernel APIs.
|
|
*/
|
|
|
|
#ifndef _legacy__h_
|
|
#define _legacy__h_
|
|
|
|
#include <stdint.h>
|
|
#include <errno.h>
|
|
#include <limits.h>
|
|
#include <misc/util.h>
|
|
#include <misc/__assert.h>
|
|
#include <drivers/rand32.h>
|
|
|
|
/* nanokernel/microkernel execution context types */
|
|
#define NANO_CTX_ISR (K_ISR)
|
|
#define NANO_CTX_FIBER (K_COOP_THREAD)
|
|
#define NANO_CTX_TASK (K_PREEMPT_THREAD)
|
|
|
|
/* timeout special values */
|
|
#define TICKS_UNLIMITED (K_FOREVER)
|
|
#define TICKS_NONE (K_NO_WAIT)
|
|
|
|
/* microkernel object return codes */
|
|
#define RC_OK 0
|
|
#define RC_FAIL 1
|
|
#define RC_TIME 2
|
|
#define RC_ALIGNMENT 3
|
|
#define RC_INCOMPLETE 4
|
|
|
|
#define ANYTASK K_ANY
|
|
|
|
/* end-of-list, mostly used for semaphore groups */
|
|
#define ENDLIST K_END
|
|
|
|
/* pre-defined task groups */
|
|
#define K_TASK_GROUP_EXE 0x1
|
|
#define K_TASK_GROUP_SYS 0x2
|
|
#define K_TASK_GROUP_FPU 0x4
|
|
/* the following is for x86 architecture only */
|
|
#define K_TASK_GROUP_SSE 0x8
|
|
|
|
/* pipe amount of content to receive (0+, 1+, all) */
|
|
typedef enum {
|
|
_0_TO_N = 0x0,
|
|
_1_TO_N = 0x1,
|
|
_ALL_N = 0x2,
|
|
} K_PIPE_OPTION;
|
|
|
|
#define kpriority_t uint32_t
|
|
|
|
static inline int32_t _ticks_to_ms(int32_t ticks)
|
|
{
|
|
return (ticks == TICKS_UNLIMITED) ? K_FOREVER : __ticks_to_ms(ticks);
|
|
}
|
|
|
|
static inline int _error_to_rc(int err)
|
|
{
|
|
return err == 0 ? RC_OK : err == -EAGAIN ? RC_TIME : RC_FAIL;
|
|
}
|
|
|
|
static inline int _error_to_rc_no_timeout(int err)
|
|
{
|
|
return err == 0 ? RC_OK : RC_FAIL;
|
|
}
|
|
|
|
/* tasks/fibers/scheduler */
|
|
|
|
#define ktask_t k_tid_t
|
|
#define nano_thread_id_t k_tid_t
|
|
typedef void (*nano_fiber_entry_t)(int i1, int i2);
|
|
typedef int nano_context_type_t;
|
|
|
|
#define _MDEF_THREAD_DEFINE(name, stack_size, \
|
|
entry, p1, p2, p3, \
|
|
abort, prio, groups) \
|
|
char __noinit __stack _k_thread_obj_##name[stack_size]; \
|
|
struct _static_thread_data _k_thread_data_##name __aligned(4) \
|
|
_GENERIC_SECTION(._static_thread_data.static.mdef) = \
|
|
_THREAD_INITIALIZER(_k_thread_obj_##name, stack_size, \
|
|
entry, p1, p2, p3, prio, 0, K_FOREVER, \
|
|
abort, groups)
|
|
|
|
/**
|
|
* @defgroup legacy_apis Legacy API
|
|
* @ingroup kernel_apis
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief Define a private microkernel task.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This declares and initializes a private task. The new task
|
|
* can be passed to the microkernel task functions.
|
|
*
|
|
* @param name Name of the task.
|
|
* @param priority Priority of task.
|
|
* @param entry Entry function.
|
|
* @param stack_size Size of stack (in bytes)
|
|
* @param groups Groups this task belong to.
|
|
*/
|
|
#define DEFINE_TASK(name, priority, entry, stack_size, groups) \
|
|
extern void entry(void); \
|
|
char __noinit __stack _k_thread_obj_##name[stack_size]; \
|
|
struct _static_thread_data _k_thread_data_##name __aligned(4) \
|
|
__in_section(_static_thread_data, static, name) = \
|
|
_THREAD_INITIALIZER(_k_thread_obj_##name, stack_size, \
|
|
entry, NULL, NULL, NULL, \
|
|
priority, 0, K_FOREVER, \
|
|
NULL, (uint32_t)(groups)); \
|
|
k_tid_t const name = (k_tid_t)_k_thread_obj_##name
|
|
|
|
/**
|
|
* @brief Return the ID of the currently executing thread.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine returns a pointer to the thread control block of the currently
|
|
* executing thread. It is cast to a nano_thread_id_t for public use.
|
|
*
|
|
* @return The ID of the currently executing thread.
|
|
*/
|
|
static inline __deprecated nano_thread_id_t sys_thread_self_get(void)
|
|
{
|
|
return k_current_get();
|
|
}
|
|
|
|
/**
|
|
* @brief Cause the currently executing thread to busy wait.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine causes the current task or fiber to execute a "do nothing"
|
|
* loop for a specified period of time.
|
|
*
|
|
* @warning This routine utilizes the system clock, so it must not be invoked
|
|
* until the system clock is fully operational or while interrupts
|
|
* are locked.
|
|
*
|
|
* @param usec_to_wait Number of microseconds to busy wait.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void sys_thread_busy_wait(uint32_t usec_to_wait)
|
|
{
|
|
k_busy_wait(usec_to_wait);
|
|
}
|
|
|
|
/**
|
|
* @brief Return the type of the current execution context.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine returns the type of execution context currently executing.
|
|
*
|
|
* @return The type of the current execution context.
|
|
* @retval NANO_CTX_ISR (0): executing an interrupt service routine.
|
|
* @retval NANO_CTX_FIBER (1): current thread is a fiber.
|
|
* @retval NANO_CTX_TASK (2): current thread is a task.
|
|
*/
|
|
extern __deprecated int sys_execution_context_type_get(void);
|
|
|
|
/**
|
|
* @brief Initialize and start a fiber.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine initializes and starts a fiber. It can be called from
|
|
* either a fiber or a task. When this routine is called from a
|
|
* task, the newly created fiber will start executing immediately.
|
|
*
|
|
* @internal
|
|
* Given that this routine is _not_ ISR-callable, the following code is used
|
|
* to differentiate between a task and fiber:
|
|
*
|
|
* if ((_kernel.current->flags & TASK) == TASK)
|
|
*
|
|
* Given that the _fiber_start() primitive is not considered real-time
|
|
* performance critical, a runtime check to differentiate between a calling
|
|
* task or fiber is performed to conserve footprint.
|
|
* @endinternal
|
|
*
|
|
* @param stack Pointer to the stack space.
|
|
* @param stack_size Stack size in bytes.
|
|
* @param entry Fiber entry.
|
|
* @param arg1 1st entry point parameter.
|
|
* @param arg2 2nd entry point parameter.
|
|
* @param prio The fiber's priority.
|
|
* @param options Not used currently.
|
|
*
|
|
* @return nanokernel thread identifier
|
|
*/
|
|
static inline __deprecated nano_thread_id_t
|
|
fiber_start(char *stack, unsigned stack_size, nano_fiber_entry_t entry,
|
|
int arg1, int arg2, unsigned prio, unsigned options)
|
|
{
|
|
return k_thread_spawn(stack, stack_size, (k_thread_entry_t)entry,
|
|
(void *)(intptr_t)arg1, (void *)(intptr_t)arg2,
|
|
NULL, K_PRIO_COOP(prio), options, 0);
|
|
}
|
|
|
|
/**
|
|
* @brief Initialize and start a fiber from a fiber.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like fiber_start(), but may only be called from a fiber.
|
|
*
|
|
* @sa fiber_start
|
|
*/
|
|
#define fiber_fiber_start fiber_start
|
|
|
|
/**
|
|
* @brief Initialize and start a fiber from a task.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like fiber_start(), but may only be called from a task.
|
|
*
|
|
* @sa fiber_start
|
|
*/
|
|
#define task_fiber_start fiber_start
|
|
|
|
/**
|
|
* @brief Fiber configuration structure.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Parameters such as stack size and fiber priority are often
|
|
* user configurable. This structure makes it simple to specify such a
|
|
* configuration.
|
|
*/
|
|
struct fiber_config {
|
|
char *stack;
|
|
unsigned stack_size;
|
|
unsigned prio;
|
|
};
|
|
|
|
/**
|
|
* @brief Start a fiber based on a @ref fiber_config.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine can be called from either a fiber or a task.
|
|
*
|
|
* @param config Pointer to fiber configuration structure
|
|
* @param entry Fiber entry.
|
|
* @param arg1 1st entry point parameter.
|
|
* @param arg2 2nd entry point parameter.
|
|
* @param options Not used currently.
|
|
*
|
|
* @return thread ID
|
|
*/
|
|
#define fiber_start_config(config, entry, arg1, arg2, options) \
|
|
fiber_start(config->stack, config->stack_size, \
|
|
entry, arg1, arg2, \
|
|
config->prio, options)
|
|
|
|
/**
|
|
* @brief Start a fiber based on a @ref fiber_config, from fiber context.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like fiber_start_config(), but may only be called from a fiber.
|
|
*
|
|
* @sa fiber_start_config()
|
|
*/
|
|
#define fiber_fiber_start_config fiber_start_config
|
|
|
|
/**
|
|
* @brief Start a fiber based on a @ref fiber_config, from task context.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like fiber_start_config(), but may only be called from a task.
|
|
*
|
|
* @sa fiber_start_config()
|
|
*/
|
|
#define task_fiber_start_config fiber_start_config
|
|
|
|
/**
|
|
* @brief Start a fiber while delaying its execution.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param stack Pointer to the stack space.
|
|
* @param stack_size_in_bytes Stack size in bytes.
|
|
* @param entry_point The fiber's entry point.
|
|
* @param param1 1st entry point parameter.
|
|
* @param param2 2nd entry point parameter.
|
|
* @param priority The fiber's priority.
|
|
* @param options Not used currently.
|
|
* @param timeout_in_ticks Timeout duration in ticks.
|
|
*
|
|
* @return A handle potentially used to cancel the delayed start.
|
|
*/
|
|
static inline __deprecated nano_thread_id_t
|
|
fiber_delayed_start(char *stack, unsigned int stack_size_in_bytes,
|
|
nano_fiber_entry_t entry_point, int param1,
|
|
int param2, unsigned int priority,
|
|
unsigned int options, int32_t timeout_in_ticks)
|
|
{
|
|
return k_thread_spawn(stack, stack_size_in_bytes,
|
|
(k_thread_entry_t)entry_point,
|
|
(void *)(intptr_t)param1,
|
|
(void *)(intptr_t)param2, NULL,
|
|
K_PRIO_COOP(priority), options,
|
|
_ticks_to_ms(timeout_in_ticks));
|
|
}
|
|
|
|
/**
|
|
* @brief Start a fiber while delaying its execution.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like fiber_delayed_start(), but may only be called from a fiber.
|
|
*
|
|
* @sa fiber_delayed_start
|
|
*/
|
|
#define fiber_fiber_delayed_start fiber_delayed_start
|
|
|
|
/**
|
|
* @brief Start a fiber while delaying its execution.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like fiber_delayed_start(), but may only be called from a task.
|
|
*
|
|
* @sa fiber_delayed_start
|
|
*/
|
|
#define task_fiber_delayed_start fiber_delayed_start
|
|
|
|
/**
|
|
* @brief Cancel a delayed fiber start.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param handle The handle returned when starting the delayed fiber.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void
|
|
fiber_delayed_start_cancel(nano_thread_id_t handle)
|
|
{
|
|
k_thread_cancel(handle);
|
|
}
|
|
|
|
/**
|
|
* @brief Cancel a delayed fiber start from a fiber
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like fiber_delayed_start_cancel(), but may only be called from a fiber.
|
|
*
|
|
* @sa fiber_delayed_start_cancel
|
|
*/
|
|
#define fiber_fiber_delayed_start_cancel fiber_delayed_start_cancel
|
|
|
|
/**
|
|
* @brief Cancel a delayed fiber start from a task
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like fiber_delayed_start_cancel(), but may only be called from a fiber.
|
|
*
|
|
* @sa fiber_delayed_start_cancel
|
|
*/
|
|
#define task_fiber_delayed_start_cancel fiber_delayed_start_cancel
|
|
|
|
/**
|
|
* @brief Yield the current fiber.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Calling this routine results in the current fiber yielding to
|
|
* another fiber of the same or higher priority. If there are no
|
|
* other runnable fibers of the same or higher priority, the
|
|
* routine will return immediately.
|
|
*
|
|
* This routine can only be called from a fiber.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void fiber_yield(void)
|
|
{
|
|
k_yield();
|
|
}
|
|
|
|
/**
|
|
* @brief Abort the currently executing fiber.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine aborts the currently executing fiber. An abort can occur
|
|
* because of one of three reasons:
|
|
* - The fiber has explicitly aborted itself by calling this routine.
|
|
* - The fiber has implicitly aborted itself by returning from its entry point.
|
|
* - The fiber has encountered a fatal exception.
|
|
*
|
|
* This routine can only be called from a fiber.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void fiber_abort(void)
|
|
{
|
|
k_thread_abort(k_current_get());
|
|
}
|
|
|
|
extern void __deprecated _legacy_sleep(int32_t ticks);
|
|
|
|
/**
|
|
* @brief Put the current fiber to sleep.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine puts the currently running fiber to sleep
|
|
* for the number of system ticks passed in the
|
|
* @a timeout_in_ticks parameter.
|
|
*
|
|
* @param timeout_in_ticks Number of system ticks the fiber sleeps.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
#define fiber_sleep _legacy_sleep
|
|
|
|
/**
|
|
* @brief Put the task to sleep.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine puts the currently running task to sleep for the number
|
|
* of system ticks passed in the @a timeout_in_ticks parameter.
|
|
*
|
|
* @param timeout_in_ticks Number of system ticks the task sleeps.
|
|
*
|
|
* @warning A value of TICKS_UNLIMITED is considered invalid and may result in
|
|
* unexpected behavior.
|
|
*
|
|
* @return N/A
|
|
*
|
|
* @sa TICKS_UNLIMITED
|
|
*/
|
|
#define task_sleep _legacy_sleep
|
|
|
|
/**
|
|
* @brief Wake the specified fiber from sleep
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine is a convenience wrapper for the execution of context-specific
|
|
* APIs. It is helpful when the exact execution context is not known. However,
|
|
* it should be avoided when the context is known up-front to avoid
|
|
* unnecessary overhead.
|
|
*
|
|
* @param fiber Identifies fiber to wake
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void fiber_wakeup(nano_thread_id_t fiber)
|
|
{
|
|
k_wakeup(fiber);
|
|
}
|
|
|
|
/**
|
|
* @brief Wake the specified fiber from sleep
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like fiber_wakeup(), but may only be called from an ISR.
|
|
*
|
|
* @sa fiber_wakeup
|
|
*/
|
|
#define isr_fiber_wakeup fiber_wakeup
|
|
|
|
/**
|
|
* @brief Wake the specified fiber from sleep
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like fiber_wakeup, but may only be called from a fiber.
|
|
*
|
|
* @sa fiber_wakeup
|
|
*/
|
|
#define fiber_fiber_wakeup fiber_wakeup
|
|
|
|
/**
|
|
* @brief Wake the specified fiber from sleep
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like fiber_wakeup, but may only be called from a task.
|
|
*
|
|
* @sa fiber_wakeup
|
|
*/
|
|
#define task_fiber_wakeup fiber_wakeup
|
|
|
|
/**
|
|
* @brief Yield the CPU to another task.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine yields the processor to the next-equal priority runnable
|
|
* task. With task_yield(), the effect of round-robin scheduling is
|
|
* possible. When no task of equal priority is runnable, no task switch
|
|
* occurs, and the calling task resumes execution.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
#define task_yield fiber_yield
|
|
|
|
/**
|
|
* @brief Set the priority of a task.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine changes the priority of the specified task.
|
|
*
|
|
* The call has immediate effect. When the calling task no longer is the
|
|
* highest-priority runnable task, a task switch occurs.
|
|
*
|
|
* Priority can be assigned in the range 0 to 62, where 0 is the
|
|
* highest priority.
|
|
*
|
|
* @param task Task whose priority is to be set.
|
|
* @param prio New priority.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void task_priority_set(ktask_t task,
|
|
kpriority_t prio)
|
|
{
|
|
k_thread_priority_set(task, (int)prio);
|
|
}
|
|
|
|
/**
|
|
* @brief Set the entry point of a task.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine sets the entry point of a task to a given routine. It is
|
|
* needed only when an entry point differs from what is set in the project
|
|
* file. To have any effect, it must be called before task_start(), and it
|
|
* cannot work with members of the EXE group or with any group that starts
|
|
* automatically on application loading.
|
|
*
|
|
* The routine is executed when the task is started.
|
|
*
|
|
* @param task Task to operate on.
|
|
* @param entry Entry point.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void
|
|
task_entry_set(ktask_t task, void (*entry)(void))
|
|
{
|
|
__ASSERT(0, "task_entry_set is unsupported");
|
|
ARG_UNUSED(task);
|
|
ARG_UNUSED(entry);
|
|
|
|
/* This is impractical to implement in the new kernel and there are
|
|
* workarounds.
|
|
* 1) Set entry point in MDEF files
|
|
* 2) Set entry point in DEFINE_TASK macro
|
|
* 3) Set entry point in k_thread_spawn() invocation
|
|
*/
|
|
}
|
|
|
|
/**
|
|
* @brief Install an abort handler.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine installs an abort handler for the calling task.
|
|
*
|
|
* The abort handler runs when the calling task is aborted by a _TaskAbort()
|
|
* or task_group_abort() call.
|
|
*
|
|
* Each call to task_abort_handler_set() replaces the previously-installed
|
|
* handler.
|
|
*
|
|
* To remove an abort handler, set the parameter to NULL as below:
|
|
* task_abort_handler_set (NULL)
|
|
*
|
|
* @param handler Abort handler.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
extern void __deprecated task_abort_handler_set(void (*handler)(void));
|
|
|
|
/**
|
|
* @brief Process an "offload" request
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* The routine places the @a func into the work queue. This allows
|
|
* the task to execute a routine uninterrupted by other tasks.
|
|
*
|
|
* Note: this routine can be invoked only from a task.
|
|
* For the routine to work, the scheduler must be unlocked.
|
|
*
|
|
* @param func function to call
|
|
* @param argp function arguments
|
|
*
|
|
* @return result of @a func call
|
|
*/
|
|
extern int __deprecated task_offload_to_fiber(int (*func)(), void *argp);
|
|
|
|
/**
|
|
* @brief Gets task identifier
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @return identifier for current task
|
|
*/
|
|
static inline __deprecated ktask_t task_id_get(void)
|
|
{
|
|
return k_current_get();
|
|
}
|
|
|
|
/**
|
|
* @brief Gets task priority
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @return priority of current task
|
|
*/
|
|
static inline __deprecated kpriority_t task_priority_get(void)
|
|
{
|
|
return (kpriority_t)(k_thread_priority_get(k_current_get()));
|
|
}
|
|
|
|
/**
|
|
* @brief Abort a task
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param task Task to abort
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void task_abort(ktask_t task)
|
|
{
|
|
k_thread_abort(task);
|
|
}
|
|
|
|
/**
|
|
* @brief Suspend a task
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param task Task to suspend
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void task_suspend(ktask_t task)
|
|
{
|
|
k_thread_suspend(task);
|
|
}
|
|
|
|
/**
|
|
* @brief Resume a task
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param task Task to resume
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void task_resume(ktask_t task)
|
|
{
|
|
k_thread_resume(task);
|
|
}
|
|
|
|
/**
|
|
* @brief Start a task
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param task Task to start
|
|
*
|
|
* @return N/A
|
|
*/
|
|
extern void __deprecated task_start(ktask_t task);
|
|
|
|
/**
|
|
* @brief Set time-slicing period and scope
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine controls how task time slicing is performed by the task
|
|
* scheduler; it specifes the maximum time slice length (in ticks) and
|
|
* the highest priority task level for which time slicing is performed.
|
|
*
|
|
* To enable time slicing, a non-zero time slice length must be specified.
|
|
* The task scheduler then ensures that no executing task runs for more than
|
|
* the specified number of ticks before giving other tasks of that priority
|
|
* a chance to execute. (However, any task whose priority is higher than the
|
|
* specified task priority level is exempted, and may execute as long as
|
|
* desired without being pre-empted due to time slicing.)
|
|
*
|
|
* Time slicing limits only the maximum amount of time a task may continuously
|
|
* execute. Once the scheduler selects a task for execution, there is no minimum
|
|
* guaranteed time the task will execute before tasks of greater or equal
|
|
* priority are scheduled.
|
|
*
|
|
* When the currently-executing task is the only one of that priority eligible
|
|
* for execution, this routine has no effect; the task is immediately
|
|
* rescheduled after the slice period expires.
|
|
*
|
|
* To disable timeslicing, call the API with both parameters set to zero.
|
|
*
|
|
* @param ticks Maximum time slice length in ticks
|
|
* @param priority Highest priority task level for which time slicing is
|
|
* performed
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline void __deprecated sys_scheduler_time_slice_set(int32_t ticks,
|
|
kpriority_t priority)
|
|
{
|
|
k_sched_time_slice_set(_ticks_to_ms(ticks), (int)priority);
|
|
}
|
|
|
|
extern void _k_thread_group_op(uint32_t groups, void (*func)(struct tcs *));
|
|
|
|
/**
|
|
* @brief Get task groups for task
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @return task groups associated with current task
|
|
*/
|
|
static inline __deprecated uint32_t task_group_mask_get(void)
|
|
{
|
|
extern uint32_t _k_thread_group_mask_get(struct tcs *thread);
|
|
|
|
return _k_thread_group_mask_get(k_current_get());
|
|
}
|
|
|
|
/**
|
|
* @brief Get task groups for task
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @return task groups associated with current task
|
|
*/
|
|
#define isr_task_group_mask_get task_group_mask_get
|
|
|
|
/**
|
|
* @brief Add task to task group(s)
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param groups Task Groups
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void task_group_join(uint32_t groups)
|
|
{
|
|
extern void _k_thread_group_join(uint32_t groups, struct tcs *thread);
|
|
|
|
_k_thread_group_join(groups, k_current_get());
|
|
}
|
|
|
|
/**
|
|
* @brief Remove task from task group(s)
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param groups Task Groups
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void task_group_leave(uint32_t groups)
|
|
{
|
|
extern void _k_thread_group_leave(uint32_t groups, struct tcs *thread);
|
|
|
|
_k_thread_group_leave(groups, k_current_get());
|
|
}
|
|
|
|
/**
|
|
* @brief Start one or more task groups
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param groups Task groups to start
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void task_group_start(uint32_t groups)
|
|
{
|
|
extern void _k_thread_single_start(struct tcs *thread);
|
|
|
|
return _k_thread_group_op(groups, _k_thread_single_start);
|
|
}
|
|
|
|
/**
|
|
* @brief Suspend one or more task groups
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param groups Task groups to suspend
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void task_group_suspend(uint32_t groups)
|
|
{
|
|
extern void _k_thread_single_suspend(struct tcs *thread);
|
|
|
|
return _k_thread_group_op(groups, _k_thread_single_suspend);
|
|
}
|
|
|
|
/**
|
|
* @brief Resume one or more task groups
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param groups Task groups to resume
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void task_group_resume(uint32_t groups)
|
|
{
|
|
extern void _k_thread_single_resume(struct tcs *thread);
|
|
|
|
return _k_thread_group_op(groups, _k_thread_single_resume);
|
|
}
|
|
|
|
/**
|
|
* @brief Abort one or more task groups
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param groups Task groups to abort
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void task_group_abort(uint32_t groups)
|
|
{
|
|
extern void _k_thread_single_abort(struct tcs *thread);
|
|
|
|
return _k_thread_group_op(groups, _k_thread_single_abort);
|
|
}
|
|
|
|
/**
|
|
* @brief Get task identifier
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @return identifier for current task
|
|
*/
|
|
#define isr_task_id_get task_id_get
|
|
|
|
/**
|
|
* @brief Get task priority
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @return priority of current task
|
|
*/
|
|
#define isr_task_priority_get task_priority_get
|
|
|
|
/* mutexes */
|
|
|
|
#define kmutex_t struct k_mutex *
|
|
|
|
/**
|
|
* @brief Lock mutex.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine locks mutex @a mutex. When the mutex is locked by another task,
|
|
* the routine will either wait until it becomes available, or until a specified
|
|
* time limit is reached.
|
|
*
|
|
* A task is permitted to lock a mutex it has already locked; in such a case,
|
|
* this routine immediately succeeds.
|
|
*
|
|
* @param mutex Mutex name.
|
|
* @param timeout Determine the action to take when the mutex is already locked.
|
|
* For TICKS_NONE, return immediately.
|
|
* For TICKS_UNLIMITED, wait as long as necessary.
|
|
* Otherwise, wait up to the specified number of ticks before timing out.
|
|
*
|
|
* @retval RC_OK Successfully locked mutex.
|
|
* @retval RC_TIME Timed out while waiting for mutex.
|
|
* @retval RC_FAIL Failed to immediately lock mutex when
|
|
* @a timeout = TICKS_NONE.
|
|
*
|
|
* @sa TICKS_NONE, TICKS_UNLIMITED
|
|
*/
|
|
static inline __deprecated int task_mutex_lock(kmutex_t mutex, int32_t timeout)
|
|
{
|
|
return _error_to_rc(k_mutex_lock(mutex, _ticks_to_ms(timeout)));
|
|
}
|
|
|
|
/**
|
|
* @brief Unlock mutex.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine unlocks mutex @a mutex. The mutex must already be locked by the
|
|
* requesting task.
|
|
*
|
|
* The mutex cannot be claimed by another task until it has been unlocked by
|
|
* the requesting task as many times as it was locked by that task.
|
|
*
|
|
* @param mutex Mutex name.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void task_mutex_unlock(kmutex_t mutex)
|
|
{
|
|
k_mutex_unlock(mutex);
|
|
}
|
|
|
|
/**
|
|
* @brief Define a private mutex.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param name Mutex name.
|
|
*/
|
|
#define DEFINE_MUTEX(name) \
|
|
K_MUTEX_DEFINE(_k_mutex_obj_##name); \
|
|
struct k_mutex * const name = &_k_mutex_obj_##name
|
|
|
|
/* semaphores */
|
|
|
|
#define nano_sem k_sem
|
|
#define ksem_t struct k_sem *
|
|
|
|
/**
|
|
* @brief Initialize a nanokernel semaphore object.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This function initializes a nanokernel semaphore object structure. After
|
|
* initialization, the semaphore count is 0.
|
|
*
|
|
* It can be called from either a fiber or task.
|
|
*
|
|
* @param sem Pointer to a nano_sem structure.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void nano_sem_init(struct nano_sem *sem)
|
|
{
|
|
k_sem_init(sem, 0, UINT_MAX);
|
|
}
|
|
|
|
/**
|
|
* @brief Give a nanokernel semaphore.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine performs a "give" operation on a nanokernel sempahore object.
|
|
*
|
|
* It is also a convenience wrapper for the execution of context-specific
|
|
* APIs and helpful when the exact execution context is not known. However,
|
|
* it should be avoided when the context is known up-front to avoid unnecessary
|
|
* overhead.
|
|
*
|
|
* @param sem Pointer to a nano_sem structure.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
|
|
static inline __deprecated void nano_sem_give(struct nano_sem *sem)
|
|
{
|
|
k_sem_give(sem);
|
|
}
|
|
|
|
/**
|
|
* @brief Give a nanokernel semaphore (no context switch).
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_sem_give(), but may only be called from an ISR. A fiber
|
|
* pending on the semaphore object will be made ready, but will NOT be
|
|
* scheduled to execute.
|
|
*
|
|
* @param sem Pointer to a nano_sem structure.
|
|
*
|
|
* @sa nano_sem_give
|
|
*/
|
|
|
|
#define nano_isr_sem_give nano_sem_give
|
|
|
|
/**
|
|
* @brief Give a nanokernel semaphore (no context switch).
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_sem_give(), but may only be called from a fiber.
|
|
*
|
|
* @param sem Pointer to a nano_sem structure.
|
|
*
|
|
* @sa nano_sem_give
|
|
*/
|
|
|
|
#define nano_fiber_sem_give nano_sem_give
|
|
|
|
/**
|
|
* @brief Give a nanokernel semaphore.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_sem_give(), but may only be called from a task. A fiber pending
|
|
* on the semaphore object will be made ready, and will preempt the running
|
|
* task immediately.
|
|
*
|
|
* @param sem Pointer to a nano_sem structure.
|
|
*
|
|
* @sa nano_sem_give
|
|
*/
|
|
|
|
#define nano_task_sem_give nano_sem_give
|
|
|
|
/**
|
|
* @brief Take a nanokernel semaphore, poll/pend if not available.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine performs a "give" operation on a nanokernel sempahore object.
|
|
*
|
|
* It is also a convenience wrapper for the execution of context-specific
|
|
* APIs and is helpful when the exact execution context is not known. However,
|
|
* it should be avoided when the context is known up-front to avoid unnecessary
|
|
* overhead.
|
|
*
|
|
* @param sem Pointer to a nano_sem structure.
|
|
* @param timeout_in_ticks Determines the action to take when the semaphore is
|
|
* unavailable.
|
|
* For TICKS_NONE, return immediately.
|
|
* For TICKS_UNLIMITED, wait as long as necessary.
|
|
* Otherwise, wait up to the specified number of ticks before timing
|
|
* out.
|
|
*
|
|
* @warning If it is to be called from the context of an ISR, then @a
|
|
* timeout_in_ticks must be set to TICKS_NONE.
|
|
*
|
|
* @retval 1 When semaphore is available
|
|
* @retval 0 Otherwise
|
|
*
|
|
* @sa TICKS_NONE, TICKS_UNLIMITED
|
|
*/
|
|
static inline __deprecated int nano_sem_take(struct nano_sem *sem,
|
|
int32_t timeout_in_ticks)
|
|
{
|
|
int32_t ms = _ticks_to_ms(timeout_in_ticks);
|
|
|
|
return k_sem_take((struct k_sem *)sem, ms) == 0 ? 1 : 0;
|
|
}
|
|
|
|
/**
|
|
* @brief Take a nanokernel semaphore, fail if unavailable.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_sem_take(), but must only be called from an ISR with a timeout
|
|
* of TICKS_NONE.
|
|
*
|
|
* @sa nano_sem_take
|
|
*/
|
|
#define nano_isr_sem_take nano_sem_take
|
|
|
|
/**
|
|
* @brief Take a nanokernel semaphore, wait or fail if unavailable.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_sem_take(), but may only be called from a fiber.
|
|
*
|
|
* @sa nano_sem_take
|
|
*/
|
|
#define nano_fiber_sem_take nano_sem_take
|
|
|
|
/**
|
|
* @brief Take a nanokernel semaphore, fail if unavailable.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_sem_take(), but may only be called from a task.
|
|
*
|
|
* @sa nano_sem_take
|
|
*/
|
|
#define nano_task_sem_take nano_sem_take
|
|
|
|
/**
|
|
* @brief Give semaphore from an ISR.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine gives semaphore @a sem from an ISR, rather than a task.
|
|
*
|
|
* @param sem Semaphore name.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
#define isr_sem_give nano_sem_give
|
|
|
|
/**
|
|
* @brief Give semaphore from a fiber.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine gives semaphore @a sem from a fiber, rather than a task.
|
|
*
|
|
* @param sem Semaphore name.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
#define fiber_sem_give nano_sem_give
|
|
|
|
/**
|
|
* @brief Give semaphore.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine gives semaphore @a sem.
|
|
*
|
|
* @param sem Semaphore name.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
#define task_sem_give nano_sem_give
|
|
|
|
/**
|
|
*
|
|
* @brief Take a semaphore or fail.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine takes the semaphore @a sem. If the semaphore's count is
|
|
* zero the routine immediately returns a failure indication.
|
|
*
|
|
* @param sem Semaphore name.
|
|
* @param timeout Determines the action to take when the semaphore is
|
|
* unavailable.
|
|
* For TICKS_NONE, return immediately.
|
|
* For TICKS_UNLIMITED, wait as long as necessary.
|
|
* Otherwise, wait up to the specified number of ticks before timing out.
|
|
*
|
|
* @retval RC_OK Successfully took semaphore
|
|
* @retval RC_TIME Timed out while waiting for semaphore
|
|
* @retval RC_FAIL Failed to immediately take semaphore when
|
|
* @a timeout = TICKS_NONE
|
|
*
|
|
* @sa TICKS_NONE, TICKS_UNLIMITED
|
|
*/
|
|
static inline __deprecated int task_sem_take(ksem_t sem, int32_t timeout)
|
|
{
|
|
return _error_to_rc(k_sem_take(sem, _ticks_to_ms(timeout)));
|
|
}
|
|
|
|
/**
|
|
* @brief Reset the semaphore's count.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine resets the count of the semaphore @a sem to zero.
|
|
*
|
|
* @param sem Semaphore name.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void task_sem_reset(ksem_t sem)
|
|
{
|
|
k_sem_reset(sem);
|
|
}
|
|
|
|
/**
|
|
* @brief Read a semaphore's count.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine reads the current count of the semaphore @a sem.
|
|
*
|
|
* @param sem Semaphore name.
|
|
*
|
|
* @return Semaphore count.
|
|
*/
|
|
static inline __deprecated int task_sem_count_get(ksem_t sem)
|
|
{
|
|
return k_sem_count_get(sem);
|
|
}
|
|
|
|
/**
|
|
* @brief Read a nanokernel semaphore's count.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine reads the current count of the semaphore @a sem.
|
|
*
|
|
* @param sem Pointer to a nano_sem structure.
|
|
*
|
|
* @return Semaphore count.
|
|
*/
|
|
static inline __deprecated int nano_sem_count_get(ksem_t sem)
|
|
{
|
|
return k_sem_count_get(sem);
|
|
}
|
|
|
|
#ifdef CONFIG_SEMAPHORE_GROUPS
|
|
/*
|
|
* @internal Take the first available semaphore
|
|
*
|
|
* Given a list of semaphore pointers, this routine will attempt to take one
|
|
* of them, waiting up to a maximum of @a timeout ms to do so. The taken
|
|
* semaphore is identified by @a sem (set to NULL on error).
|
|
*
|
|
* Be aware that the more semaphores specified in the group, the more stack
|
|
* space is required by the waiting thread.
|
|
*
|
|
* @param sem_array Array of semaphore pointers terminated by a K_END entry
|
|
* @param sem Identifies the semaphore that was taken
|
|
* @param timeout Number of milliseconds to wait if semaphores are unavailable,
|
|
* or one of the special values K_NO_WAIT and K_FOREVER.
|
|
*
|
|
* @retval 0 A semaphore was successfully taken
|
|
* @retval -EBUSY No semaphore was available (@a timeout = K_NO_WAIT)
|
|
* @retval -EAGAIN Time out occurred while waiting for semaphore
|
|
*/
|
|
|
|
extern int k_sem_group_take(struct k_sem *sem_array[], struct k_sem **sem,
|
|
int32_t timeout);
|
|
|
|
/*
|
|
* @internal Give all the semaphores in the group
|
|
*
|
|
* This routine will give each semaphore in the array of semaphore pointers.
|
|
*
|
|
* @param sem_array Array of semaphore pointers terminated by a K_END entry
|
|
*
|
|
* @return N/A
|
|
*/
|
|
extern void k_sem_group_give(struct k_sem *sem_array[]);
|
|
|
|
/*
|
|
* @internal Reset the count to zero on each semaphore in the array
|
|
*
|
|
* This routine resets the count of each semaphore in the group to zero.
|
|
* Note that it does NOT have any impact on any thread that might have
|
|
* been previously pending on any of the semaphores.
|
|
*
|
|
* @param sem_array Array of semaphore pointers terminated by a K_END entry
|
|
*
|
|
* @return N/A
|
|
*/
|
|
extern void k_sem_group_reset(struct k_sem *sem_array[]);
|
|
|
|
typedef ksem_t *ksemg_t;
|
|
|
|
/**
|
|
* @brief Wait for a semaphore from the semaphore group.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine waits for the @a timeout ticks to take a semaphore from the
|
|
* semaphore group @a group.
|
|
*
|
|
* @param group Array of semaphore names - terminated by ENDLIST.
|
|
* @param timeout Determines the action to take when the semaphore is
|
|
* unavailable.
|
|
* For TICKS_NONE, return immediately.
|
|
* For TICKS_UNLIMITED, wait as long as necessary.
|
|
* Otherwise, wait up to the specified number of ticks before timing out.
|
|
*
|
|
* @retval Name of the semaphore that was taken if successful.
|
|
* @retval ENDLIST Otherwise.
|
|
*
|
|
* @sa TICKS_NONE, TICKS_UNLIMITED
|
|
*/
|
|
static inline __deprecated ksem_t task_sem_group_take(ksemg_t group,
|
|
int32_t timeout)
|
|
{
|
|
struct k_sem *sem;
|
|
|
|
(void)k_sem_group_take(group, &sem, _ticks_to_ms(timeout));
|
|
|
|
return sem;
|
|
}
|
|
|
|
/**
|
|
* @brief Give a group of semaphores.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine gives each semaphore in a semaphore group @a semagroup.
|
|
* This method is faster than giving the semaphores individually, and
|
|
* ensures that all the semaphores are given before any waiting tasks run.
|
|
*
|
|
* @param semagroup Array of semaphore names - terminated by ENDLIST.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void task_sem_group_give(ksemg_t group)
|
|
{
|
|
k_sem_group_give(group);
|
|
}
|
|
|
|
/**
|
|
* @brief Reset a group of semaphores.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine resets the count for each semaphore in the sempahore group
|
|
* @a semagroup to zero. This method is faster than resetting the semaphores
|
|
* individually.
|
|
*
|
|
* @param semagroup Array of semaphore names - terminated by ENDLIST.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void task_sem_group_reset(ksemg_t group)
|
|
{
|
|
k_sem_group_reset(group);
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* @brief Define a private microkernel semaphore
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param name Semaphore name.
|
|
*/
|
|
#define DEFINE_SEMAPHORE(name) \
|
|
K_SEM_DEFINE(_k_sem_obj_##name, 0, UINT_MAX); \
|
|
struct k_sem * const name = &_k_sem_obj_##name
|
|
|
|
/* workqueues */
|
|
|
|
#define nano_work k_work
|
|
#define work_handler_t k_work_handler_t
|
|
|
|
/**
|
|
* A workqueue is a fiber that executes @ref nano_work items that are
|
|
* queued to it. This is useful for drivers which need to schedule
|
|
* execution of code which might sleep from ISR context. The actual
|
|
* fiber identifier is not stored in the structure in order to save
|
|
* space.
|
|
*/
|
|
#define nano_workqueue k_work_q
|
|
|
|
/**
|
|
* @brief An item which can be scheduled on a @ref nano_workqueue with a delay
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*/
|
|
#define nano_delayed_work k_delayed_work
|
|
|
|
/**
|
|
* @brief Initialize work item
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param work Work item to initialize
|
|
* @param handler Handler to process work item
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline void nano_work_init(struct nano_work *work,
|
|
work_handler_t handler)
|
|
{
|
|
k_work_init(work, handler);
|
|
}
|
|
|
|
/**
|
|
* @brief Submit a work item to a workqueue.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This procedure schedules a work item to be processed.
|
|
* In the case where the work item has already been submitted and is pending
|
|
* execution, calling this function will result in a no-op. In this case, the
|
|
* work item must not be modified externally (e.g. by the caller of this
|
|
* function), since that could cause the work item to be processed in a
|
|
* corrupted state.
|
|
*
|
|
* @param wq Work queue
|
|
* @param work Work item
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void
|
|
nano_work_submit_to_queue(struct nano_workqueue *wq, struct nano_work *work)
|
|
{
|
|
k_work_submit_to_queue(wq, work);
|
|
}
|
|
|
|
/**
|
|
* @brief Start a new workqueue.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine can be called from either fiber or task context.
|
|
*
|
|
* @param wq Work queue
|
|
* @param config Fiber configuration structure
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void
|
|
nano_workqueue_start(struct nano_workqueue *wq,
|
|
const struct fiber_config *config)
|
|
{
|
|
k_work_q_start(wq, config->stack, config->stack_size, config->prio);
|
|
}
|
|
|
|
/**
|
|
* @brief Start a new workqueue.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Call this from task context.
|
|
*
|
|
* @sa nano_workqueue_start
|
|
*/
|
|
#define nano_task_workqueue_start nano_workqueue_start
|
|
|
|
/**
|
|
* @brief Start a new workqueue.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Call this from fiber context.
|
|
*
|
|
* @sa nano_workqueue_start
|
|
*/
|
|
#define nano_fiber_workqueue_start nano_workqueue_start
|
|
|
|
#if CONFIG_SYS_CLOCK_EXISTS
|
|
/**
|
|
* @brief Initialize delayed work
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param work Work item
|
|
* @param handler Handler to process work item
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void
|
|
nano_delayed_work_init(struct nano_delayed_work *work, work_handler_t handler)
|
|
{
|
|
k_delayed_work_init(work, handler);
|
|
}
|
|
|
|
/**
|
|
* @brief Submit a delayed work item to a workqueue.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This procedure schedules a work item to be processed after a delay.
|
|
* Once the delay has passed, the work item is submitted to the work queue:
|
|
* at this point, it is no longer possible to cancel it. Once the work item's
|
|
* handler is about to be executed, the work is considered complete and can be
|
|
* resubmitted.
|
|
*
|
|
* Care must be taken if the handler blocks or yield as there is no implicit
|
|
* mutual exclusion mechanism. Such usage is not recommended and if necessary,
|
|
* it should be explicitly done between the submitter and the handler.
|
|
*
|
|
* @param wq Workqueue to schedule the work item
|
|
* @param work Delayed work item
|
|
* @param ticks Ticks to wait before scheduling the work item
|
|
*
|
|
* @return 0 in case of success or negative value in case of error.
|
|
*/
|
|
static inline __deprecated int
|
|
nano_delayed_work_submit_to_queue(struct nano_workqueue *wq,
|
|
struct nano_delayed_work *work, int ticks)
|
|
{
|
|
return k_delayed_work_submit_to_queue(wq, work, _ticks_to_ms(ticks));
|
|
}
|
|
|
|
/**
|
|
* @brief Cancel a delayed work item
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This procedure cancels a scheduled work item. If the work has been completed
|
|
* or is idle, this will do nothing. The only case where this can fail is when
|
|
* the work has been submitted to the work queue, but the handler has not run
|
|
* yet.
|
|
*
|
|
* @param work Delayed work item to be canceled
|
|
*
|
|
* @return 0 in case of success or negative value in case of error.
|
|
*/
|
|
static inline __deprecated int
|
|
nano_delayed_work_cancel(struct nano_delayed_work *work)
|
|
{
|
|
return k_delayed_work_cancel(work);
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* @brief Submit a work item to the system workqueue.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @ref nano_work_submit_to_queue
|
|
*
|
|
* When using the system workqueue it is not recommended to block or yield
|
|
* on the handler since its fiber is shared system wide it may cause
|
|
* unexpected behavior.
|
|
*/
|
|
static inline __deprecated void nano_work_submit(struct nano_work *work)
|
|
{
|
|
k_work_submit(work);
|
|
}
|
|
|
|
#if CONFIG_SYS_CLOCK_EXISTS
|
|
/**
|
|
* @brief Submit a delayed work item to the system workqueue.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @ref nano_delayed_work_submit_to_queue
|
|
*
|
|
* When using the system workqueue it is not recommended to block or yield
|
|
* on the handler since its fiber is shared system wide it may cause
|
|
* unexpected behavior.
|
|
*/
|
|
#define nano_delayed_work_submit(work, ticks) \
|
|
nano_delayed_work_submit_to_queue(&k_sys_work_q, work, ticks)
|
|
#endif
|
|
/** @cond INTERNAL_HIDDEN */
|
|
/* events */
|
|
|
|
#define kevent_t const struct k_alert *
|
|
typedef int (*kevent_handler_t)(int event);
|
|
|
|
/** @endcond */
|
|
|
|
/**
|
|
* @brief Signal an event from an ISR.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine does @em not validate the specified event number.
|
|
*
|
|
* @param event Event to signal.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
#define isr_event_send task_event_send
|
|
|
|
/**
|
|
* @brief Signal an event from a fiber.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine does @em not validate the specified event number.
|
|
*
|
|
* @param event Event to signal.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
#define fiber_event_send task_event_send
|
|
|
|
/**
|
|
* @brief Set event handler request.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine specifies the event handler that runs in the context of the
|
|
* microkernel server fiber when the associated event is signaled. Specifying
|
|
* a non-NULL handler installs a new handler, while specifying a NULL event
|
|
* handler removes the existing event handler.
|
|
*
|
|
* A new event handler cannot be installed if one already exists for that event.
|
|
* The old handler must be removed first. However, the NULL event handler can be
|
|
* replaced with itself.
|
|
*
|
|
* @param legacy_event Event upon which to register.
|
|
* @param handler Function pointer to handler.
|
|
*
|
|
* @retval RC_FAIL If an event handler exists or the event number is invalid.
|
|
* @retval RC_OK Otherwise.
|
|
*/
|
|
static inline __deprecated int
|
|
task_event_handler_set(kevent_t legacy_event, kevent_handler_t handler)
|
|
{
|
|
struct k_alert *alert = (struct k_alert *)legacy_event;
|
|
|
|
if ((alert->handler != NULL) && (handler != NULL)) {
|
|
/* can't overwrite an existing event handler */
|
|
return RC_FAIL;
|
|
}
|
|
|
|
alert->handler = (k_alert_handler_t)handler;
|
|
return RC_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Signal an event request.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine signals the specified event from a task. If an event handler
|
|
* is installed for that event, it will run. If no event handler is installed,
|
|
* any task waiting on the event is released.
|
|
*
|
|
* @param legacy_event Event to signal.
|
|
*
|
|
* @retval RC_FAIL If the event number is invalid.
|
|
* @retval RC_OK Otherwise.
|
|
*/
|
|
static inline __deprecated int task_event_send(kevent_t legacy_event)
|
|
{
|
|
k_alert_send((struct k_alert *)legacy_event);
|
|
return RC_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Test for an event request with timeout.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine tests an event to see if it has been signaled.
|
|
*
|
|
* @param legacy_event Event to test.
|
|
* @param timeout Determines the action to take when the event has not yet
|
|
* been signaled.
|
|
* For TICKS_NONE, return immediately.
|
|
* For TICKS_UNLIMITED, wait as long as necessary.
|
|
* Otherwise, wait up to the specified number of ticks before
|
|
* timing out.
|
|
*
|
|
* @retval RC_OK Successfully received signaled event
|
|
* @retval RC_TIME Timed out while waiting for signaled event
|
|
* @retval RC_FAIL Failed to immediately receive signaled event when
|
|
* timeout = TICKS_NONE
|
|
*/
|
|
static inline __deprecated int task_event_recv(kevent_t legacy_event,
|
|
int32_t timeout)
|
|
{
|
|
return _error_to_rc(k_alert_recv((struct k_alert *)legacy_event,
|
|
_ticks_to_ms(timeout)));
|
|
}
|
|
|
|
/**
|
|
* @brief Define a private microkernel event
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This declares and initializes a private event. The new event
|
|
* can be passed to the microkernel event functions.
|
|
*
|
|
* @param name Name of the event
|
|
* @param event_handler Function to handle the event (can be NULL)
|
|
*/
|
|
#define DEFINE_EVENT(name, event_handler) \
|
|
K_ALERT_DEFINE(_k_event_obj_##name, event_handler, 1); \
|
|
struct k_alert * const name = &(_k_event_obj_##name)
|
|
|
|
/* memory maps */
|
|
|
|
#define kmemory_map_t struct k_mem_slab *
|
|
|
|
/**
|
|
* @brief Allocate memory map block.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine allocates a block from memory map @a map, and saves the
|
|
* block's address in the area indicated by @a mptr. When no block is available,
|
|
* the routine waits until either one can be allocated, or until the specified
|
|
* time limit is reached.
|
|
*
|
|
* @param map Memory map name.
|
|
* @param mptr Pointer to memory block address area.
|
|
* @param timeout Determines the action to take when the memory map is
|
|
* exhausted.
|
|
* For TICKS_NONE, return immediately.
|
|
* For TICKS_UNLIMITED, wait as long as necessary.
|
|
* Otherwise, wait up to the specified number of ticks before timing out.
|
|
*
|
|
* @retval RC_OK Successfully allocated memory block.
|
|
* @retval RC_TIME Timed out while waiting for memory block.
|
|
* @retval RC_FAIL Failed to immediately allocate memory block when
|
|
* @a timeout = TICKS_NONE.
|
|
*
|
|
* @sa TICKS_NONE, TICKS_UNLIMITED
|
|
*/
|
|
static inline __deprecated int
|
|
task_mem_map_alloc(kmemory_map_t map, void **mptr, int32_t timeout)
|
|
{
|
|
return _error_to_rc(k_mem_slab_alloc(map, mptr,
|
|
_ticks_to_ms(timeout)));
|
|
}
|
|
|
|
/**
|
|
* @brief Return memory slab block.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine returns a block to the specified memory slab.
|
|
*
|
|
* @param m Memory slab name.
|
|
* @param p Memory block address.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void
|
|
task_mem_map_free(kmemory_map_t m, void **p)
|
|
{
|
|
k_mem_slab_free(m, p);
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief Read the number of used blocks in a memory map.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine returns the number of blocks in use for the memory map.
|
|
*
|
|
* @param map Memory map name.
|
|
*
|
|
* @return Number of used blocks.
|
|
*/
|
|
static inline __deprecated int task_mem_map_used_get(kmemory_map_t map)
|
|
{
|
|
return (int)k_mem_slab_num_used_get(map);
|
|
}
|
|
|
|
/**
|
|
* @brief Define a private microkernel memory map.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param name Memory map name.
|
|
* @param map_num_blocks Number of blocks.
|
|
* @param map_block_size Size of each block, in bytes.
|
|
*/
|
|
#define DEFINE_MEM_MAP(name, map_num_blocks, map_block_size) \
|
|
K_MEM_SLAB_DEFINE(_k_mem_map_obj_##name, map_block_size, \
|
|
map_num_blocks, 4); \
|
|
struct k_mem_slab *const name = &_k_mem_map_obj_##name
|
|
|
|
|
|
/* memory pools */
|
|
|
|
#define k_block k_mem_block
|
|
#define kmemory_pool_t struct k_mem_pool *
|
|
#define pool_struct k_mem_pool
|
|
|
|
/**
|
|
* @brief Allocate memory pool block.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine allocates a block of at least @a reqsize bytes from memory pool
|
|
* @a pool_id, and saves its information in block descriptor @a blockptr. When
|
|
* no such block is available, the routine waits either until one can be
|
|
* allocated, or until the specified time limit is reached.
|
|
*
|
|
* @param blockptr Pointer to block descriptor.
|
|
* @param pool_id Memory pool name.
|
|
* @param reqsize Requested block size, in bytes.
|
|
* @param timeout Determines the action to take when the memory pool is
|
|
* exhausted.
|
|
* For TICKS_NONE, return immediately.
|
|
* For TICKS_UNLIMITED, wait as long as necessary.
|
|
* Otherwise, wait up to the specified number of ticks before timing out.
|
|
*
|
|
* @retval RC_OK Successfully allocated memory block
|
|
* @retval RC_TIME Timed out while waiting for memory block
|
|
* @retval RC_FAIL Failed to immediately allocate memory block when
|
|
* @a timeout = TICKS_NONE
|
|
*
|
|
* @sa TICKS_NONE, TICKS_UNLIMITED
|
|
*/
|
|
static inline __deprecated int
|
|
task_mem_pool_alloc(struct k_block *blockptr, kmemory_pool_t pool_id,
|
|
int reqsize, int32_t timeout)
|
|
{
|
|
return _error_to_rc(k_mem_pool_alloc(pool_id, blockptr, reqsize,
|
|
_ticks_to_ms(timeout)));
|
|
}
|
|
|
|
/**
|
|
* @brief Return memory pool block.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine returns a block to the memory pool from which it was allocated.
|
|
*
|
|
* @param block Pointer to block descriptor.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void task_mem_pool_free(struct k_block *block)
|
|
{
|
|
k_mem_pool_free(block);
|
|
}
|
|
|
|
/**
|
|
* @brief Defragment memory pool.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine concatenates unused blocks that can be merged in memory pool
|
|
* @a p.
|
|
*
|
|
* Doing a full defragmentation of a memory pool before allocating a set
|
|
* of blocks may be more efficient than having the pool do an implicit
|
|
* partial defragmentation each time a block is allocated.
|
|
*
|
|
* @param pool Memory pool name.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void task_mem_pool_defragment(kmemory_pool_t pool)
|
|
{
|
|
k_mem_pool_defrag(pool);
|
|
}
|
|
|
|
/**
|
|
* @brief Allocate memory
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine provides traditional malloc semantics and is a wrapper on top
|
|
* of microkernel pool alloc API. It returns an aligned memory address which
|
|
* points to the start of a memory block of at least \p size bytes.
|
|
* This memory comes from heap memory pool, consequently the app should
|
|
* specify its intention to use a heap pool via the HEAP_SIZE keyword in
|
|
* MDEF file, if it uses this API.
|
|
* When not enough free memory is available in the heap pool, it returns NULL
|
|
*
|
|
* @param size Size of memory requested by the caller.
|
|
*
|
|
* @retval address of the block if successful otherwise returns NULL
|
|
*/
|
|
static inline __deprecated void *task_malloc(uint32_t size)
|
|
{
|
|
return k_malloc(size);
|
|
}
|
|
|
|
/**
|
|
* @brief Free memory allocated through task_malloc
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine provides traditional free semantics and is intended to free
|
|
* memory allocated using task_malloc API.
|
|
*
|
|
* @param ptr pointer to be freed
|
|
*
|
|
* @return NA
|
|
*/
|
|
static inline __deprecated void task_free(void *ptr)
|
|
{
|
|
k_free(ptr);
|
|
}
|
|
/* message queues */
|
|
|
|
#define kfifo_t struct k_msgq *
|
|
|
|
/**
|
|
* @brief FIFO enqueue request.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine adds an item to the FIFO queue. When the FIFO is full,
|
|
* the routine will wait either for space to become available, or until the
|
|
* specified time limit is reached.
|
|
*
|
|
* @param queue FIFO queue.
|
|
* @param data Pointer to data to add to queue.
|
|
* @param timeout Determines the action to take when the FIFO is full.
|
|
* For TICKS_NONE, return immediately.
|
|
* For TICKS_UNLIMITED, wait as long as necessary.
|
|
* Otherwise, wait up to the specified number of ticks before timing out.
|
|
*
|
|
* @retval RC_OK Successfully added item to FIFO.
|
|
* @retval RC_TIME Timed out while waiting to add item to FIFO.
|
|
* @retval RC_FAIL Failed to immediately add item to FIFO when
|
|
* @a timeout = TICKS_NONE.
|
|
*
|
|
* @sa TICKS_NONE, TICKS_UNLIMITED
|
|
*/
|
|
static inline __deprecated int task_fifo_put(kfifo_t queue, void *data,
|
|
int32_t timeout)
|
|
{
|
|
return _error_to_rc(k_msgq_put(queue, data, _ticks_to_ms(timeout)));
|
|
}
|
|
|
|
/**
|
|
* @brief FIFO dequeue request.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine fetches the oldest item from the FIFO queue. When the FIFO is
|
|
* found empty, the routine will wait either until an item is added to the FIFO
|
|
* queue or until the specified time limit is reached.
|
|
*
|
|
* @param queue FIFO queue.
|
|
* @param data Pointer to storage location of the FIFO entry.
|
|
* @param timeout Affects the action to take when the FIFO is empty.
|
|
* For TICKS_NONE, return immediately.
|
|
* For TICKS_UNLIMITED, wait as long as necessary.
|
|
* Otherwise wait up to the specified number of ticks before timing out.
|
|
*
|
|
* @retval RC_OK Successfully fetched item from FIFO.
|
|
* @retval RC_TIME Timed out while waiting to fetch item from FIFO.
|
|
* @retval RC_FAIL Failed to immediately fetch item from FIFO when
|
|
* @a timeout = TICKS_NONE.
|
|
*
|
|
* @sa TICKS_NONE, TICKS_UNLIMITED
|
|
*/
|
|
static inline __deprecated int task_fifo_get(kfifo_t queue, void *data,
|
|
int32_t timeout)
|
|
{
|
|
return _error_to_rc(k_msgq_get(queue, data, _ticks_to_ms(timeout)));
|
|
}
|
|
|
|
/**
|
|
* @brief Purge the FIFO of all its entries.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param queue FIFO queue.
|
|
*
|
|
* @return RC_OK on purge.
|
|
*/
|
|
static inline __deprecated int task_fifo_purge(kfifo_t queue)
|
|
{
|
|
k_msgq_purge(queue);
|
|
return RC_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Query the number of FIFO entries.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param queue FIFO queue.
|
|
*
|
|
* @return # of FIFO entries on query.
|
|
*/
|
|
static inline __deprecated int task_fifo_size_get(kfifo_t queue)
|
|
{
|
|
return queue->used_msgs;
|
|
}
|
|
|
|
/**
|
|
* @brief Define a private microkernel FIFO.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* 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 q_depth Depth of the FIFO.
|
|
* @param q_width Width of the FIFO.
|
|
*/
|
|
#define DEFINE_FIFO(name, q_depth, q_width) \
|
|
K_MSGQ_DEFINE(_k_fifo_obj_##name, q_width, q_depth, 4); \
|
|
struct k_msgq * const name = &_k_fifo_obj_##name
|
|
|
|
/* mailboxes */
|
|
|
|
#define kmbox_t struct k_mbox *
|
|
|
|
struct k_msg {
|
|
/** Mailbox ID */
|
|
kmbox_t mailbox;
|
|
/** size of message (bytes) */
|
|
uint32_t size;
|
|
/** information field, free for user */
|
|
uint32_t info;
|
|
/** pointer to message data at sender side */
|
|
void *tx_data;
|
|
/** pointer to message data at receiver */
|
|
void *rx_data;
|
|
/** for async message posting */
|
|
struct k_block tx_block;
|
|
/** sending task */
|
|
ktask_t tx_task;
|
|
/** receiving task */
|
|
ktask_t rx_task;
|
|
/** internal use only */
|
|
union {
|
|
/** for 2-steps data transfer operation */
|
|
struct k_args *transfer;
|
|
/** semaphore to signal when asynchr. call */
|
|
ksem_t sema;
|
|
} extra;
|
|
};
|
|
|
|
/**
|
|
* @brief Send a message to a mailbox.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine sends a message to a mailbox and looks for a matching receiver.
|
|
*
|
|
* @param mbox Mailbox.
|
|
* @param prio Priority of data transfer.
|
|
* @param msg Pointer to message to send.
|
|
* @param timeout Determines the action to take when there is no waiting
|
|
* receiver.
|
|
* For TICKS_NONE, return immediately.
|
|
* For TICKS_UNLIMITED, wait as long as necessary.
|
|
* Otherwise, wait up to the specified number of ticks before timing out.
|
|
*
|
|
* @return RC_OK Successfully delivered message.
|
|
* @return RC_TIME Timed out while waiting to deliver message.
|
|
* @return RC_FAIL Failed to immediately deliver message when
|
|
* @a timeout = TICKS_NONE.
|
|
*
|
|
* @sa TICKS_NONE, TICKS_UNLIMITED
|
|
*/
|
|
__deprecated int task_mbox_put(kmbox_t mbox, kpriority_t prio,
|
|
struct k_msg *msg, int32_t timeout);
|
|
|
|
/**
|
|
* @brief Send a message asynchronously to a mailbox.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine sends a message to a mailbox and does not wait for a matching
|
|
* receiver. No exchange header is returned to the sender. When the data
|
|
* has been transferred to the receiver, the semaphore signaling is performed.
|
|
*
|
|
* @param mbox Mailbox to which to send message.
|
|
* @param prio Priority of data transfer.
|
|
* @param msg Pointer to message to send.
|
|
* @param sema Semaphore to signal when transfer is complete.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
__deprecated void task_mbox_block_put(kmbox_t mbox, kpriority_t prio,
|
|
struct k_msg *msg, ksem_t sema);
|
|
|
|
/**
|
|
* @brief Get @b struct @b k_msg message header structure information from
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
* a mailbox and wait with timeout.
|
|
*
|
|
* @param mbox Mailbox.
|
|
* @param msg Pointer to message.
|
|
* @param timeout Determines the action to take when there is no waiting
|
|
* receiver.
|
|
* For TICKS_NONE, return immediately.
|
|
* For TICKS_UNLIMITED, wait as long as necessary.
|
|
* Otherwise, wait up to the specified number of ticks before timing out.
|
|
*
|
|
* @return RC_OK Successfully received message.
|
|
* @return RC_TIME Timed out while waiting to receive message.
|
|
* @return RC_FAIL Failed to immediately receive message when
|
|
* @a timeout = TICKS_NONE.
|
|
*
|
|
* @sa TICKS_NONE, TICKS_UNLIMITED
|
|
*/
|
|
__deprecated int task_mbox_get(kmbox_t mbox, struct k_msg *msg,
|
|
int32_t timeout);
|
|
|
|
/**
|
|
* @brief Get message data.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Call this routine for one of two reasons:
|
|
* 1. To transfer data when the call to @b task_mbox_get() yields an existing
|
|
* field in the @b struct @b k_msg header structure.
|
|
* 2. To wake up and release a transmitting task currently blocked from calling
|
|
* @b task_mbox_put().
|
|
*
|
|
* @param msg Message from which to get data.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
__deprecated void task_mbox_data_get(struct k_msg *msg);
|
|
|
|
/**
|
|
* @brief Retrieve message data into a block, with time-limited waiting.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param msg Message from which to get data.
|
|
* @param block Block.
|
|
* @param pool_id Memory pool name.
|
|
* @param timeout Determines the action to take when no waiting sender exists.
|
|
* For TICKS_NONE, return immediately.
|
|
* For TICKS_UNLIMITED, wait as long as necessary.
|
|
* Otherwise, wait up to the specified number of ticks before timing out.
|
|
*
|
|
* @retval RC_OK Successful retrieval of message data.
|
|
* @retval RC_TIME Timed out while waiting to receive message data.
|
|
* @retval RC_FAIL Failed to immediately receive message data when
|
|
* @a timeout = TICKS_NONE.
|
|
*
|
|
* @sa TICKS_NONE, TICKS_UNLIMITED
|
|
*/
|
|
__deprecated int
|
|
task_mbox_data_block_get(struct k_msg *msg, struct k_block *block,
|
|
kmemory_pool_t pool_id, int32_t timeout);
|
|
|
|
/**
|
|
* @brief Define a private microkernel mailbox.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine declares and initializes a private mailbox. The new mailbox
|
|
* can be passed to the microkernel mailbox functions.
|
|
*
|
|
* @param name Name of the mailbox
|
|
*/
|
|
#define DEFINE_MAILBOX(name) \
|
|
K_MBOX_DEFINE(_k_mbox_obj_##name); \
|
|
struct k_mbox * const name = &_k_mbox_obj_##name
|
|
|
|
/* pipes */
|
|
|
|
#define kpipe_t struct k_pipe *
|
|
|
|
/**
|
|
* @brief Pipe write request.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Attempt to write data from a memory-buffer area to the
|
|
* specified pipe with a timeout option.
|
|
*
|
|
* @param id Pipe ID.
|
|
* @param buffer Buffer.
|
|
* @param bytes_to_write Number of bytes to write.
|
|
* @param bytes_written Pointer to number of bytes written.
|
|
* @param options Pipe options.
|
|
* @param timeout Determines the action to take when the pipe is already full.
|
|
* For TICKS_NONE, return immediately.
|
|
* For TICKS_UNLIMITED, wait as long as necessary.
|
|
* Otherwise, wait up to the specified number of ticks before timing out.
|
|
*
|
|
* @retval RC_OK Successfully wrote data to pipe.
|
|
* @retval RC_ALIGNMENT Data is improperly aligned.
|
|
* @retval RC_INCOMPLETE Only some of the data was written to the pipe when
|
|
* @a options = _ALL_N.
|
|
* @retval RC_TIME Timed out while waiting to write to pipe.
|
|
* @retval RC_FAIL Failed to immediately write to pipe when
|
|
* @a timeout = TICKS_NONE
|
|
*
|
|
* @sa TICKS_NONE, TICKS_UNLIMITED
|
|
*/
|
|
static inline __deprecated int
|
|
task_pipe_put(kpipe_t id, void *buffer, int bytes_to_write, int *bytes_written,
|
|
K_PIPE_OPTION options, int32_t timeout)
|
|
{
|
|
size_t min_xfer = (size_t)options;
|
|
|
|
__ASSERT((options == _0_TO_N) ||
|
|
(options == _1_TO_N) ||
|
|
(options == _ALL_N), "Invalid pipe option");
|
|
|
|
*bytes_written = 0;
|
|
|
|
if (bytes_to_write == 0) {
|
|
return RC_FAIL;
|
|
}
|
|
|
|
if ((options == _0_TO_N) && (timeout != K_NO_WAIT)) {
|
|
return RC_FAIL;
|
|
}
|
|
|
|
if (options == _ALL_N) {
|
|
min_xfer = bytes_to_write;
|
|
}
|
|
|
|
return _error_to_rc(k_pipe_put(id, buffer, bytes_to_write,
|
|
(size_t *)bytes_written, min_xfer,
|
|
_ticks_to_ms(timeout)));
|
|
}
|
|
|
|
/**
|
|
* @brief Pipe read request.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Attempt to read data into a memory buffer area from the
|
|
* specified pipe with a timeout option.
|
|
*
|
|
* @param id Pipe ID.
|
|
* @param buffer Buffer.
|
|
* @param bytes_to_read Number of bytes to read.
|
|
* @param bytes_read Pointer to number of bytes read.
|
|
* @param options Pipe options.
|
|
* @param timeout Determines the action to take when the pipe is already full.
|
|
* For TICKS_NONE, return immediately.
|
|
* For TICKS_UNLIMITED, wait as long as necessary.
|
|
* Otherwise, wait up to the specified number of ticks before timing out.
|
|
*
|
|
* @retval RC_OK Successfully read data from pipe.
|
|
* @retval RC_ALIGNMENT Data is improperly aligned.
|
|
* @retval RC_INCOMPLETE Only some of the data was read from the pipe when
|
|
* @a options = _ALL_N.
|
|
* @retval RC_TIME Timed out waiting to read from pipe.
|
|
* @retval RC_FAIL Failed to immediately read from pipe when
|
|
* @a timeout = TICKS_NONE.
|
|
*
|
|
* @sa TICKS_NONE, TICKS_UNLIMITED
|
|
*/
|
|
static inline __deprecated int
|
|
task_pipe_get(kpipe_t id, void *buffer, int bytes_to_read, int *bytes_read,
|
|
K_PIPE_OPTION options, int32_t timeout)
|
|
{
|
|
size_t min_xfer = (size_t)options;
|
|
|
|
__ASSERT((options == _0_TO_N) ||
|
|
(options == _1_TO_N) ||
|
|
(options == _ALL_N), "Invalid pipe option");
|
|
|
|
*bytes_read = 0;
|
|
|
|
if (bytes_to_read == 0) {
|
|
return RC_FAIL;
|
|
}
|
|
|
|
if ((options == _0_TO_N) && (timeout != K_NO_WAIT)) {
|
|
return RC_FAIL;
|
|
}
|
|
|
|
if (options == _ALL_N) {
|
|
min_xfer = bytes_to_read;
|
|
}
|
|
|
|
return _error_to_rc(k_pipe_get(id, buffer, bytes_to_read,
|
|
(size_t *)bytes_read, min_xfer,
|
|
_ticks_to_ms(timeout)));
|
|
}
|
|
|
|
#if CONFIG_NUM_PIPE_ASYNC_MSGS > 0
|
|
/**
|
|
* @brief Send a block of data asynchronously to a pipe
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine asynchronously sends a message from the pipe specified by
|
|
* @a id. Once all @a size bytes have been accepted by the pipe, it will
|
|
* free the memory block @a block and give the semaphore @a sem (if specified).
|
|
*
|
|
* @param id Pipe ID.
|
|
* @param block Memory block containing data to send
|
|
* @param size Number of data bytes in memory block to send
|
|
* @param sem Semaphore to signal upon completion
|
|
*
|
|
* @retval RC_OK Successfully sent data to the pipe.
|
|
* @retval RC_FAIL Block size is zero
|
|
*/
|
|
static inline __deprecated int
|
|
task_pipe_block_put(kpipe_t id, struct k_block block, int size, ksem_t sem)
|
|
{
|
|
if (size == 0) {
|
|
return RC_FAIL;
|
|
}
|
|
|
|
k_pipe_block_put(id, &block, size, sem);
|
|
|
|
return RC_OK;
|
|
}
|
|
#endif /* CONFIG_NUM_PIPE_ASYNC_MSGS > 0 */
|
|
|
|
/**
|
|
* @brief Define a private microkernel pipe.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param name Name of the pipe.
|
|
* @param pipe_buffer_size Size of the pipe buffer (in bytes)
|
|
*/
|
|
#define DEFINE_PIPE(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
|
|
|
|
/**
|
|
* @brief Initialize a nanokernel FIFO (fifo) object.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This function initializes a nanokernel FIFO (fifo) object
|
|
* structure.
|
|
*
|
|
* It can be called from either a fiber or task.
|
|
*
|
|
* @param fifo FIFO to initialize.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void nano_fifo_init(struct nano_fifo *fifo)
|
|
{
|
|
k_fifo_init(fifo);
|
|
}
|
|
|
|
/* nanokernel fifos */
|
|
|
|
/**
|
|
* @brief Add an element to the end of a FIFO.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine is a convenience wrapper for the execution of context-specific
|
|
* APIs. It is helpful when the exact execution context is not known. However,
|
|
* it should be avoided when the context is known up-front to avoid unnecessary
|
|
* overhead.
|
|
*
|
|
* FIFO data items must be aligned on a 4-byte boundary, as the kernel reserves
|
|
* the first 32 bits of each item for use as a pointer to the next data item in
|
|
* the FIFO's link list. Each data item added to the FIFO must include and
|
|
* reserve these first 32 bits.
|
|
*
|
|
* @param fifo FIFO on which to interact.
|
|
* @param data Data to send.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void nano_fifo_put(struct nano_fifo *fifo,
|
|
void *data)
|
|
{
|
|
k_fifo_put(fifo, data);
|
|
}
|
|
|
|
/**
|
|
* @brief Add an element to the end of a FIFO from an ISR context.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_fifo_put(), but may only be called from an ISR.
|
|
*
|
|
* @sa nano_fifo_put
|
|
*/
|
|
#define nano_isr_fifo_put nano_fifo_put
|
|
|
|
/**
|
|
* @brief Add an element to the end of a FIFO from a fiber.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_fifo_put(), but may only be called from a fiber.
|
|
*
|
|
* @sa nano_fifo_put
|
|
*/
|
|
#define nano_fiber_fifo_put nano_fifo_put
|
|
|
|
/**
|
|
* @brief Add an element to the end of a FIFO.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_fifo_put(), but may only be called from a task.
|
|
*
|
|
* @sa nano_fifo_put
|
|
*/
|
|
#define nano_task_fifo_put nano_fifo_put
|
|
|
|
#ifdef KERNEL /* XXX ztest layer redefines to a different function */
|
|
/**
|
|
* @brief Atomically add a list of elements to the end of a FIFO.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine adds a list of elements in one shot to the end of a FIFO
|
|
* object. If fibers are pending on the FIFO object, they become ready to run.
|
|
* If this API is called from a task, the highest priority one will preempt the
|
|
* running task once the put operation is complete.
|
|
*
|
|
* If enough fibers are waiting on the FIFO, the address of each element given
|
|
* to fibers is returned to the waiting fiber. The remaining elements are
|
|
* linked to the end of the list.
|
|
*
|
|
* The list must be a singly-linked list, where each element only has a pointer
|
|
* to the next one. The list must be NULL-terminated.
|
|
*
|
|
* Unlike the fiber/ISR versions of this API which is not much different
|
|
* conceptually than calling nano_fifo_put once for each element to queue, the
|
|
* behaviour is indeed different for tasks. There is no context switch being
|
|
* done for each element queued, so the task can enqueue all elements without
|
|
* being interrupted by a fiber being woken up.
|
|
*
|
|
* This routine is a convenience wrapper for the execution of context-specific
|
|
* APIs. It is helpful when the exact execution context is not known. However,
|
|
* it should be avoided when the context is known up-front to avoid unnecessary
|
|
* overhead.
|
|
*
|
|
* @param fifo FIFO on which to interact.
|
|
* @param head head of singly-linked list
|
|
* @param tail tail of singly-linked list
|
|
*
|
|
* @return N/A
|
|
*
|
|
* @sa nano_fifo_put_slist, nano_isr_fifo_put_list, nano_fiber_fifo_put_list,
|
|
* nano_task_fifo_put_list
|
|
*/
|
|
static inline __deprecated void
|
|
nano_fifo_put_list(struct nano_fifo *fifo, void *head, void *tail)
|
|
{
|
|
k_fifo_put_list(fifo, head, tail);
|
|
}
|
|
#else
|
|
void nano_fifo_put_list(struct nano_fifo *fifo, void *head, void *tail);
|
|
#endif
|
|
|
|
/**
|
|
* @brief Atomically add a list of elements to the end of a FIFO from an ISR.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_fifo_put_list(), but may only be called from an ISR.
|
|
*
|
|
* @sa nano_fifo_put_list
|
|
*/
|
|
#define nano_isr_fifo_put_list nano_fifo_put_list
|
|
|
|
/**
|
|
*
|
|
* @brief Atomically add a list of elements to the end of a FIFO from a fiber.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_fifo_put_list(), but may only be called from a fiber.
|
|
*
|
|
* @sa nano_fifo_put_list
|
|
*/
|
|
#define nano_fiber_fifo_put_list nano_fifo_put_list
|
|
|
|
/**
|
|
* @brief Atomically add a list of elements to the end of a FIFO from a fiber.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_fifo_put_list(), but may only be called from a task.
|
|
*
|
|
* @sa nano_fifo_put_list
|
|
*/
|
|
#define nano_task_fifo_put_list nano_fifo_put_list
|
|
|
|
/**
|
|
* @brief Atomically add a list of elements to the end of a FIFO.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* See nano_fifo_put_list for the description of the behaviour.
|
|
*
|
|
* It takes a pointer to a sys_slist_t object instead of the head and tail of a
|
|
* custom singly-linked list. The sys_slist_t object is invalid afterwards and
|
|
* must be re-initialized via sys_slist_init().
|
|
*
|
|
* This routine is a convenience wrapper for the execution of context-specific
|
|
* APIs. It is helpful when the exact execution context is not known. However,
|
|
* it should be avoided when the context is known up-front to avoid unnecessary
|
|
* overhead.
|
|
*
|
|
* @param fifo FIFO on which to interact.
|
|
* @param list pointer to singly-linked list
|
|
*
|
|
* @return N/A
|
|
*
|
|
* @sa nano_fifo_put_list, nano_isr_fifo_put_slist, nano_fiber_fifo_put_slist,
|
|
* nano_task_fifo_put_slist
|
|
*/
|
|
static inline __deprecated void
|
|
nano_fifo_put_slist(struct nano_fifo *fifo, sys_slist_t *list)
|
|
{
|
|
k_fifo_put_slist(fifo, list);
|
|
}
|
|
|
|
/**
|
|
* @brief Atomically add a list of elements to the end of a FIFO from an ISR.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_fifo_put_slist(), but may only be called from an ISR.
|
|
*
|
|
* @sa nano_fifo_put_slist
|
|
*/
|
|
#define nano_isr_fifo_put_slist nano_fifo_put_slist
|
|
|
|
/**
|
|
* @brief Atomically add a list of elements to the end of a FIFO from a fiber.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_fifo_put_slist(), but may only be called from a fiber.
|
|
*
|
|
* @sa nano_fifo_put_slist
|
|
*/
|
|
#define nano_fiber_fifo_put_slist nano_fifo_put_slist
|
|
|
|
/**
|
|
* @brief Atomically add a list of elements to the end of a FIFO from a fiber.
|
|
*
|
|
* Like nano_fifo_put_slist(), but may only be called from a fiber.
|
|
*
|
|
* @sa nano_fifo_put_slist
|
|
*/
|
|
#define nano_task_fifo_put_slist nano_fifo_put_slist
|
|
|
|
#ifdef KERNEL /* ztest layer redefines to a different function */
|
|
/**
|
|
* @brief Get an element from the head a FIFO.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine is a convenience wrapper for the execution of context-specific
|
|
* APIs. It is helpful when the exact execution context is not known. However,
|
|
* it should be avoided when the context is known up-front to avoid unnecessary
|
|
* overhead.
|
|
*
|
|
* If no element is available, the function returns NULL. The first word in
|
|
* the element contains invalid data because its memory location was used to
|
|
* store a pointer to the next element in the linked list.
|
|
*
|
|
* @param fifo FIFO on which to interact.
|
|
* @param timeout_in_ticks Affects the action taken should the FIFO be empty.
|
|
* If TICKS_NONE, then return immediately. If TICKS_UNLIMITED, then wait as
|
|
* long as necessary. Otherwise, wait up to the specified number of ticks
|
|
* before timing out.
|
|
*
|
|
* @warning If it is to be called from the context of an ISR, then @a
|
|
* timeout_in_ticks must be set to TICKS_NONE.
|
|
*
|
|
* @return Pointer to head element in the list when available.
|
|
* NULL Otherwise.
|
|
*
|
|
* @sa TICKS_NONE, TICKS_UNLIMITED
|
|
*/
|
|
static inline __deprecated void *nano_fifo_get(struct nano_fifo *fifo,
|
|
int32_t timeout_in_ticks)
|
|
{
|
|
return k_fifo_get((struct k_fifo *)fifo,
|
|
_ticks_to_ms(timeout_in_ticks));
|
|
}
|
|
#else
|
|
void __deprecated *nano_fifo_get(struct nano_fifo *fifo,
|
|
int32_t timeout_in_ticks);
|
|
#endif /* KERNEL */
|
|
|
|
/**
|
|
* @brief Get an element from the head of a FIFO from an ISR context.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_fifo_get(), but may only be called from an ISR with a timeout
|
|
* of TICKS_NONE.
|
|
*
|
|
* @sa nano_fifo_get
|
|
*/
|
|
#define nano_isr_fifo_get nano_fifo_get
|
|
|
|
/**
|
|
* @brief Get an element from the head of a FIFO from a fiber.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_fifo_get(), but may only be called from a fiber.
|
|
*
|
|
* @sa nano_fifo_get
|
|
*/
|
|
#define nano_fiber_fifo_get nano_fifo_get
|
|
|
|
/**
|
|
* @brief Get an element from a FIFO's head that comes from a task, poll if
|
|
* empty.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_fifo_get(), but may only be called from a task.
|
|
*
|
|
* @sa nano_fifo_get
|
|
*/
|
|
#define nano_task_fifo_get nano_fifo_get
|
|
|
|
/* nanokernel lifos */
|
|
|
|
#define nano_lifo k_lifo
|
|
|
|
/**
|
|
* @brief Initialize a nanokernel linked list LIFO (lifo) object.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This function initializes a nanokernel system-level linked list LIFO
|
|
* (lifo) object structure.
|
|
*
|
|
* It is called from either a fiber or task.
|
|
*
|
|
* @param lifo LIFO to initialize.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void nano_lifo_init(struct nano_lifo *lifo)
|
|
{
|
|
k_lifo_init(lifo);
|
|
}
|
|
|
|
/**
|
|
* @brief Prepend an element to a LIFO.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine adds an element to the LIFOs' object head
|
|
*
|
|
* This routine is a convenience wrapper for the execution of context-specific
|
|
* APIs. It is helpful when the exact execution context is not known. However,
|
|
* it should be avoided when the context is known up-front to avoid unnecessary
|
|
* overhead.
|
|
*
|
|
* @param lifo LIFO on which to put.
|
|
* @param data Data to insert.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void
|
|
nano_lifo_put(struct nano_lifo *lifo, void *data)
|
|
{
|
|
k_lifo_put(lifo, data);
|
|
}
|
|
|
|
/**
|
|
* @brief Prepend an element to a LIFO without a context switch.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_lifo_put(), but may only be called from an ISR. A fiber
|
|
* pending on the LIFO object will be made ready, but will NOT be scheduled
|
|
* to execute.
|
|
*
|
|
* @sa nano_lifo_put
|
|
*/
|
|
#define nano_isr_lifo_put nano_lifo_put
|
|
|
|
/**
|
|
* @brief Prepend an element to a LIFO without a context switch.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_lifo_put(), but may only be called from a fiber. A fiber
|
|
* pending on the LIFO object will be made ready, but will NOT be scheduled
|
|
* to execute.
|
|
*
|
|
* @sa nano_lifo_put
|
|
*/
|
|
#define nano_fiber_lifo_put nano_lifo_put
|
|
|
|
/**
|
|
* @brief Add an element to the LIFO's linked list head.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_lifo_put(), but may only be called from a task. A fiber
|
|
* pending on the LIFO object will be made ready, and will preempty the
|
|
* running task immediately.
|
|
*
|
|
* @sa nano_lifo_put
|
|
*/
|
|
#define nano_task_lifo_put nano_lifo_put
|
|
|
|
/**
|
|
* @brief Get the first element from a LIFO.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine is a convenience wrapper for the execution of context-specific
|
|
* APIs. It is helpful when the exact execution context is not known. However,
|
|
* it should be avoided when the context is known up-front to avoid unnecessary
|
|
* overhead.
|
|
*
|
|
* @param lifo LIFO on which to receive.
|
|
* @param timeout_in_ticks Affects the action taken should the LIFO be empty.
|
|
* If TICKS_NONE, then return immediately. If TICKS_UNLIMITED, then wait as
|
|
* long as necesssary. Otherwise wait up to the specified number of ticks
|
|
* before timing out.
|
|
*
|
|
* @warning If it is to be called from the context of an ISR, then @a
|
|
* timeout_in_ticks must be set to TICKS_NONE.
|
|
*
|
|
* @return Pointer to head element in the list when available.
|
|
* NULL Otherwise.
|
|
*
|
|
* @sa TICKS_NONE, TICKS_UNLIMITED
|
|
*/
|
|
static inline __deprecated void *nano_lifo_get(struct nano_lifo *lifo,
|
|
int32_t timeout_in_ticks)
|
|
{
|
|
return k_lifo_get((struct k_lifo *)lifo,
|
|
_ticks_to_ms(timeout_in_ticks));
|
|
}
|
|
|
|
/**
|
|
* @brief Remove the first element from a LIFO linked list.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_lifo_get(), but may only be called from an ISR with a timeout
|
|
* of TICKS_NONE.
|
|
*
|
|
* @sa nano_lifo_get
|
|
*/
|
|
#define nano_isr_lifo_get nano_lifo_get
|
|
|
|
/**
|
|
* @brief Prepend an element to a LIFO without a context switch.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_lifo_get(), but may only be called from a fiber.
|
|
*
|
|
* @sa nano_lifo_get
|
|
*/
|
|
#define nano_fiber_lifo_get nano_lifo_get
|
|
|
|
/**
|
|
* @brief Remove the first element from a LIFO linked list.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_lifo_get(), but may only be called from a task.
|
|
*
|
|
* @sa nano_lifo_get
|
|
*/
|
|
#define nano_task_lifo_get nano_lifo_get
|
|
|
|
/* nanokernel stacks */
|
|
|
|
#define nano_stack k_stack
|
|
|
|
/**
|
|
* @brief Initialize a nanokernel stack object.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This function initializes a nanokernel stack object structure.
|
|
*
|
|
* It is called from either a fiber or a task.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void nano_stack_init(struct nano_stack *stack,
|
|
uint32_t *data)
|
|
{
|
|
int entries;
|
|
|
|
/* use max possible number of entries */
|
|
entries = min(INT_MAX, UINTPTR_MAX - (uint32_t)data) / sizeof(*data);
|
|
|
|
k_stack_init(stack, data, entries);
|
|
}
|
|
|
|
/**
|
|
* @brief Push data onto a stack.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine pushes a data item onto a stack object. It is a convenience
|
|
* wrapper for the execution of context-specific APIs and is helpful when
|
|
* the exact execution context is not known. However, it should be avoided
|
|
* when the context is known up-front to avoid unnecessary overhead.
|
|
*
|
|
* @param stack Stack on which to interact.
|
|
* @param data Data to push on stack.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void
|
|
nano_stack_push(struct nano_stack *stack, uint32_t data)
|
|
{
|
|
k_stack_push(stack, data);
|
|
}
|
|
|
|
/**
|
|
* @brief Push data onto a stack (no context switch).
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_stack_push(), but may only be called from an ISR. A fiber that
|
|
* pends on the stack object becomes ready but will NOT be scheduled to execute.
|
|
*
|
|
* @sa nano_stack_push
|
|
*/
|
|
#define nano_isr_stack_push nano_stack_push
|
|
|
|
/**
|
|
* @brief Push data onto a stack (no context switch).
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_stack_push(), but may only be called from a fiber. A fiber that
|
|
* pends on the stack object becomes ready but will NOT be scheduled to execute.
|
|
*
|
|
* @sa nano_stack_push
|
|
*/
|
|
#define nano_fiber_stack_push nano_stack_push
|
|
|
|
/**
|
|
* @brief Push data onto a nanokernel stack.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_stack_push(), but may only be called from a task. A fiber that
|
|
* pends on the stack object becomes ready and preempts the running task
|
|
* immediately.
|
|
*
|
|
* @sa nano_stack_push
|
|
*/
|
|
#define nano_task_stack_push nano_stack_push
|
|
|
|
/**
|
|
* @brief Pop data off a stack.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine pops the first data word from a nanokernel stack object.
|
|
* It is a convenience wrapper for the execution of context-specific APIs
|
|
* and is helpful when the exact execution context is not known. However,
|
|
* it should be avoided when the context is known up-front to avoid unnecessary
|
|
* overhead.
|
|
*
|
|
* When the stack is not empty, a data word is popped and copied to the
|
|
* provided address @a data and a non-zero value is returned. When the routine
|
|
* finds an empty stack, zero is returned.
|
|
*
|
|
* @param stack Stack on which to interact.
|
|
* @param data Container for data to pop
|
|
* @param timeout_in_ticks Determines the action to take when the FIFO
|
|
* is empty.
|
|
* For TICKS_NONE, return immediately.
|
|
* For TICKS_UNLIMITED, wait as long as necessary.
|
|
* Otherwise, wait up to the specified number of ticks before timing
|
|
* out.
|
|
*
|
|
* @retval 1 When data is popped from the stack.
|
|
* @retval 0 Otherwise.
|
|
*/
|
|
static inline __deprecated int
|
|
nano_stack_pop(struct nano_stack *stack, uint32_t *data,
|
|
int32_t timeout_in_ticks)
|
|
{
|
|
return k_stack_pop((struct k_stack *)stack, data,
|
|
_ticks_to_ms(timeout_in_ticks)) == 0 ? 1 : 0;
|
|
}
|
|
|
|
/**
|
|
* @brief Pop data from a nanokernel stack.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_stack_pop(), but may only be called from an ISR.
|
|
*
|
|
* @sa nano_stack_pop
|
|
*/
|
|
#define nano_isr_stack_pop nano_stack_pop
|
|
|
|
/**
|
|
* @brief Pop data from a nanokernel stack.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_stack_pop(), but may only be called from a fiber.
|
|
*
|
|
* @sa nano_stack_pop
|
|
*/
|
|
#define nano_fiber_stack_pop nano_stack_pop
|
|
|
|
/**
|
|
* @brief Pop data from a nanokernel stack.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_stack_pop(), but may only be called from a task.
|
|
*
|
|
* @sa nano_stack_pop
|
|
*/
|
|
#define nano_task_stack_pop nano_stack_pop
|
|
|
|
/**
|
|
* @brief Return the current system tick count.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @return The current system tick count.
|
|
*/
|
|
extern __deprecated int64_t sys_tick_get(void);
|
|
|
|
/**
|
|
* @brief Return the lower part of the current system tick count.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @return The current system tick count.
|
|
*/
|
|
extern __deprecated uint32_t sys_tick_get_32(void);
|
|
|
|
/**
|
|
* @brief Return number of ticks elapsed since a reference time.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param reftime Reference time.
|
|
*
|
|
* @return The tick count since reference time; undefined for first invocation.
|
|
*/
|
|
extern __deprecated int64_t sys_tick_delta(int64_t *reftime);
|
|
|
|
/**
|
|
*
|
|
* @brief Return 32-bit number of ticks since a reference time.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @param reftime Reference time.
|
|
*
|
|
* @return A 32-bit tick count since reference time. Undefined for first
|
|
* invocation.
|
|
*/
|
|
extern __deprecated uint32_t sys_tick_delta_32(int64_t *reftime);
|
|
|
|
/**
|
|
* @brief Return a time stamp in high-resolution format.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine reads the counter register on the processor's high precision
|
|
* timer device. This counter register increments at a relatively high rate
|
|
* (e.g. 20 MHz), and is thus considered a high-resolution timer. This is
|
|
* in contrast to sys_tick_get_32() which returns the value of the system
|
|
* ticks variable.
|
|
*
|
|
* @return The current high-precision clock value.
|
|
*/
|
|
#define sys_cycle_get_32 k_cycle_get_32
|
|
|
|
/* microkernel timers */
|
|
|
|
#if (CONFIG_NUM_DYNAMIC_TIMERS > 0)
|
|
|
|
#define CONFIG_NUM_TIMER_PACKETS CONFIG_NUM_DYNAMIC_TIMERS
|
|
|
|
#define ktimer_t struct k_timer *
|
|
|
|
/**
|
|
* @brief Allocate a timer and return its object identifier.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* @return timer identifier
|
|
*/
|
|
extern __deprecated ktimer_t task_timer_alloc(void);
|
|
|
|
/**
|
|
* @brief Deallocate a timer
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine frees the resources associated with the timer. If a timer was
|
|
* started, it has to be stopped using task_timer_stop() before it can be freed.
|
|
*
|
|
* @param timer Timer to deallocate.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
extern __deprecated void task_timer_free(ktimer_t timer);
|
|
|
|
/**
|
|
* @brief Start or restart the specified low-resolution timer
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine starts or restarts the specified low-resolution timer.
|
|
*
|
|
* Signals the semaphore after a specified number of ticks set by
|
|
* @a duration expires. The timer repeats the expiration/signal cycle
|
|
* each time @a period ticks elapses.
|
|
*
|
|
* Setting @a period to 0 stops the timer at the end of the initial delay.
|
|
|
|
* If either @a duration or @a period is passed an invalid value
|
|
* (@a duration <= 0, * @a period < 0), this kernel API acts like a
|
|
* task_timer_stop(): if the allocated timer was still running (from a
|
|
* previous call), it will be cancelled; if not, nothing will happen.
|
|
*
|
|
* @param timer Timer to start.
|
|
* @param duration Initial delay in ticks.
|
|
* @param period Repetition interval in ticks.
|
|
* @param sema Semaphore to signal.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
extern __deprecated void
|
|
task_timer_start(ktimer_t timer, int32_t duration, int32_t period, ksem_t sema);
|
|
|
|
/**
|
|
* @brief Restart a timer
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine restarts the timer specified by @a timer. The timer must
|
|
* have previously been started by a call to task_timer_start().
|
|
*
|
|
* @param timer Timer to restart.
|
|
* @param duration Initial delay.
|
|
* @param period Repetition interval.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void
|
|
task_timer_restart(ktimer_t timer, int32_t duration, int32_t period)
|
|
{
|
|
k_timer_start(timer, _ticks_to_ms(duration), _ticks_to_ms(period));
|
|
}
|
|
|
|
/**
|
|
* @brief Stop a timer
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine stops the specified timer. If the timer period has already
|
|
* elapsed, the call has no effect.
|
|
*
|
|
* @param timer Timer to stop.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void task_timer_stop(ktimer_t timer)
|
|
{
|
|
k_timer_stop(timer);
|
|
}
|
|
|
|
#endif /* CONFIG_NUM_DYNAMIC_TIMERS > 0 */
|
|
|
|
/* nanokernel timers */
|
|
|
|
#define nano_timer k_timer
|
|
|
|
/**
|
|
* @brief Initialize a nanokernel timer object.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This function initializes a nanokernel timer object structure.
|
|
*
|
|
* It can be called from either a fiber or task.
|
|
*
|
|
* The @a data passed to this function is a pointer to a data structure defined
|
|
* by the user. It contains data that the user wishes to store when initializing
|
|
* the timer and recover when the timer expires. However, the first field of
|
|
* this data structure must be a pointer reserved for the API's use that can be
|
|
* overwritten by the API and, as such, should not contain user data.
|
|
*
|
|
* @param timer Timer.
|
|
* @param data User Data.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void
|
|
nano_timer_init(struct k_timer *timer, void *data)
|
|
{
|
|
k_timer_init(timer, NULL, NULL);
|
|
timer->user_data = data;
|
|
}
|
|
|
|
/**
|
|
* @brief Start a nanokernel timer.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine starts a previously initialized nanokernel timer object. The
|
|
* timer will expire in @a ticks system clock ticks. It is also a convenience
|
|
* wrapper for the execution of context-specific APIs and is helpful when the
|
|
* the exact execution context is not known. However, it should be avoided when
|
|
* the context is known up-front to avoid unnecessary overhead.
|
|
*
|
|
* @param timer Timer.
|
|
* @param ticks Number of ticks.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void
|
|
nano_timer_start(struct nano_timer *timer, int ticks)
|
|
{
|
|
k_timer_start(timer, _ticks_to_ms(ticks), 0);
|
|
}
|
|
|
|
/**
|
|
* @brief Start a nanokernel timer from an ISR.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_timer_start(), but may only be called from an ISR with a
|
|
* timeout of TICKS_NONE.
|
|
*
|
|
* @sa nano_timer_start
|
|
*/
|
|
#define nano_isr_timer_start nano_timer_start
|
|
|
|
/**
|
|
* @brief Start a nanokernel timer from a fiber.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_timer_start(), but may only be called from a fiber.
|
|
*
|
|
* @sa nano_timer_start
|
|
*/
|
|
#define nano_fiber_timer_start nano_timer_start
|
|
|
|
/**
|
|
* @brief Start a nanokernel timer from a task.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_timer_start(), but may only be called from a task.
|
|
*
|
|
* @sa nano_timer_start
|
|
*/
|
|
#define nano_task_timer_start nano_timer_start
|
|
|
|
/**
|
|
* @brief Wait for a nanokernel timer to expire.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine checks if a previously started nanokernel timer object has
|
|
* expired. It is also a convenience wrapper for the execution of context-
|
|
* specific APIs. It is helpful when the exact execution context is not known.
|
|
* However, it should be avoided when the context is known up-front to avoid
|
|
* unnecessary overhead.
|
|
*
|
|
* @param timer Timer.
|
|
* @param timeout_in_ticks Determines the action to take when the timer has
|
|
* not expired.
|
|
* For TICKS_NONE, return immediately.
|
|
* For TICKS_UNLIMITED, wait as long as necessary.
|
|
*
|
|
* @retval Pointer to timer initialization data.
|
|
* @retval NULL If timer not expired.
|
|
*
|
|
* @warning If called from an ISR, then @a timeout_in_ticks must be TICKS_NONE.
|
|
*
|
|
* @sa TICKS_NONE, TICKS_UNLIMITED
|
|
*/
|
|
extern __deprecated void *nano_timer_test(struct nano_timer *timer,
|
|
int32_t timeout_in_ticks);
|
|
|
|
/**
|
|
* @brief Make the current ISR check for a timer expiry.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_timer_test(), but may only be called from an ISR with a timeout
|
|
* of TICKS_NONE.
|
|
*
|
|
* @sa nano_timer_test
|
|
*/
|
|
#define nano_isr_timer_test nano_timer_test
|
|
|
|
/**
|
|
* @brief Make the current fiber check for a timer expiry.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_timer_test(), but may only be called from a fiber.
|
|
*
|
|
* @sa nano_timer_test
|
|
*/
|
|
#define nano_fiber_timer_test nano_timer_test
|
|
|
|
/**
|
|
* @brief Make the current task check for a timer expiry.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_timer_test(), but may only be called from a task.
|
|
*
|
|
* @sa nano_timer_test
|
|
*/
|
|
#define nano_task_timer_test nano_timer_test
|
|
|
|
/**
|
|
* @brief Stop a nanokernel timer
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine stops a previously started nanokernel timer object. It is also
|
|
* a convenience wrapper for the execution of context-specific APIs. It is
|
|
* helpful when the exact execution context is not known. However, it should be
|
|
* avoided when the context is known up-front to avoid unnecessary overhead.
|
|
*
|
|
* @param timer Timer to stop.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
|
|
static inline __deprecated void nano_timer_stop(struct nano_timer *timer)
|
|
{
|
|
k_timer_stop(timer);
|
|
}
|
|
|
|
/**
|
|
* @brief Stop a timer.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine stops the specified timer. If the timer period has already
|
|
* elapsed, the call has no effect.
|
|
*
|
|
* @param timer Timer to stop.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
|
|
#define task_timer_stop nano_timer_stop
|
|
|
|
/**
|
|
* @brief Stop a nanokernel timer from an ISR.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_timer_stop(), but may only be called from an ISR.
|
|
*
|
|
* @sa nano_timer_stop
|
|
*/
|
|
|
|
#define nano_isr_timer_stop nano_timer_stop
|
|
|
|
/**
|
|
* @brief Stop a nanokernel timer.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_timer_stop(), but may only be called from a fiber.
|
|
*
|
|
* @sa nano_timer_stop
|
|
*/
|
|
|
|
#define nano_fiber_timer_stop nano_timer_stop
|
|
|
|
/**
|
|
* @brief Stop a nanokernel timer from a task.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Like nano_timer_stop(), but may only be called from a task.
|
|
*
|
|
* @sa nano_timer_stop
|
|
*/
|
|
|
|
#define nano_task_timer_stop nano_timer_stop
|
|
|
|
/**
|
|
* @brief Get nanokernel timer remaining ticks.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This function returns the remaining ticks of the previously
|
|
* started nanokernel timer object.
|
|
*
|
|
* @param timer Timer to query
|
|
*
|
|
* @return remaining ticks or 0 if the timer has expired
|
|
*/
|
|
static inline __deprecated int32_t
|
|
nano_timer_ticks_remain(struct nano_timer *timer)
|
|
{
|
|
return _ms_to_ticks(k_timer_remaining_get(timer));
|
|
}
|
|
|
|
/**
|
|
* @brief Make the CPU idle.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This function makes the CPU idle until an event wakes it up.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void nano_cpu_idle(void)
|
|
{
|
|
k_cpu_idle();
|
|
}
|
|
|
|
/**
|
|
* @brief Make the CPU idle in an atomic fashion.
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* Similar to k_cpu_idle(), but called with interrupts locked if operations
|
|
* must be done atomically before making the CPU idle.
|
|
*
|
|
* @param key Interrupt locking key obtained from irq_lock().
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void nano_cpu_atomic_idle(unsigned int key)
|
|
{
|
|
k_cpu_atomic_idle(key);
|
|
}
|
|
|
|
#if CONFIG_X86
|
|
#if CONFIG_FP_SHARING
|
|
|
|
#include <arch/cpu.h>
|
|
|
|
/* floating point services */
|
|
|
|
#define USE_FP K_FP_REGS
|
|
#define USE_SSE K_SSE_REGS
|
|
|
|
/**
|
|
* @brief Enable floating point hardware resources sharing
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine dynamically enables the capability of a thread to share floating
|
|
* point hardware resources. The same "floating point" options accepted by
|
|
* fiber_fiber_start() are accepted by this API (i.e. USE_FP and USE_SSE).
|
|
*
|
|
* @param thread_id ID of thread that may share the floating point hardware
|
|
* @param options USE_FP or USE_SSE
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void
|
|
fiber_float_enable(struct tcs *tcs, unsigned int options)
|
|
{
|
|
k_float_enable(tcs, options);
|
|
}
|
|
|
|
/**
|
|
* @brief Enable floating point hardware resources sharing
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine dynamically enables the capability of a thread to share
|
|
* floating point hardware resources. The same "floating point" options
|
|
* accepted by fiber_fiber_start() are accepted by this API
|
|
* (i.e. USE_FP and USE_SSE).
|
|
*
|
|
* @param thread_id ID of thread that may share the floating point hardware
|
|
* @param options USE_FP or USE_SSE
|
|
*
|
|
* @return N/A
|
|
*/
|
|
|
|
#define task_float_enable fiber_float_enable
|
|
|
|
/**
|
|
* @brief Disable floating point hardware resources sharing
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine dynamically disables the capability of a thread to share
|
|
* floating point hardware resources. The same "floating point" options
|
|
* accepted by fiber_fiber_start() are accepted by this API
|
|
* (i.e. USE_FP and USE_SSE).
|
|
*
|
|
* @param thread_id ID of thread that may not share the floating point hardware
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static inline __deprecated void fiber_float_disable(struct tcs *tcs)
|
|
{
|
|
k_float_disable(tcs);
|
|
}
|
|
|
|
/**
|
|
* @brief Enable floating point hardware resources sharing
|
|
*
|
|
* <b> Legacy API: Will be deprecated in Zephyr 1.9 </b>
|
|
* @deprecated This API will be deprecated.
|
|
*
|
|
* This routine dynamically disables the capability of a thread to share
|
|
* floating point hardware resources. The same "floating point" options
|
|
* accepted by fiber_fiber_start() are accepted by this API
|
|
* (i.e. USE_FP and USE_SSE).
|
|
*
|
|
* @param thread_id ID of thread that may not share the floating point hardware
|
|
*
|
|
* @return N/A
|
|
*/
|
|
|
|
#define task_float_disable fiber_float_disable
|
|
|
|
#endif /* CONFIG_FP_SHARING */
|
|
#endif /* CONFIG_X86 */
|
|
|
|
/**
|
|
* @} end legacy_apis
|
|
*/
|
|
|
|
|
|
#endif /* _legacy__h_ */
|