@@ -43,13 +43,9 @@ osEventFlagsId_t osEventFlagsNew(const osEventFlagsAttr_t *attr)
4343 return NULL ;
4444 }
4545 memset (events , 0 , sizeof (struct cmsis_rtos_event_cb ));
46- events -> is_cb_dynamic_allocation = attr -> cb_mem == NULL ;
47-
48- k_poll_signal_init (& events -> poll_signal );
49- k_poll_event_init (& events -> poll_event , K_POLL_TYPE_SIGNAL , K_POLL_MODE_NOTIFY_ONLY ,
50- & events -> poll_signal );
51- events -> signal_results = 0U ;
5246
47+ k_event_init (& events -> z_event );
48+ events -> is_cb_dynamic_allocation = (attr -> cb_mem == NULL );
5349 events -> name = (attr -> name == NULL ) ? init_event_flags_attrs .name : attr -> name ;
5450
5551 return (osEventFlagsId_t )events ;
@@ -61,19 +57,13 @@ osEventFlagsId_t osEventFlagsNew(const osEventFlagsAttr_t *attr)
6157uint32_t osEventFlagsSet (osEventFlagsId_t ef_id , uint32_t flags )
6258{
6359 struct cmsis_rtos_event_cb * events = (struct cmsis_rtos_event_cb * )ef_id ;
64- unsigned int key ;
65-
6660 if ((ef_id == NULL ) || (flags & osFlagsError )) {
6761 return osFlagsErrorParameter ;
6862 }
6963
70- key = irq_lock ();
71- events -> signal_results |= flags ;
72- irq_unlock (key );
64+ k_event_post (& events -> z_event , flags );
7365
74- k_poll_signal_raise (& events -> poll_signal , DONT_CARE );
75-
76- return events -> signal_results ;
66+ return k_event_test (& events -> z_event , 0xFFFFFFFF );
7767}
7868
7969/**
@@ -82,19 +72,16 @@ uint32_t osEventFlagsSet(osEventFlagsId_t ef_id, uint32_t flags)
8272uint32_t osEventFlagsClear (osEventFlagsId_t ef_id , uint32_t flags )
8373{
8474 struct cmsis_rtos_event_cb * events = (struct cmsis_rtos_event_cb * )ef_id ;
85- unsigned int key ;
86- uint32_t sig ;
75+ uint32_t rv ;
8776
8877 if ((ef_id == NULL ) || (flags & osFlagsError )) {
8978 return osFlagsErrorParameter ;
9079 }
9180
92- key = irq_lock ();
93- sig = events -> signal_results ;
94- events -> signal_results &= ~(flags );
95- irq_unlock (key );
81+ rv = k_event_test (& events -> z_event , 0xFFFFFFFF );
82+ k_event_clear (& events -> z_event , flags );
9683
97- return sig ;
84+ return rv ;
9885}
9986
10087/**
@@ -104,101 +91,44 @@ uint32_t osEventFlagsWait(osEventFlagsId_t ef_id, uint32_t flags, uint32_t optio
10491 uint32_t timeout )
10592{
10693 struct cmsis_rtos_event_cb * events = (struct cmsis_rtos_event_cb * )ef_id ;
107- int retval , key ;
108- uint32_t sig ;
109- k_timeout_t poll_timeout ;
110- uint64_t time_stamp_start , ticks_elapsed ;
111- bool flags_are_set ;
112-
113- /* Can be called from ISRs only if timeout is set to 0 */
114- if (timeout > 0 && k_is_in_isr ()) {
94+ uint32_t rv ;
95+ k_timeout_t event_timeout ;
96+
97+ /*
98+ * Return unknown error if called from ISR with a non-zero timeout
99+ * or if flags is zero.
100+ */
101+ if ((( timeout > 0U ) && k_is_in_isr ()) || ( flags == 0U )) {
115102 return osFlagsErrorUnknown ;
116103 }
117104
118105 if ((ef_id == NULL ) || (flags & osFlagsError )) {
119106 return osFlagsErrorParameter ;
120107 }
121108
122- time_stamp_start = (uint64_t )k_uptime_ticks ();
123-
124- for (;;) {
125-
126- flags_are_set = false;
127-
128- key = irq_lock ();
129-
130- if (options & osFlagsWaitAll ) {
131- /* Check if all events we are waiting on have
132- * been signalled
133- */
134- if ((events -> signal_results & flags ) == flags ) {
135- flags_are_set = true;
136- }
137- } else {
138- /* Check if any of events we are waiting on have
139- * been signalled
140- */
141- if (events -> signal_results & flags ) {
142- flags_are_set = true;
143- }
144- }
145-
146- if (flags_are_set ) {
147- sig = events -> signal_results ;
148-
149- if (!(options & osFlagsNoClear )) {
150- /* Clear signal flags as the thread is ready now */
151- events -> signal_results &= ~(flags );
152- }
153-
154- irq_unlock (key );
155-
156- break ;
157- }
158-
159- /* Reset the states to facilitate the next trigger */
160- events -> poll_event .signal -> signaled = 0U ;
161- events -> poll_event .state = K_POLL_STATE_NOT_READY ;
162-
163- irq_unlock (key );
164-
165- if (timeout == 0 ) {
166- return osFlagsErrorTimeout ;
167- } else if (timeout == osWaitForever ) {
168- poll_timeout = Z_FOREVER ;
169- } else {
170- /* If we need to wait on more signals, we need to
171- * adjust the timeout value accordingly based on
172- * the time that has already elapsed.
173- */
174- ticks_elapsed = (uint64_t )k_uptime_ticks () - time_stamp_start ;
175-
176- if (ticks_elapsed < (uint64_t )timeout ) {
177- poll_timeout = Z_TIMEOUT_TICKS (
178- (k_ticks_t )(timeout - (uint32_t )ticks_elapsed ));
179- } else {
180- return osFlagsErrorTimeout ;
181- }
182- }
183-
184- retval = k_poll (& events -> poll_event , 1 , poll_timeout );
185-
186- if (retval == - EAGAIN ) {
187- /* k_poll signaled timeout. */
188- return osFlagsErrorTimeout ;
189- } else if (retval != 0 ) {
190- return osFlagsErrorUnknown ;
191- }
192-
193- /* retval is zero.
194- * k_poll found some raised signal then loop again and check flags.
195- */
196- __ASSERT (events -> poll_event .state == K_POLL_STATE_SIGNALED ,
197- "event state not signalled!" );
198- __ASSERT (events -> poll_event .signal -> signaled == 1U , "event signaled is not 1" );
199- }
200-
201- return sig ;
109+ if (timeout == osWaitForever ) {
110+ event_timeout = K_FOREVER ;
111+ } else if (timeout == 0U ) {
112+ event_timeout = K_NO_WAIT ;
113+ } else {
114+ event_timeout = K_TICKS (timeout );
115+ }
116+
117+ if ((options & osFlagsWaitAll ) != 0 ) {
118+ rv = k_event_wait_all (& events -> z_event , flags , false, event_timeout );
119+ } else {
120+ rv = k_event_wait (& events -> z_event , flags , false, event_timeout );
121+ }
122+
123+ if ((options & osFlagsNoClear ) == 0 ) {
124+ k_event_clear (& events -> z_event , flags );
125+ }
126+
127+ if (rv != 0U ) {
128+ return rv ;
129+ }
130+
131+ return (timeout == 0U ) ? osFlagsErrorResource : osFlagsErrorTimeout ;
202132}
203133
204134/**
@@ -226,7 +156,7 @@ uint32_t osEventFlagsGet(osEventFlagsId_t ef_id)
226156 return 0 ;
227157 }
228158
229- return events -> signal_results ;
159+ return k_event_test ( & events -> z_event , 0xFFFFFFFF ) ;
230160}
231161
232162/**
0 commit comments