根据UART的DMA例程改写,第二次等待信号量会报段错误

发布于 2020-08-21 15:01:45

在使用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]);
      }
    }
  }
}
追加

image.png
追踪到这里报错了

查看更多

关注者
0
被浏览
541
aozima
aozima 2020-08-21
拒绝白嫖,拒绝键盘侠!

你的接收信号量是指 rt_mq_recv 吗?

msg.size 值是多少? 是否会造成 rx_buffer 写穿?
如果不是这个问题,那么本段程序自身应该没问题,应该是有其它程序造成的问题。

从经验上看,你改过的程序,写穿/溢出的可能性比较大。
你也可以从报的段错误给出信息,反汇编下程序看下是哪里出错了,也许会有帮助。

3 个回答
pen
pen 2020-12-24

你好,请问你这边的DMA的例程在哪找的,能分享一下吗?

aprilhome
aprilhome 2021-06-09

信号量还是邮箱呀?

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览