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() 函数之前锁定并在消息接收后解锁),但这并没有解决我的问题。