Skip to content

Commit

Permalink
[components][drivers]close can irq before release fifo
Browse files Browse the repository at this point in the history
原来的CAN close中先释放fifo后关闭CAN中断,可能导致释放fifo后且关闭CAN中断前来CAN中断,此时rt_hw_can_isr可能在RT_ASSERT(tx/rx_fifo != RT_NULL)断言失败
  • Loading branch information
zmshahaha authored Apr 16, 2024
1 parent 6ad0b2b commit be69979
Showing 1 changed file with 6 additions and 4 deletions.
10 changes: 6 additions & 4 deletions components/drivers/can/can.c
Original file line number Diff line number Diff line change
Expand Up @@ -407,29 +407,31 @@ static rt_err_t rt_can_close(struct rt_device *dev)
{
struct rt_can_rx_fifo *rx_fifo;

/* clear can rx interrupt */
can->ops->control(can, RT_DEVICE_CTRL_CLR_INT, (void *)RT_DEVICE_FLAG_INT_RX);

rx_fifo = (struct rt_can_rx_fifo *)can->can_rx;
RT_ASSERT(rx_fifo != RT_NULL);

rt_free(rx_fifo);
dev->open_flag &= ~RT_DEVICE_FLAG_INT_RX;
can->can_rx = RT_NULL;
/* clear can rx interrupt */
can->ops->control(can, RT_DEVICE_CTRL_CLR_INT, (void *)RT_DEVICE_FLAG_INT_RX);
}

if (dev->open_flag & RT_DEVICE_FLAG_INT_TX)
{
struct rt_can_tx_fifo *tx_fifo;

/* clear can tx interrupt */
can->ops->control(can, RT_DEVICE_CTRL_CLR_INT, (void *)RT_DEVICE_FLAG_INT_TX);

tx_fifo = (struct rt_can_tx_fifo *)can->can_tx;
RT_ASSERT(tx_fifo != RT_NULL);

rt_sem_detach(&(tx_fifo->sem));
rt_free(tx_fifo);
dev->open_flag &= ~RT_DEVICE_FLAG_INT_TX;
can->can_tx = RT_NULL;
/* clear can tx interrupt */
can->ops->control(can, RT_DEVICE_CTRL_CLR_INT, (void *)RT_DEVICE_FLAG_INT_TX);
}

can->ops->control(can, RT_DEVICE_CTRL_CLR_INT, (void *)RT_DEVICE_CAN_INT_ERR);
Expand Down

0 comments on commit be69979

Please sign in to comment.