On 04/10/2018 15:33, Catalin Demergian wrote:
I eliminated the theory of memory corruption. I debugged and found we set Wait.flags = 0x104 with a function call. The USB interrupt can arrive at any time, so Wait.flags can be either INTEND_TO_BLOCK, BLOCKED or READY_AGAIN.

Following the logic in _Event_Surrender:
If it arrives when Wait.flags = INTEND_TO_BLOCK

Are the flags == 0x101? In this case the thread is in the middle of _Event_Seize()

then _Thread_Wait_flags_try_change_critical will return TRUE, Wait.flags will be set to READY_AGAIN,
unblock = FALSE so _Thread_Unblock will not be called.

The unblock is done in _Event_Seize() in this case:

  success = _Thread_Wait_flags_try_change_acquire(
    executing,
    intend_to_block,
    wait_class | THREAD_WAIT_STATE_BLOCKED
  );

The success == false in this case.

Then all the other USB interrupts will catch Wait.flags = READY_AGAIN and in this case_Event_Surrender doesn't do anything because unblock = FALSE

.. so the task never runs again, but state remains marked as READY.
is this a bug ? or I'm not understanding correctly?

There could be a synchronization issue with the wait flag or the interrupt disable/enable sequence.

There was a severe bug on the ARMv7-M in this area, but it is fixed in the 4.11.2 release:

https://git.rtems.org/rtems/commit/?h=4.11&id=7e91901303219f10cf865906931c07c31d2e37f4

--
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

Reply via email to