rtems_message_queue_receive / rtems_event_receive issues

Sebastian Huber sebastian.huber at embedded-brains.de
Wed Oct 24 10:00:18 UTC 2018



On 24/10/2018 11:10, Catalin Demergian wrote:
> Hi,
> I made a debug patch with some changes 
> in _Scheduler_priority_Ready_queue_enqueue
>
>   if(tcb->Object.id == 0x0a010005)
> cnt_before = _Chain_Node_count_unprotected(ready_chain);
>   _Chain_Append_unprotected( ready_chain, node );
>   if(tcb->Object.id == 0x0a010005) {
> cnt_after = _Chain_Node_count_unprotected(ready_chain);
> if(cnt_after != cnt_before + 1)
> append_errs++;
>   }
>   _Priority_bit_map_Add( bit_map, &ready_queue->Priority_map );
>
> I wanted to know if _Chain_Append_unprotected fails when adding my 
> SCrx task in the ready queue. Since it's a void
> function, I used _Chain_Node_count_unprotected to test if the counter 
> after the insert is the count before + 1.
>
> The task command shows 2 ready tasks, but ready_queue_100_elems=1
> (in ready_queue_100_elems I'm saving what 
> _Chain_Node_count_unprotected returns for ready_queues[100])
> Also, append_errs=1, which means that at some point there was an 
> insert failure.
>
> [/] # task
>   ID       NAME           PRI  STATE MODES  EVENTS    WAITID  WAITARG  
> NOTES
> ------------------------------------------------------------------------------
> 0a010001   UI1              1 Wevnt  P:T:nA   NONE   2002b0a4 0x80000000
> 0a010002   LOGT            99 Wmsg   P:T:nA   NONE   22010001 0x80000000
> 0a010003   ntwk           100 Wsysev P:T:nA   NONE   2005e43c 0x80000000
> 0a010004   SCtx           100 Wsysev P:T:nA   NONE   2005ff6c 0x80000000
> 0a010005   SCrx           100 READY  P:T:nA 08000000 20060fbc 0x80000000
> 0a010006   SHLL           100 READY  P:T:nA   NONE   00000001 0x80000000
> [/] #
> [/] #
> [/] #
> [/] # i
> Instruction count for the last second is 215993000.
> CPU load is 99.99%.
> intr_cnt=125916
> cond1=0
> cond2=1
> jiffies=62980862
> dbg_ready_UI1=288379
> dbg_ready_LOGT=374942
> dbg_ready_ntwk=62980798317434
> dbg_ready_SCtx=62980515317452
> dbg_ready_SCrx=8947511142891
> dbg_ready_SHLL=62980853317438
> dbg_extract_UI1=67129036
> dbg_extract_LOGT=67147087
> dbg_extract_ntwk=62980798327798
> dbg_extract_SCtx=62980515326397
> dbg_extract_SCrx=8947511124432
> dbg_extract_SHLL=62980852322225
> append_errs=1
> ready_queue_100_elems=1
> [/] #
>
> My theory is that because the SCrx task is in a funny state where 
> current_state=READY, but it's not in the ready queue because
> of the insert failure, it will never be scheduled again because no 
> matter how many USB interrupts may arrive, unblock will be set to FALSE
> in _Event_Surrender because the state is READY 
> so _Event_Is_blocking_on_event returns FALSE.
>
> Could this theory be valid ?

Yes, this sounds valid. It fits also into the assertion failure reported 
in one of your previous e-mails.

Can you set a break point to the

   append_errs++;

line? A stack trace would be helpful. I would also have a look at the 
chain data structures.

I would add an extra debug state to the thread control block to ensure 
that you don't have a double insert/extract into the ready queue.

-- 
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.huber at embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.




More information about the users mailing list