1

socketCAN 连接:read() 不够快

你好,

我使用 socket() 连接进行 CAN 通信。

fd = socket(PF_CAN, SOCK_RAW, CAN_RAW);

我使用 2 个线程:一个周期性 1ms RT 线程发送数据,一个线程读取传入消息。读取函数如下所示:

void readCan0Socket(void){
   int receivedBytes = 0;
   do
   {
      // set GPIO pin low
      receivedBytes = read(fd ,
                           &receiveCanFrame[recvBufferWritePosition],
                           sizeof(struct can_frame));
      // reset GPIO pin high

      if (receivedBytes != 0)
      {
         if (receivedBytes == sizeof(struct can_frame))
         {
            recvBufferWritePosition++;
            if (recvBufferWritePosition == CAN_MAX_RECEIVE_BUFFER_LENGTH)
            {
               recvBufferWritePosition = 0;
            }
         }
         receivedBytes = 0;
      }

   } while (1);
 }

套接字配置为阻塞模式,因此读取功能保持打开状态,直到消息到达。当前的实现正在运行,但是当我测量读取消息和读取功能的下一个等待状态之间的时间(请参阅设置/重置 GPIO 注释)时,时间在 30 us(平均值)和 > 200 us 之间变化。大于 200us 的值意味着(CAN 的波特率为 1000 kBit/s)在 read() 处理前一个消息时无法识别包。read() 函数必须在 134 us 内准备好。

我怎样才能加速我的实施?我尝试使用两个用互斥锁分隔的线程(在 read() 函数之前锁定并在消息接收后解锁),但这并没有解决我的问题。

4

0 回答 0