diff options
| author | gbcwbz <[email protected]> | 2022-05-09 21:06:23 +0800 |
|---|---|---|
| committer | Man, Jianting (Meco) <[email protected]> | 2022-08-13 23:07:43 -0400 |
| commit | 84fe80fbf986c16640ae63b2799628e8351e02a4 (patch) | |
| tree | 564f8ab8cbc8a43d8c919bca142bc66896a2ab44 /components | |
| parent | 666af5e29d04b46f4b88cd10eed0ddee8f9103aa (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
Diffstat (limited to 'components')
| -rw-r--r-- | components/drivers/can/can.c | 5 |
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); |
