From 8cf53fc8ab1d0347a6cee9616294c5e597f41a9d Mon Sep 17 00:00:00 2001 From: Jose Alamos Date: Wed, 17 Aug 2022 13:27:51 +0200 Subject: [PATCH] sys/bhp_msg: add IPC based Bottom Half Processor --- sys/bhp/Kconfig | 5 ++ sys/bhp/Makefile.dep | 4 ++ sys/bhp/Makefile.include | 1 + sys/bhp/msg.c | 37 ++++++++++++++ sys/include/bhp/msg.h | 106 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 153 insertions(+) create mode 100644 sys/bhp/msg.c create mode 100644 sys/include/bhp/msg.h diff --git a/sys/bhp/Kconfig b/sys/bhp/Kconfig index 2b9a5c7b59..aa4403069c 100644 --- a/sys/bhp/Kconfig +++ b/sys/bhp/Kconfig @@ -22,4 +22,9 @@ config MODULE_BHP_EVENT depends on MODULE_EVENT depends on MODULE_BHP +config MODULE_BHP_MSG + bool "Enable message based Bottom Half Processor implementation" + depends on MODULE_CORE_MSG + depends on MODULE_BHP + endmenu diff --git a/sys/bhp/Makefile.dep b/sys/bhp/Makefile.dep index dba0aebbb9..ba85a80fde 100644 --- a/sys/bhp/Makefile.dep +++ b/sys/bhp/Makefile.dep @@ -1,3 +1,7 @@ ifneq (,$(filter bhp_event,$(USEMODULE))) USEMODULE += event endif + +ifneq (,$(filter bhp_msg,$(USEMODULE))) + USEMODULE += core_msg +endif diff --git a/sys/bhp/Makefile.include b/sys/bhp/Makefile.include index 200c49238f..da43c0c8e0 100644 --- a/sys/bhp/Makefile.include +++ b/sys/bhp/Makefile.include @@ -1 +1,2 @@ PSEUDOMODULES += bhp_event +PSEUDOMODULES += bhp_msg diff --git a/sys/bhp/msg.c b/sys/bhp/msg.c new file mode 100644 index 0000000000..fe5da25bef --- /dev/null +++ b/sys/bhp/msg.c @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2022 HAW Hamburg + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup sys_bhp + * @{ + * + * @file + * @brief Message based Bottom Half Processor implementation + * + * @author José I. Alamos + * + * @} + */ +#include +#include "bhp/msg.h" + +void bhp_msg_init(bhp_msg_t *bhp_msg, bhp_cb_t cb, void *ctx) +{ + bhp_set_cb(&bhp_msg->bhp, cb, ctx); + bhp_msg->pid = KERNEL_PID_UNDEF; + bhp_msg->msg.type = BHP_MSG_BH_REQUEST; + bhp_msg->msg.content.ptr = &bhp_msg->bhp; +} + +void bhp_msg_isr_cb(void *bhp_msg_ctx) +{ + bhp_msg_t *bhp_msg = bhp_msg_ctx; + + assert(bhp_msg->pid != KERNEL_PID_UNDEF); + msg_send(&bhp_msg->msg, bhp_msg->pid); +} diff --git a/sys/include/bhp/msg.h b/sys/include/bhp/msg.h new file mode 100644 index 0000000000..e4acad17d2 --- /dev/null +++ b/sys/include/bhp/msg.h @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2022 HAW Hamburg + * + * This file is subject to the terms and conditions of the GNU Lesser General + * Public License v2.1. See the file LICENSE in the top level directory for more + * details. + */ + +/** + * @defgroup sys_bhp_msg Message based implementation of Bottom Half Processor + * @ingroup sys_bhp + * + * @note Offloading ISRs with messages is in general a terrible idea, + * because messages can be lost. Use it with care or prefer + * alternatives such as @ref sys_bhp_event. + * + * @brief Bottom Half Processor module for generic IRQ offloading using + * messages. + * @{ + * + * @author José I. Alamos + */ + +#ifndef BHP_MSG_H +#define BHP_MSG_H + +#include "msg.h" +#include "thread.h" +#include "bhp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief The message type to trigger Bottom Half Processing + */ +#define BHP_MSG_BH_REQUEST 0x1539 + +/** + * @brief Message based Bottom Half Processor descriptor + */ +typedef struct { + bhp_t bhp; /**< Bottom Half Processor descriptor */ + kernel_pid_t pid; /**< PID of the thread that process the Bottom Half Processor */ + msg_t msg; /**< Message containing the Bottom Half Processing request */ +} bhp_msg_t; + +/** + * @brief Init a Bottom Half Processor to be used with messages + * @post the target PID is set to @ref KERNEL_PID_UNDEF + * + * @param[in] bhp_msg The message based Bottom Half Processor descriptor + * @param[in] cb Bottom Half Processor callback + * @param[in] ctx Context of @p cb + */ +void bhp_msg_init(bhp_msg_t *bhp_msg, bhp_cb_t cb, void *ctx); + +/** + * @brief Message based Bottom Half Processor ISR callback + * To be called from ISR in order to trigger the Bottom Half Processor. + * This sends a message with type @ref BHP_MSG_BH_REQUEST to the + * target thread, which should process the event accordingly by calling + * @ref bhp_msg_handler. + * + * @note This function asserts that the target PID is valid. Therefore, make sure + * to call @ref bhp_msg_claim_thread beforehand. + * + * @param[in] bhp_msg_ctx Pointer to the message based Bottom Half Processor + * (@ref bhp_msg_t) + * Bottom Half Processor. + */ +void bhp_msg_isr_cb(void *bhp_msg_ctx); + +/** + * @brief Claim a thread with a message queue to be used as Bottom Half Processor. + * + * @param[in] bhp_msg The message based Bottom Half Processor descriptor + * @param[in] pid PID of the target thread + */ +static inline void bhp_msg_claim_thread(bhp_msg_t *bhp_msg, kernel_pid_t pid) +{ + bhp_msg->pid = pid; +} + +/** + * @brief Handle a Bottom Half Processor message with type @ref + * BHP_MSG_BH_REQUEST. + * This function will call @ref bhp_irq_handler internally. + * + * @note This function asserts that the message type is @ref BHP_MSG_BH_REQUEST. + * + * @param[in] msg Pointer to the Bottom Half Processor message. + */ +static inline void bhp_msg_handler(msg_t *msg) +{ + assert(msg->type == BHP_MSG_BH_REQUEST); + bhp_irq_handler(msg->content.ptr); +} + +#ifdef __cplusplus +} +#endif + +#endif /* BHP_MSG_H */ +/** @} */