diff options
Diffstat (limited to 'platform/atm2/ATM22xx-x1x/include/ble/ke_task.h')
-rw-r--r-- | platform/atm2/ATM22xx-x1x/include/ble/ke_task.h | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/platform/atm2/ATM22xx-x1x/include/ble/ke_task.h b/platform/atm2/ATM22xx-x1x/include/ble/ke_task.h new file mode 100644 index 0000000..6e1259d --- /dev/null +++ b/platform/atm2/ATM22xx-x1x/include/ble/ke_task.h @@ -0,0 +1,221 @@ +/** + **************************************************************************************** + * + * @file ke_task.h + * + * @brief This file contains the definition related to kernel task management. + * + * Copyright (C) RivieraWaves 2009-2015 + * Copyright (C) Atmosic 2023 + * + **************************************************************************************** + */ + +#ifndef _KE_TASK_H_ +#define _KE_TASK_H_ + +/** + **************************************************************************************** + * @defgroup TASK Task and Process + * @ingroup KERNEL + * @brief Task management module. + * + * This module implements the functions used for managing tasks. + * + * @{ + **************************************************************************************** + */ + +/* + * INCLUDE FILES + **************************************************************************************** + */ +#include <stdint.h> // standard integer +#include <stdbool.h> // standard boolean + +#include "rwip_config.h" // stack configuration +#include "compiler.h" // compiler defines, INLINE +#include "ke_msg.h" // kernel message defines + +/* Default Message handler code to handle several message type in same handler. */ +#define KE_MSG_DEFAULT_HANDLER (0xFFFF) +/* Invalid task */ +#define KE_TASK_INVALID (0xFFFF) +/* Used to know if a message is not present in kernel queue */ +#define KE_MSG_NOT_IN_QUEUE ((struct co_list_hdr *) 0xFFFFFFFF) + +/// Status of ke_task API functions +enum KE_TASK_STATUS +{ + KE_TASK_OK = 0, + KE_TASK_FAIL, + KE_TASK_UNKNOWN, + KE_TASK_CAPA_EXCEEDED, + KE_TASK_ALREADY_EXISTS, +}; + + +#define MSG_T(msg) ((ke_task_id_t)((msg) >> 8)) +#define MSG_I(msg) ((msg) & ((1<<8)-1)) + +/// Format of a task message handler function +typedef int (*ke_msg_func_t)(ke_msg_id_t const msgid, void const *param, + ke_task_id_t const dest_id, ke_task_id_t const src_id); + +/// Macro for message handler function declaration or definition +#define KE_MSG_HANDLER(msg_name, param_struct) __STATIC int msg_name##_handler(ke_msg_id_t const msgid, \ + param_struct const *param, \ + ke_task_id_t const dest_id, \ + ke_task_id_t const src_id) + +#define KE_MSG_HANDLER_NO_STATIC(msg_name, param_struct) int msg_name##_handler(ke_msg_id_t const msgid, \ + param_struct const *param, \ + ke_task_id_t const dest_id, \ + ke_task_id_t const src_id) + +/// Macro for message handlers table declaration or definition +#define KE_MSG_HANDLER_TAB(task) __STATIC const struct ke_msg_handler task##_msg_handler_tab[] = + +/// Element of a message handler table. +struct ke_msg_handler +{ + /// Id of the handled message. + ke_msg_id_t id; + /// Pointer to the handler function for the msgid above. + ke_msg_func_t func; +}; + +/// Task descriptor grouping all information required by the kernel for the scheduling. +struct ke_task_desc +{ + /// Pointer to the message handler table + const struct ke_msg_handler* msg_handler_tab; + /// Pointer to the state table (one element for each instance). + ke_state_t* state; + /// Maximum index of supported instances of the task. + uint16_t idx_max; + /// Number of messages handled + uint16_t msg_cnt; +}; + +/* + * FUNCTION PROTOTYPES + **************************************************************************************** + */ + + +/** + **************************************************************************************** + * @brief Initialize Kernel task module. + **************************************************************************************** + */ +void ke_task_init(void); + +/** + **************************************************************************************** + * @brief Create a task. + * + * @param[in] task_type Task type. + * @param[in] p_task_desc Pointer to task descriptor. + * + * @return Status + **************************************************************************************** + */ +uint8_t ke_task_create(uint8_t task_type, struct ke_task_desc const * p_task_desc); + +/** + **************************************************************************************** + * @brief Delete a task. + * + * @param[in] task_type Task type. + * + * @return Status + **************************************************************************************** + */ +uint8_t ke_task_delete(uint8_t task_type); + +/** + **************************************************************************************** + * @brief Retrieve the state of a task. + * + * @param[in] id Task id. + * + * @return Current state of the task + **************************************************************************************** + */ +ke_state_t ke_state_get(ke_task_id_t const id); + +/** + **************************************************************************************** + * @brief Set the state of the task identified by its Task Id. + * + * In this function we also handle the SAVE service: when a task state changes we + * try to activate all the messages currently saved in the save queue for the given + * task identifier. + * + * @param[in] id Identifier of the task instance whose state is going to be modified + * @param[in] state_id New State + * + **************************************************************************************** + */ +void ke_state_set(ke_task_id_t const id, ke_state_t const state_id); + +/** + **************************************************************************************** + * @brief Generic message handler to consume message without handling it in the task. + * + * @param[in] msgid Id of the message received (probably unused) + * @param[in] param Pointer to the parameters of the message. + * @param[in] dest_id TaskId of the receiving task. + * @param[in] src_id TaskId of the sending task. + * + * @return KE_MSG_CONSUMED + **************************************************************************************** + */ +int ke_msg_discard(ke_msg_id_t const msgid, void const *param, + ke_task_id_t const dest_id, ke_task_id_t const src_id); + +/** + **************************************************************************************** + * @brief Generic message handler to consume message without handling it in the task. + * + * @param[in] msgid Id of the message received (probably unused) + * @param[in] param Pointer to the parameters of the message. + * @param[in] dest_id TaskId of the receiving task. + * @param[in] src_id TaskId of the sending task. + * + * @return KE_MSG_CONSUMED + **************************************************************************************** + */ +int ke_msg_save(ke_msg_id_t const msgid, void const *param, + ke_task_id_t const dest_id, ke_task_id_t const src_id); + + + +/** + **************************************************************************************** + * @brief This function flushes all messages, currently pending in the kernel for a + * specific task. + * + * @param[in] task The Task Identifier that shall be flushed. + **************************************************************************************** + */ +void ke_task_msg_flush(ke_task_id_t task); + + +/** + **************************************************************************************** + * @brief Check validity of a task. If task type or task instance does not exist, + * return invalid task + * + * @param[in] task Task Identifier to check. + * + * @return Task identifier if valid, invalid identifier else. + **************************************************************************************** + */ +ke_task_id_t ke_task_check(ke_task_id_t task); + +/// @} TASK + +#endif // _KE_TASK_H_ + |