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