evk1000 2-way range code

[color=#222222][size=small][font=Arial, Helvetica, sans-serif]I had an observation on some code in instance.c (see below) after porting the EVK1000 2-way ranging code to my platform. The main.c polled the dwt_isr before getting back to case TA_TX_WAIT_CONF. At the time of polling, there were two events: [/font][/size][/color]

[color=#222222][size=small][font=Arial, Helvetica, sans-serif]DWT_SIG_TX_DONE (due to the success of sending the POLL message) and[/font][/size][/color]

[color=#222222][size=small][font=Arial, Helvetica, sans-serif]DWT_SIG_RX_OKAY (the response to poll is received already)[/font][/size][/color]

[color=#222222][size=small][font=Arial, Helvetica, sans-serif]This is because the polling is slow. As the NOTE in the below code pointed out, although DWT_SIG_RX_OKAY event is later than the DWT_SIG_TX_DONE, it is processed first, [/font][/size][/color]

[color=#222222][size=small][font=Arial, Helvetica, sans-serif]As a result, [/font][/size][/color]

[color=#222222][size=small][font=Arial, Helvetica, sans-serif]dw_event = instance_getevent(11) will get and clear the DWT_SIG_RX_OKAY event, and return from instance.c and will come back to case TA_TX_WAIT_CONF again.[/font][/size][/color]

[color=#222222][size=small][font=Arial, Helvetica, sans-serif]This time, dw_event = instance_getevent(11) will get and clear DWT_SIG_TX_DONE event, and process it and move on to TA_RX_WAIT_DATA. [/font][/size][/color]

[color=#222222][size=small][font=Arial, Helvetica, sans-serif]Since DWT_SIG_RX_OKAY was already received and cleared, TA_RX_WAIT_DATA will not get that event. And the receiver will not generate a timeout event either since it already received the event. The system is stuck in TA_RX_WAIT_DATA for ever. [/font][/size][/color]

[color=#222222][size=small][font=Arial, Helvetica, sans-serif]So it seems that either dwt_isr could process the events on a FIFO base in case of two events, or the code in instance.c needs to consider this corner case. Any comments are appreciated. [/font][/size][/color]

[color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif]case TA_TX_WAIT_CONF : [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] printf(“TA_TX_WAIT_CONF %d m%d states %08x %08x\n”, inst->previousState, message, dwt_read32bitreg(0x19), dwt_read32bitreg(0x0f)) ;[/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] { [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] event_data_t* dw_event = instance_getevent(11); //get and clear this event [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] //NOTE: Can get the ACK before the TX confirm event for the frame requesting the ACK [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] //this happens because if polling the ISR the RX event will be processed 1st and then the TX event [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] //thus the reception of the ACK will be processed before the TX confirmation of the frame that requested it.[/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] if(dw_event->type != DWT_SIG_TX_DONE) //wait for TX done confirmation [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] { [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] if(dw_event->type == DWT_SIG_RX_TIMEOUT) //got RX timeout - i.e. did not get the response (e.g. ACK) [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] { [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] //printf(“RX timeout in TA_TX_WAIT_CONF (%d)\n”, inst->previousState); [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] //we need to wait for SIG_TX_DONE and then process the timeout and re-send the frame if needed [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] inst->gotTO = 1; [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] } [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] done = INST_DONE_WAIT_FOR_NEXT_EVENT;[/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] break; [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color][color=#222222][size=small][font=Arial, Helvetica, sans-serif] [/font][/size][/color]
[color=#222222][size=small][font=Arial, Helvetica, sans-serif] } [/font][/size][/color]