summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgbcwbz <[email protected]>2022-05-09 21:06:23 +0800
committerMan, Jianting (Meco) <[email protected]>2022-08-13 23:07:43 -0400
commit84fe80fbf986c16640ae63b2799628e8351e02a4 (patch)
tree564f8ab8cbc8a43d8c919bca142bc66896a2ab44
parent666af5e29d04b46f4b88cd10eed0ddee8f9103aa (diff)
[DeviceDriver] Fix can infinite loop when can driver send error
- in _can_int_tx if can driver sendmsg do not return RT_EOK, it will repeat until sendmsg return RT_EOK - if error occur on can bus(wire broken or EMI), all threads that have lower priority will not be executed - we should let application layer to determine if resend is appropriate when send fail, besides in data link layer, can already implemented auto resend in hardware
-rw-r--r--components/drivers/can/can.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/components/drivers/can/can.c b/components/drivers/can/can.c
index f110bc9e1f..eee78da9ec 100644
--- a/components/drivers/can/can.c
+++ b/components/drivers/can/can.c
@@ -158,10 +158,10 @@ rt_inline int _can_int_tx(struct rt_can_device *can, const struct rt_can_msg *da
{
/* send failed. */
level = rt_hw_interrupt_disable();
- rt_list_insert_after(&tx_fifo->freelist, &tx_tosnd->list);
+ rt_list_insert_before(&tx_fifo->freelist, &tx_tosnd->list);
rt_hw_interrupt_enable(level);
rt_sem_release(&(tx_fifo->sem));
- continue;
+ goto err_ret;
}
can->status.sndchange = 1;
@@ -189,6 +189,7 @@ rt_inline int _can_int_tx(struct rt_can_device *can, const struct rt_can_msg *da
}
else
{
+err_ret:
level = rt_hw_interrupt_disable();
can->status.dropedsndpkg++;
rt_hw_interrupt_enable(level);