On 12/10/2018 10:40, Catalin Demergian wrote:
Hi,
I still think it would be worth to try the latest RTEMS master just to
make sure we don't search a bug which is already fixed. Also RTEMS 5 has
more assertions in the debug configuration.
-> is RTEMS 5 stable branch or development ?
It is the development branch of RTEMS. Most of the time it is stable.
-> what is the link for RTEMS master (where to do a git clone from) ?
git://git.rtems.org/rtems.git
I have a theory of what may be going on, please let me know if you
think it's valid.
1. let's say Wait.flags = THREAD_WAIT_CLASS_EVENT
| THREAD_WAIT_STATE_INTEND_TO_BLOCK
and state = STATES_WAITING_FOR_EVENT because they are set this way
in _Event_Seize
2. USB ISR arrives, so we go in _Event_Surrender where
success = _Thread_Wait_flags_try_change_critical(
the_thread,
wait_class | THREAD_WAIT_STATE_INTEND_TO_BLOCK,
ready_again
);
will return TRUE, because the expected flags was intend to block,
so Wait.flags will become THREAD_WAIT_CLASS_EVENT
| THREAD_WAIT_STATE_READY_AGAIN
3. _Event_Seize continues execution with
success = _Thread_Wait_flags_try_change(
executing,
intend_to_block,
wait_class | THREAD_WAIT_STATE_BLOCKED
);
and success will be FALSE because Wait.flags is not
THREAD_WAIT_STATE_INTEND_TO_BLOCK anymore, so _Thread_Unblock will get
called
and eventually _States_Clear will put state = STATES_READY.
Yes, and the _Thread_Unblock() will result in a call to
_Scheduler_Unblock(). This adds the thread to the set of ready threads
and it will execute as soon it is the highest priority ready thread.
4. _Thread_Dispatch_enable will be called in _Event_Seize, but
another task is selected to run (I have 4 tasks with the same
priority, my task doesn't have a smaller
priority, it's not necessarily made the heir task)
5. Another USB ISR arrives; this time we enter _Event_Surrender with
state = STATES_READY and Wait.flags = THREAD_WAIT_CLASS_EVENT
| THREAD_WAIT_STATE_READY_AGAIN,
so we go on the else branch, setting unblock = FALSE, not
calling _Thread_Unblock from _Event_Surrender.
6. basically no matter how many USB ISRs will arrive, the same
scenario from step 5 repeats ... no one will call _Thread_Unblock for
SCrx again !
Also, when entering task command in the shell it shows the task
as ready (because it is) and the USB event set.
Once the thread is in the set of ready threads managed by the scheduler
another call to _Thread_Unblock() is unnecessary.
--
Sebastian Huber, embedded brains GmbH
Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone : +49 89 189 47 41-16
Fax : +49 89 189 47 41-09
E-Mail : sebastian.hu...@embedded-brains.de
PGP : Public key available on request.
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
_______________________________________________
users mailing list
users@rtems.org
http://lists.rtems.org/mailman/listinfo/users