VSF Documented
vsf_simple_bmpevt.h
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright(C)2009-2022 by VSF Team *
3 * *
4 * Licensed under the Apache License, Version 2.0 (the "License"); *
5 * you may not use this file except in compliance with the License. *
6 * You may obtain a copy of the License at *
7 * *
8 * http://www.apache.org/licenses/LICENSE-2.0 *
9 * *
10 * Unless required by applicable law or agreed to in writing, software *
11 * distributed under the License is distributed on an "AS IS" BASIS, *
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13 * See the License for the specific language governing permissions and *
14 * limitations under the License. *
15 * *
16 ****************************************************************************/
17
18#ifndef __VSF_KERNEL_SHELL_SIMPLE_BMEVT_H__
19#define __VSF_KERNEL_SHELL_SIMPLE_BMEVT_H__
20
21/*============================ INCLUDES ======================================*/
23
24#if VSF_KERNEL_USE_SIMPLE_SHELL == ENABLED \
25 && VSF_KERNEL_CFG_SUPPORT_BITMAP_EVENT == ENABLED \
26 && VSF_USE_KERNEL == ENABLED \
27 && VSF_KERNEL_CFG_SUPPORT_SYNC == ENABLED
28
29#include "../../vsf_eda.h"
30
31#ifdef __cplusplus
32extern "C" {
33#endif
34
35/*============================ MACROS ========================================*/
36/*============================ MACROFIED FUNCTIONS ===========================*/
37
55# define using_grouped_evt vsf_bmpevt_pender_t pender
56
57# define __declare_grouped_evts(__name) \
58 typedef vsf_bmpevt_t __name; \
59 typedef enum enum_of_##__name enum_of_##__name;
60
77# define declare_grouped_evts(__name) __declare_grouped_evts(__name)
78
79# define __def_grouped_evts(__name) \
80 enum enum_of_##__name{ \
81 __##__name##_start = __COUNTER__ + 1,
82
83
84# define __end_def_grouped_evts(__name) \
85 all_evts_msk_of_##__name = \
86 ((uint64_t)1<<(__COUNTER__ - __##__name##_start)) - 1, \
87 };
99# define end_def_grouped_evts(__name) __end_def_grouped_evts(__name)
100
101# define __def_evt(__name, __evt) \
102 __evt##_idx = __COUNTER__ - __##__name##_start, \
103 __evt##_msk = (uint32_t)(1<<(__evt##_idx))
122# define def_evt(__name, __evt) __def_evt(__name, __evt)
123
143# define def_adapter(__name, __evt) __def_evt(__name, __evt)
144
161# define def_grouped_evts(__name) \
162 __def_grouped_evts(__name)
163
164
165# define __implement_grouped_evts(__name, ...) \
166 static const vsf_bmpevt_adapter_t *__adapters_of_##__name[] = { \
167 __VA_ARGS__ \
168 };
169
188# define implement_grouped_evts(__name, ...) \
189 __implement_grouped_evts(__name, __VA_ARGS__)
190
214# define add_sync_adapter(__SYNC, __MSK, ...) \
215 &((vsf_bmpevt_adapter_sync_t){ \
216 .sync = (__SYNC), \
217 .use_as__vsf_bmpevt_adapter_eda_t.use_as__vsf_bmpevt_adapter_t = { \
218 .mask = (__MSK), \
219 .op = &vsf_eda_bmpevt_adapter_sync_op, \
220 }, \
221 __VA_ARGS__ \
222 }.use_as__vsf_bmpevt_adapter_eda_t.use_as__vsf_bmpevt_adapter_t)
223
224
225
226# define __init_grouped_evts(__name, __evt_group, __auto_reset) \
227 __vsf_grouped_evts_init((__evt_group), \
228 (vsf_bmpevt_adapter_t **)&(__adapters_of_##__name), \
229 dimof(__adapters_of_##__name), \
230 (__auto_reset))
231
247# define init_grouped_evts(__name, __evt_group, __auto_reset) \
248 __init_grouped_evts(__name, __evt_group, (__auto_reset))
249
250# define __grouped_evts_info(__name) __grouped_evts_##__name##_info
261# define grouped_evts_info(__name) __grouped_evts_info(__name)
262# define __grouped_evts_adapter(__name, __INDEX) \
263 __adapters_of_##__name[(__INDEX)]
277# define grouped_evts_adapter(__name, __INDEX) \
278 __grouped_evts_adapter(__name, (__INDEX))
279
280
310# define wait_for_all_timeout(__group, __msk, __timeout) \
311 vsf_this.pender.mask = (__msk); \
312 vsf_this.pender.op = VSF_BMPEVT_AND; \
313 for ( vsf_sync_reason_t reason = VSF_SYNC_CANCEL; \
314 reason == VSF_SYNC_CANCEL;) \
315 if ((reason = __vsf_bmpevt_wait_for( \
316 (__group), \
317 (vsf_bmpevt_pender_t *) \
318 &vsf_this.pender, (__timeout)), \
319 (reason == VSF_SYNC_GET || reason == VSF_SYNC_TIMEOUT)))
320
352# define wait_for_all_timeout_ms(__group, __msk, __timeout) \
353 wait_for_all_timeout( __group, \
354 (__msk), \
355 vsf_systimer_ms_to_tick(__timeout))
356
388# define wait_for_all_timeout_us(__group, __msk, __timeout) \
389 wait_for_all_timeout( __group, \
390 (__msk), \
391 vsf_systimer_us_to_tick(__timeout))
392
414# define wait_for_all(__group, __msk) \
415 wait_for_all_timeout( __group, (__msk), -1)
416
446# define wait_for_any_timeout(__group, __msk, __timeout) \
447 vsf_this.pender.mask = (__msk); \
448 vsf_this.pender.op = VSF_BMPEVT_OR; \
449 for ( vsf_sync_reason_t reason = VSF_SYNC_CANCEL; \
450 reason == VSF_SYNC_CANCEL;) \
451 if ((reason = __vsf_bmpevt_wait_for( \
452 (__group), \
453 (vsf_bmpevt_pender_t *) \
454 &vsf_this.pender, (__timeout)), \
455 (reason == VSF_SYNC_GET || reason == VSF_SYNC_TIMEOUT)))
456
488# define wait_for_any_timeout_ms(__group, __msk, __timeout) \
489 wait_for_any_timeout( __group, \
490 (__msk), \
491 vsf_systimer_ms_to_tick(__timeout))
492
524# define wait_for_any_timeout_us(__group, __msk, __timeout) \
525 wait_for_any_timeout( __group, \
526 (__msk), \
527 vsf_systimer_us_to_tick(__timeout))
528
550# define wait_for_any(__group, __msk) \
551 wait_for_any_timeout( __group, (__msk), -1)
552
575# define wait_for_one(__group, __msk) \
576 wait_for_any((__group), (__msk))
577
608# define wait_for_one_timeout(__group, __msk, __timeout) \
609 wait_for_any_timeout((__group), (__msk), (__timeout))
610
643# define wait_for_one_timeout_ms(__group, __msk, __timeout) \
644 wait_for_any_timeout_ms((__group), (__msk), (__timeout))
645
678# define wait_for_one_timeout_us(__group, __msk, __timeout) \
679 wait_for_any_timeout_us((__group), (__msk), (__timeout))
680
693# define reset_grouped_evts(__group, __msk) \
694 vsf_eda_bmpevt_reset((__group),(__msk))
695
709# define set_grouped_evts(__group, __msk) \
710 vsf_eda_bmpevt_set((__group),(__msk))
711
712
713/*============================ TYPES =========================================*/
714/*============================ GLOBAL VARIABLES ==============================*/
715/*============================ LOCAL VARIABLES ===============================*/
716/*============================ PROTOTYPES ====================================*/
717
718VSF_CAL_SECTION(".text.vsf.kernel.__vsf_grouped_evts_init")
742extern void __vsf_grouped_evts_init( vsf_bmpevt_t *this_ptr,
743 vsf_bmpevt_adapter_t **adapters_pptr,
744 uint_fast8_t adapter_count,
745 uint_fast32_t auto_reset);
746
747VSF_CAL_SECTION(".text.vsf.kernel.__vsf_bmpevt_wait_for")
777 vsf_bmpevt_t *bmpevt_ptr,
778 const vsf_bmpevt_pender_t *pender_ptr,
779 int_fast32_t time_out);
780
781#ifdef __cplusplus
782}
783#endif
784
785#endif
786#endif
787/* EOF */
#define VSF_CAL_SECTION(__SEC_STR)
Definition __compiler.h:189
Adapter mapping an IPC object (e.g. a semaphore) onto bitmap-event bits, so one task can wait on mult...
Definition vsf_eda.h:2062
Wait condition of a bitmap-event wait.
Definition vsf_eda.h:2104
Bitmap-event group.
Definition vsf_eda.h:2129
unsigned char uint_fast8_t
Definition stdint.h:23
unsigned int uint_fast32_t
Definition stdint.h:27
int int_fast32_t
Definition stdint.h:26
vsf_sync_reason_t
Result of a sync wait, returned by the *_get_reason() APIs and thread IPC.
Definition vsf_eda.h:2262
void __vsf_grouped_evts_init(vsf_bmpevt_t *this_ptr, vsf_bmpevt_adapter_t **adapters_pptr, uint_fast8_t adapter_count, uint_fast32_t auto_reset)
Low-level initialization helper backing the init_grouped_evts() macro.
Definition vsf_simple_bmpevt.c:124
vsf_sync_reason_t __vsf_bmpevt_wait_for(vsf_bmpevt_t *bmpevt_ptr, const vsf_bmpevt_pender_t *pender_ptr, int_fast32_t time_out)
Low-level bitmap-event wait helper backing the wait_for_one()/ wait_for_any()/wait_for_all() statemen...
Definition vsf_simple_bmpevt.c:79
Generated from commit: vsfteam/vsf@a5104db