在使用uart的DMA接收方式的时候,发现例程在接收到第一个信号量是成功的,然后再次等待第二个信号量的时候就会报段错误,每次接收完第一次之后都会在rt_mq_recv那里会报段错误,请问大家这是什么回事?
static void serial_thread_entry(void *parameter)
{
struct rx_msg msg;
rt_err_t result;
rt_uint32_t rx_length;
static char rx_buffer[1024 + 1];
int i = 0;
while(1)
{
rt_memset(&msg, 0, sizeof(msg));
rt_kprintf("======================\r\n");
result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER);
if (result == RT_EOK)
{
rt_kprintf("---------------------------\r\n");
rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size);
rt_kprintf("rx_length = %d\r\n", rx_length);
if (rx_length <= 0)
{
return -RT_ERROR;
}
rx_buffer[rx_length] = '\0';
rt_kprintf("rx_buffer = %s\r\n", rx_buffer);
for(i = 0; i < rx_length; i++)
{
rt_kprintf("data = 0x%x\r\n", rx_buffer[i]);
}
}
}
}
追踪到这里报错了
我在rt_mq_recv之前把msg.size置0的操作,而且在操作rx_buffer的时候应该在rt_device_read函数中,我觉得应该没有对rx_buffer写穿,刚刚我也尝试过反汇编elf文件,只能定位到确实是rt_mq_recv造成的。