23#if VSF_USE_KERNEL == ENABLED && defined(__EDA_GADGET__)
37#if VSF_KERNEL_CFG_SUPPORT_SYNC == ENABLED
39#if VSF_KERNEL_CFG_SUPPORT_BITMAP_EVENT == ENABLED
58VSF_CAL_SECTION(
".text.vsf.kernel.__vsf_eda_bmpevt_adapter_sync_evthander")
76#if __IS_COMPILER_GCC__
77# pragma GCC diagnostic push
78# pragma GCC diagnostic ignored "-Wcast-align"
79#elif __IS_COMPILER_LLVM__ || __IS_COMPILER_ARM_COMPILER_6__
80# pragma clang diagnostic push
81# pragma clang diagnostic ignored "-Wcast-align"
91 adapter_eda->eda.
fn.
evthandler = __vsf_eda_bmpevt_adapter_sync_evthander;
92 return __vsf_eda_bmpevt_adapter_eda_init(adapter_eda);
103 if (
sync->max_union.bits.manual_rst) {
111 .
init = __vsf_eda_bmpevt_adapter_sync_init,
112 .reset = __vsf_eda_bmpevt_adapter_sync_reset,
115VSF_CAL_SECTION(
".text.vsf.kernel.__vsf_eda_bmpevt_adapter_bmpevt_evthander")
134VSF_CAL_SECTION(
".text.vsf.kernel.__vsf_eda_bmpevt_adapter_bmpevt_init")
141 adapter_eda->eda.
fn.
evthandler = __vsf_eda_bmpevt_adapter_bmpevt_evthander;
142 return __vsf_eda_bmpevt_adapter_eda_init(adapter_eda);
145VSF_CAL_SECTION(
".text.vsf.kernel.__vsf_eda_bmpevt_adapter_bmpevt_reset")
155#if __IS_COMPILER_GCC__
156# pragma GCC diagnostic pop
157#elif __IS_COMPILER_LLVM__ || __IS_COMPILER_ARM_COMPILER_6__
158# pragma clang diagnostic pop
163 .
init = __vsf_eda_bmpevt_adapter_bmpevt_init,
164 .reset = __vsf_eda_bmpevt_adapter_bmpevt_reset,
185 cur_mask = this_ptr->value & pender->mask;
187 if (cur_mask == pender->mask) {
212 is_to_repoll = this_ptr->state.bits.is_to_repoll;
214 this_ptr->state.bits.is_polling =
false;
223 while (node !=
NULL) {
224 if (is_poll_event && this_ptr->state.bits.is_to_repoll) {
226 this_ptr->state.bits.is_to_repoll =
false;
227 __vsf_eda_bmpevt_post_evt(this_ptr, this_ptr->pending_list.head, evt);
245static
void __vsf_eda_bmpevt_cancel_start(
vsf_bmpevt_t *this_ptr)
250 this_ptr->state.bits.is_cancelling =
true;
257static
void __vsf_eda_bmpevt_poll_start(
vsf_bmpevt_t *this_ptr)
264 is_polling = this_ptr->state.bits.is_polling;
266 this_ptr->state.bits.is_to_repoll =
true;
268 this_ptr->state.bits.is_polling =
true;
273 __vsf_eda_bmpevt_post_evt(this_ptr, this_ptr->pending_list.head,
VSF_EVT_SYNC_POLL);
285 this_ptr->state.flag = 0;
287 this_ptr->cancelled_value = 0;
288 this_ptr->state.bits.adapter_count = adapter_count;
290 for (i = 0; i < this_ptr->state.bits.adapter_count; i++) {
291 adapter = this_ptr->adapters[i];
292 if (adapter !=
NULL) {
293 adapter->bmpevt_host = this_ptr;
295 adapter->
op->
init(adapter);
309 mask &= this_ptr->value;
311 this_ptr->value &= ~mask;
314 for (i = 0; i < this_ptr->state.bits.adapter_count; i++) {
315 adapter = this_ptr->adapters[i];
316 if ((mask & (1 << i)) && (adapter !=
NULL)) {
331 this_ptr->cancelled_value |= mask;
334 __vsf_eda_bmpevt_cancel_start(this_ptr);
344 this_ptr->value |= mask;
347 __vsf_eda_bmpevt_poll_start(this_ptr);
360 if (__vsf_eda_bmpevt_poll(this_ptr, pender)) {
373 if (pender->mask & this_ptr->cancelled_value) {
379 __vsf_eda_sync_set_timeout(eda,
timeout);
382 __vsf_eda_bmpevt_poll_start(this_ptr);
386#if __IS_COMPILER_LLVM__ || __IS_COMPILER_ARM_COMPILER_6__
387# pragma clang diagnostic push
388# pragma clang diagnostic ignored "-Wcast-align"
391#if __IS_COMPILER_GCC__
392# pragma GCC diagnostic push
393# pragma GCC diagnostic ignored "-Wcast-align"
407 eda = pender->eda_pending;
409#if VSF_KERNEL_CFG_EDA_SUPPORT_TIMER == ENABLED
411 __vsf_eda_bmpevt_remove_pender(this_ptr, pender);
416 if (this_ptr->cancelled_value && pender->mask) {
417 __vsf_eda_bmpevt_remove_pender(this_ptr, pender);
422 __vsf_eda_bmpevt_post_evt(this_ptr, eda->pending_node.next, evt);
424 if (__vsf_eda_bmpevt_poll(this_ptr, pender)) {
425 __vsf_eda_bmpevt_remove_pender(this_ptr, pender);
430 __vsf_eda_bmpevt_post_evt(this_ptr, eda->pending_node.next, evt);
435#if VSF_KERNEL_CFG_EDA_SUPPORT_TIMER == ENABLED
438 eda->flag.state.is_limitted =
false;
443#if __IS_COMPILER_LLVM__ || __IS_COMPILER_ARM_COMPILER_6__
444# pragma clang diagnostic pop
447#if __IS_COMPILER_GCC__
448# pragma GCC diagnostic pop
#define VSF_CAL_SECTION(__SEC_STR)
Definition __compiler.h:189
#define vsf_container_of(__ptr, __type, __member)
Definition __type.h:164
vsf_err_t
Definition __type.h:42
@ VSF_ERR_NONE
none error
Definition __type.h:44
@ VSF_ERR_NOT_READY
service not ready yet
Definition __type.h:43
@ VSF_ERR_FAIL
failed
Definition __type.h:51
bmpevt adapter with an internal eda
Definition vsf_eda.h:2086
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
const vsf_bmpevt_adapter_op_t * op
Definition vsf_eda.h:2069
Wait condition of a bitmap-event wait.
Definition vsf_eda.h:2104
uint32_t mask
Definition vsf_eda.h:2111
Bitmap-event group.
Definition vsf_eda.h:2129
The event-driven task (TCB); every VSF task is an eda at the bottom. Tasks share stacks and only occu...
Definition vsf_eda.h:1838
vsf_eda_evthandler_t evthandler
Definition vsf_eda.h:1853
Base sync IPC object; sem/mutex/trig/crit are built on it.
Definition vsf_eda.h:1964
eda with timer support (can use vsf_teda_set_timer() etc.); derived classes (task/pt/thread) inherit ...
Definition vsf_eda.h:1916
__le16 timeout
Definition ieee80211.h:94
#define NULL
Definition lvgl.h:26
unsigned char uint_fast8_t
Definition stdint.h:23
unsigned int uint_fast32_t
Definition stdint.h:27
Adapter mapping a nested vsf_bmpevt_t onto bitmap-event bits.
Definition vsf_eda.h:2342
vsf_bmpevt_adapter_eda_t vsf_bmpevt_t * bmpevt
Definition vsf_eda.h:2344
vsf_bmpevt_pender_t pender
Definition vsf_eda.h:2345
Adapter init/reset operations, mapping an IPC object (e.g. a semaphore) onto bitmap-event bits so one...
Definition vsf_eda.h:2047
vsf_err_t(* reset)(vsf_bmpevt_adapter_t *pthis)
Definition vsf_eda.h:2049
vsf_err_t(* init)(vsf_bmpevt_adapter_t *pthis)
Definition vsf_eda.h:2048
Adapter mapping a vsf_sync_t onto bitmap-event bits.
Definition vsf_eda.h:2331
vsf_bmpevt_adapter_eda_t vsf_sync_t * sync
Definition vsf_eda.h:2333
Definition vsf_list.h:888
void sync(void)
Definition vsf_linux_fs.c:2266
uintalu_t vsf_protect_t
Definition vsf_arch_abstraction.h:60
vsf_err_t vsf_eda_post_evt(vsf_eda_t *pthis, vsf_evt_t evt)
Post an event to an eda task.
Definition vsf_eda.c:935
vsf_eda_t * vsf_eda_get_cur(void)
Get the eda task currently being dispatched.
Definition vsf_eda.c:416
int16_t vsf_evt_t
Kernel event type.
Definition vsf_eda.h:1658
vsf_err_t vsf_eda_bmpevt_reset(vsf_bmpevt_t *pthis, uint_fast32_t mask)
Reset (clear) event bits of a bitmap event, resetting the bound adapters whose bits are cleared.
vsf_err_t vsf_eda_bmpevt_cancel(vsf_bmpevt_t *pthis, uint_fast32_t mask)
Cancel the pending tasks on a bitmap event whose mask intersects the given mask; they are woken with ...
@ VSF_EVT_SYNC_CANCEL
The pending sync IPC was cancelled (e.g. by vsf_eda_sync_cancel())
Definition vsf_eda.h:1583
@ VSF_EVT_SYNC
A pending sync IPC (semaphore/mutex/trigger/queue/bmpevt) was obtained.
Definition vsf_eda.h:1577
@ VSF_EVT_SYNC_POLL
Sync poll event (used by bmpevt polling)
Definition vsf_eda.h:1588
@ VSF_EVT_INIT
Received once when a task starts.
Definition vsf_eda.h:1541
@ VSF_EVT_TIMER
teda timer expired (only for teda tasks)
Definition vsf_eda.h:1569
#define VSF_BMPEVT_AND
bmpevt pender op value: the wait completes when all bits of the mask are set
Definition vsf_eda.h:2037
vsf_err_t vsf_eda_bmpevt_set(vsf_bmpevt_t *pthis, uint_fast32_t mask)
Set event bits of a bitmap event, polling the pending tasks.
const vsf_bmpevt_adapter_op_t vsf_eda_bmpevt_adapter_bmpevt_op
Adapter operation table vsf_bmpevt_adapter_op_t used to bind another bitmap event to a bitmap event.
vsf_err_t vsf_eda_bmpevt_init(vsf_bmpevt_t *pthis, uint_fast8_t adapter_count)
Initialize a bitmap event, initializing the bound adapters as well.
vsf_err_t vsf_eda_sync_decrease(vsf_sync_t *pthis, vsf_timeout_tick_t timeout)
Decrease a sync object, pending if the resource is not available.
vsf_err_t vsf_eda_bmpevt_pend(vsf_bmpevt_t *pthis, vsf_bmpevt_pender_t *pender, vsf_timeout_tick_t timeout)
Pend on a bitmap event until the masked bits are set (in OR or AND mode according to the pender confi...
VSF_KERNEL_TIMEOUT_TICK_T vsf_timeout_tick_t
Timeout type in system timer ticks: negative means wait forever, 0 means non-blocking try,...
Definition vsf_eda.h:1491
vsf_sync_reason_t vsf_eda_bmpevt_poll(vsf_bmpevt_t *pthis, vsf_bmpevt_pender_t *pender, vsf_evt_t evt)
Retrieve the result of a bitmap event pend from the wakeup event.
const vsf_bmpevt_adapter_op_t vsf_eda_bmpevt_adapter_sync_op
Adapter operation table vsf_bmpevt_adapter_op_t used to bind a sync object to a bitmap event.
#define vsf_eda_init(__eda,...)
Initialize an eda (event-driven task) and post VSF_EVT_INIT to it.
Definition vsf_eda.h:573
vsf_err_t __vsf_teda_cancel_timer(vsf_teda_t *pthis)
Cancel the pending timer of the given teda task.
vsf_sync_reason_t
Result of a sync wait, returned by the *_get_reason() APIs and thread IPC.
Definition vsf_eda.h:2262
@ VSF_SYNC_GET
Obtained.
Definition vsf_eda.h:2282
@ VSF_SYNC_FAIL
Failed/error.
Definition vsf_eda.h:2267
@ VSF_SYNC_CANCEL
Cancelled.
Definition vsf_eda.h:2287
@ VSF_SYNC_TIMEOUT
Timed out.
Definition vsf_eda.h:2272
@ VSF_SYNC_PENDING
Still waiting, retry.
Definition vsf_eda.h:2277
#define VSF_KERNEL_ASSERT
Definition vsf_kernel_cfg.h:32
void __vsf_dlist_add_to_tail_imp(vsf_dlist_t *this_ptr, vsf_dlist_node_t *node)
Definition vsf_list.c:210
void __vsf_dlist_remove_imp(vsf_dlist_t *this_ptr, vsf_dlist_node_t *node)
Definition vsf_list.c:290
#define vsf_dlist_init_node( __host_type, __member, __item_ptr)
Definition vsf_list.h:717
#define __vsf_dlist_get_host(__host_type, __member, __node_ptr)
Definition vsf_list.h:271
#define vsf_dlist_init(__list_ptr)
Definition vsf_list.h:702
#define vsf_protect_sched()
Lock the scheduler and return the previous status as vsf_protect_t.
Definition vsf_os.h:271
#define vsf_unprotect_sched(__prot)
Restore the scheduler lock status saved by vsf_protect_sched()
Definition vsf_os.h:283