From 058fa4e49335fd5f08763d97b1d34a9a2712f34e Mon Sep 17 00:00:00 2001 From: Peter Mitsis Date: Tue, 25 Oct 2016 14:42:30 -0400 Subject: [PATCH] unified: API changes to event handling Allows event objects to pend signals in a cumulative way using the semaphore in a non-binary way. Jira: ZEP-928 Change-Id: I3ce8a075ef89309118596ec5781c15d4f3289d34 Signed-off-by: Peter Mitsis --- include/kernel.h | 14 +++++++++----- include/legacy.h | 2 +- kernel/unified/alert.c | 9 ++++++--- scripts/sysgen | 2 +- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/include/kernel.h b/include/kernel.h index 4f3265d05d9..b6c2977d2c0 100644 --- a/include/kernel.h +++ b/include/kernel.h @@ -1391,12 +1391,12 @@ struct k_alert { extern void _alert_deliver(struct k_work *work); -#define K_ALERT_INITIALIZER(obj, alert_handler) \ +#define K_ALERT_INITIALIZER(obj, alert_handler, max_num_pending_alerts) \ { \ .handler = (k_alert_handler_t)alert_handler, \ .send_count = ATOMIC_INIT(0), \ .work_item = K_WORK_INITIALIZER(_alert_deliver), \ - .sem = K_SEM_INITIALIZER(obj.sem, 0, 1), \ + .sem = K_SEM_INITIALIZER(obj.sem, 0, max_num_pending_alerts), \ _DEBUG_TRACING_KERNEL_OBJECTS_INIT \ } @@ -1411,11 +1411,13 @@ extern void _alert_deliver(struct k_work *work); * * @param name Alert name * @param alert_handler Handler to invoke after the delivery of the alert + * @param max_num_pending_alerts Maximum number of concurrent pending alerts */ -#define K_ALERT_DEFINE(name, alert_handler) \ +#define K_ALERT_DEFINE(name, alert_handler, max_num_pending_alerts) \ struct k_alert name \ __in_section(_k_event_list, alert, name) = \ - K_ALERT_INITIALIZER(name, alert_handler) + K_ALERT_INITIALIZER(name, alert_handler, \ + max_num_pending_alerts) /** * @brief Initialize an alert object. @@ -1425,10 +1427,12 @@ extern void _alert_deliver(struct k_work *work); * * @param alert Pointer to the alert object * @param handler Routine to invoke after delivery of alert + * @param max_num_pending_alerts Maximum number of concurrent pending alerts * * @return N/A */ -extern void k_alert_init(struct k_alert *alert, k_alert_handler_t handler); +extern void k_alert_init(struct k_alert *alert, k_alert_handler_t handler, + unsigned int max_num_pending_alerts); /** * @brief Receive an alert diff --git a/include/legacy.h b/include/legacy.h index 87e7b023927..c53dee09020 100644 --- a/include/legacy.h +++ b/include/legacy.h @@ -1515,7 +1515,7 @@ static inline int task_event_recv(kevent_t legacy_event, int32_t timeout) * @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); \ + K_ALERT_DEFINE(_k_event_obj_##name, event_handler, 1); \ struct k_alert * const name = &(_k_event_obj_##name) /* memory maps */ diff --git a/kernel/unified/alert.c b/kernel/unified/alert.c index 35b404be1ec..3885165142c 100644 --- a/kernel/unified/alert.c +++ b/kernel/unified/alert.c @@ -44,14 +44,17 @@ void _alert_deliver(struct k_work *work) } } -void k_alert_init(struct k_alert *alert, k_alert_handler_t handler) +void k_alert_init(struct k_alert *alert, k_alert_handler_t handler, + unsigned int max_num_pending_alerts) { - const struct k_work my_work_item = { NULL, _alert_deliver, { 1 } }; + const struct k_work my_work_item = { + NULL, _alert_deliver, { max_num_pending_alerts } + }; alert->handler = handler; alert->send_count = ATOMIC_INIT(0); alert->work_item = my_work_item; - k_sem_init(&alert->sem, 0, 1); + k_sem_init(&alert->sem, 0, max_num_pending_alerts); SYS_TRACING_OBJ_INIT(micro_event, alert); } diff --git a/scripts/sysgen b/scripts/sysgen index dfc58c905bc..dbd61926fe1 100755 --- a/scripts/sysgen +++ b/scripts/sysgen @@ -618,7 +618,7 @@ def kernel_main_c_events(): if kernel_type == 'micro': kernel_main_c_out("DEFINE_EVENT(%s, %s);\n" % (event[0], event[1])) else: - kernel_main_c_out("K_ALERT_DEFINE(_k_event_obj_%s, %s);\n" % + kernel_main_c_out("K_ALERT_DEFINE(_k_event_obj_%s, %s, 1);\n" % (event[0], event[1])) def kernel_main_c_mutexes():