I might need some help interpreting it. I have attached the output of printing dbg_trace_buffer inside gdb. I assume this is a circular buffer since the oldest timestamp seems to be in the middle?
I didn't explain this earlier, but the mma_sem semaphore is used for my EXTI interrupt handler to signal that new data is available for the main thread.
Any help reading this output is greatly appreciated. My first questions would be
* Is se_wtobjp the semaphore that woke the currently running thread, or is it the head of a pending semaphore list?
Let's start with the two entries at time se_time 3049. Do I interpret that the first one is saying: the lcd_thread is in state 3 (Waiting on a sem) and that the mma_sem has been signaled at this point? Then the second entry is back to the idle thread, but se_wtobjp is now the update_lcd_sem semaphore. I'm not sure what this means in the context of the idle thread.
It then seems like at se_time 3072 the main thread runs (collecting data on I2C bus 2), then ~20ms later the lcd_thread runs at se_time 3091. This agrees with the logic analyzer output but I still don't know why it didn't context switch before then.
Code: Select all
tb_size = 64 ,
tb_ptr = 0x2000165c <dbg_trace_buffer+168> ,
tb_buffer = { {
se_time = 3094 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3094 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3095 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3095 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3095 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3095 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3095 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000'
}
, {
se_time = 3095 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3095 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3095 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x20001cc8 <update_lcd_sem> , se_state = 3 '\003' }
, {
se_time = 3030 , se_tp = 0x20001588 <mainthread> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3030 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3030 , se_tp = 0x20001588 <mainthread> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3030 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3048 , se_tp = 0x20001588 <mainthread> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3049 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x20001ac0 <mma_sem> , se_state = 3 '\003' }
, {
se_time = 3049 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x20001cc8 <update_lcd_sem> , se_state = 3 '\003' }
, {
se_time = 3072 , se_tp = 0x20001588 <mainthread> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3072 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3072 , se_tp = 0x20001588 <mainthread> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3072 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3090 , se_tp = 0x20001588 <mainthread> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3091 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x20001ac0 <mma_sem> , se_state = 3 '\003' }
, {
se_time = 3091 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3091 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3091 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3091 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3091 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3091 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3091 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3091 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3091 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3091 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3091 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3091 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3092 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3092 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3092 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3092 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3092 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3092 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3092 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3092 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3092 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3092 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3092 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3093 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3093 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3093 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3093 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3093 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3093 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3093 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3093 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3093 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3093 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3094 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3094 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3094 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3094 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3094 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3094 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
, {
se_time = 3094 , se_tp = 0x20001ce0 <lcd_thread_working_area> ,
se_wtobjp = 0x0 , se_state = 0 '\000' }
, {
se_time = 3094 , se_tp = 0x200014c8 <_idle_thread_wa> ,
se_wtobjp = 0x0 , se_state = 2 '\002' }
} }