mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
sys/bhp_msg: add IPC based Bottom Half Processor
This commit is contained in:
parent
2d4f239d18
commit
8cf53fc8ab
@ -22,4 +22,9 @@ config MODULE_BHP_EVENT
|
|||||||
depends on MODULE_EVENT
|
depends on MODULE_EVENT
|
||||||
depends on MODULE_BHP
|
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
|
endmenu
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
ifneq (,$(filter bhp_event,$(USEMODULE)))
|
ifneq (,$(filter bhp_event,$(USEMODULE)))
|
||||||
USEMODULE += event
|
USEMODULE += event
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifneq (,$(filter bhp_msg,$(USEMODULE)))
|
||||||
|
USEMODULE += core_msg
|
||||||
|
endif
|
||||||
|
@ -1 +1,2 @@
|
|||||||
PSEUDOMODULES += bhp_event
|
PSEUDOMODULES += bhp_event
|
||||||
|
PSEUDOMODULES += bhp_msg
|
||||||
|
37
sys/bhp/msg.c
Normal file
37
sys/bhp/msg.c
Normal file
@ -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 <jose.alamos@haw-hamburg.de>
|
||||||
|
*
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#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);
|
||||||
|
}
|
106
sys/include/bhp/msg.h
Normal file
106
sys/include/bhp/msg.h
Normal file
@ -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 <jose.alamos@haw-hamburg.de>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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 */
|
||||||
|
/** @} */
|
Loading…
Reference in New Issue
Block a user