diff --git a/src/ipc.c b/src/ipc.c index d97fa1d35a..b6bf08770d 100644 --- a/src/ipc.c +++ b/src/ipc.c @@ -1770,6 +1770,7 @@ rt_err_t rt_event_send(rt_event_t event, rt_uint32_t set) rt_base_t level; rt_base_t status; rt_bool_t need_schedule; + rt_uint32_t need_clear_set = 0; /* parameter check */ RT_ASSERT(event != RT_NULL); @@ -1833,7 +1834,7 @@ rt_err_t rt_event_send(rt_event_t event, rt_uint32_t set) { /* clear event */ if (thread->event_info & RT_EVENT_FLAG_CLEAR) - event->set &= ~thread->event_set; + need_clear_set |= thread->event_set; /* resume thread, and thread list breaks out */ rt_thread_resume(thread); @@ -1843,6 +1844,10 @@ rt_err_t rt_event_send(rt_event_t event, rt_uint32_t set) need_schedule = RT_TRUE; } } + if (need_clear_set) + { + event->set &= ~need_clear_set; + } } /* enable interrupt */