求助大家,
我使用了串口V1版本驱动
同时打开收发DMA,
rt_device_open(*p_dev, RT_DEVICE_FLAG_DMA_RX | RT_DEVICE_FLAG_DMA_TX);
serial.c文件中的_serial_dma_tx函数执行发送,tx_dma->activated在这里RT_TRUE。
但在一些情况下
if (tx_dma->activated != RT_TRUE)
这个条件就永远也不会满足,因此也永远不能发送了。tx_dma->data_queue,最后线程卡死。
if (tx_dma->activated != RT_TRUE)
{
tx_dma->activated = RT_TRUE;
rt_hw_interrupt_enable(level);
/* make a DMA transfer */
serial->ops->dma_transmit(serial, (rt_uint8_t *)data, length, RT_SERIAL_DMA_TX);
}
else
{
rt_hw_interrupt_enable(level);
}
跟踪代码以后发现tx_dma->activated 的清零是在串口中断中完成。但是不知道什么原因,并没有执行。
rt_data_queue_pop(&(tx_dma->data_queue), &last_data_ptr, &data_size, 0);
if (rt_data_queue_peek(&(tx_dma->data_queue), &data_ptr, &data_size) == RT_EOK)
{
/* transmit next data node */
tx_dma->activated = RT_TRUE;
serial->ops->dma_transmit(serial, (rt_uint8_t *)data_ptr, data_size, RT_SERIAL_DMA_TX);
}
else
{
tx_dma->activated = RT_FALSE;
}
把TX,RX其中一个改成INT或者不再发送数据。就不会线程卡死。
求助各位大神能指点一下