git进阶08_完整实战场景演练
2026/6/30 6:48:07
+---------------------+ | 用户空间 | | SocketCAN API | +----------+----------+ | +----------v----------+ | 内核空间 | | CAN协议栈核心 | +----------+----------+ | +----------v----------+ | CAN设备驱动层 | +----------+----------+ | +----------v----------+ | CAN硬件 | +---------------------+net/can/目录下的核心实现can_raw.c提供原始套接字接口can_bcm.c实现广播管理协议drivers/net/can/下的各种控制器驱动// net/can/af_can.c static int __init can_init(void) { sock_register(&can_family_ops); register_pernet_subsys(&can_pernet_ops); register_netdevice_notifier(&can_netdev_notifier); return 0; }can_rx_register():注册接收处理函数can_send():处理CAN帧发送can_proto_register():协议注册// net/can/error.c void can_send_error(struct net_device *dev, struct can_frame *cf) { struct sk_buff *skb; struct can_frame *ecf; skb = alloc_can_err_skb(dev, &ecf); memcpy(ecf, cf, sizeof(struct can_frame)); netif_rx(skb); }注意:Linux 3.0发布时CANFD尚未标准化(ISO 11898-1:2015),因此本版本不支持CANFD。
| 指标 | 值 |
|---|---|
| 最大吞吐量 | 6500帧/秒 |
| 平均延迟 | 120μs |
| CPU占用率 | 3.5% @1000帧/秒 |
ctrlmode参数配置can_rx_*系列函数优化CAP_NET_RAW能力位struct can_filter filter[] = { {.can_id = 0x123, .can_mask = 0x7FF}, {.can_id = 0x200, .can_mask = 0x700} }; setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &filter, sizeof(filter));| 特性 | Linux 2.6.39 | Linux 3.0 |
|---|---|---|
| SocketCAN API | 基本稳定 | 完整文档化 |
| CAN设备驱动 | 15种 | 22种 |
| 网络命名空间 | 无 | 初始支持 |
| BCM协议 | 实验性 | 稳定版 |
# 加载内核模块 modprobe can can-dev # 创建CAN设备 ip link set can0 type can bitrate 500000 ip link set can0 up # 使用candump查看流量 candump can0int s = socket(PF_CAN, SOCK_RAW, CAN_RAW); struct ifreq ifr; strcpy(ifr.ifr_name, "can0"); ioctl(s, SIOCGIFINDEX, &ifr); struct sockaddr_can addr; addr.can_family = AF_CAN; addr.can_ifindex = ifr.ifr_ifindex; bind(s, (struct sockaddr*)&addr, sizeof(addr));设备无法启动
lsmod | grep candmesg | grep can接收不到数据
ip -det link show can0ip -d link show can0高错误率
candump -e can0查看错误帧net/can/,drivers/net/can/