当前位置:首页 > 汽车电子 > 汽车电子
[导读]域控架构里CAN和以太网不是谁替换谁:底盘/动力仍跑CAN FD做周期信号广播,智驾/座舱走100BASE-T1/1000BASE-T1以太网跑SOME/IP服务调用,中央网关负责两边互转。 融合编程的核心不是“收到帧就发出去”,而是路由表驱动+信号提取重组+跨网封装+优先级隔离。


域控架构里CAN和以太网不是谁替换谁:底盘/动力仍跑CAN FD做周期信号广播,智驾/座舱走100BASE-T1/1000BASE-T1以太网跑SOME/IP服务调用,中央网关负责两边互转。 融合编程的核心不是“收到帧就发出去”,而是路由表驱动+信号提取重组+跨网封装+优先级隔离。

一、网关分层结构

AUTOSAR思路抽象成三层就够了:

接口层:CAN控制器驱动、以太网MAC驱动

网络层:PDU Router做CAN PDU打包;以太网侧跑TCP/UDP + SOME/IP + DoIP

路由引擎:维护全局路由表,决定“哪条CAN ID→哪个SOME/IP服务/Event Group”或反向

MCU侧跑CAN FD解析,MPU/SoC跑以太网协议栈,中间通过共享内存或IPCF交互,别在CAN中断里直接调socket。

二、路由表:静态映射优先

量产项目路由基本是静态配置(FIBEX/DBC+ARXML生成),运行时少动态改:

typedef enum { DIR_CAN2ETH, DIR_ETH2CAN, DIR_CAN2CAN } route_dir;

typedef struct {

   route_dir dir;

   uint32_t can_id;      // 源CAN ID

   uint8_t  can_ch;

   uint16_t srv_id;      // SOME/IP Service ID

   uint16_t evt_id;      // Event ID / Method ID

   uint16_t vid;         // VLAN

   uint8_t  prio;        // TSN PCP

   uint8_t  sig_map[8];  // 信号字节映射

} route_t;


const route_t ROUTE_TBL[] = {

   {DIR_CAN2ETH, 0x1A0, 0, 0x8001, 0x01, 100, 7, {0,1,2,3}},

   {DIR_ETH2CAN, 0x200, 1, 0x8002, 0x00, 100, 7, {0,1}},

};

路由粒度两种:

报文路由:整帧透传,ID/周期不变,延迟最低

信号路由:从源报文抽信号,重组成目标报文/以太网事件,周期由网关自组

控制指令走报文级,仪表/状态聚合走信号级。

三、CAN→以太网:提取+封装SOME/IP

CAN接收回调只做“入队”,别在里面组SOME/IP:

void can_rx_isr(uint8_t ch, uint32_t id, uint8_t*data){

   ring_put(&can_q, &(can_msg_t){id,ch,{data[0],data[1],data[2],data[3]}});

}


void route_can2eth_task(void){

   can_msg_t m;

   while(ring_get(&can_q,&m)){

       const route_t*r = find_can_route(m.id,m.ch);

       if(!r) continue;                       // 白名单过滤

       someip_event_t ev = {

           .srv = r->srv_id, .evt = r->evt_id,

           .cli = 0x10, .ses = ses_next(),

       };

       pack_signals(&ev.payload, m.data, r->sig_map);   // 按映射抽字节

       someip_send(r->vid, r->prio, &ev);

   }

}

SOME/IP头16字节:Service ID / Method ID / Length / Request ID / Ver / MsgType。 控制类事件走UDP Notification,诊断走DoIP over TCP,大块OTA走SOME/IP-TP分片。

⚠️ CAN字节序是Intel/Motorola要看DBC,SOME/IP载荷按服务接口定义,直接memcpy会错位。

四、以太网→CAN:解包分发

反向更简单:收到SOME/IP Event/Method响应,按srv+evt查表,重组成CAN帧发出。

void someip_rx_cb(someip_event_t*ev){

   const route_t*r = find_eth_route(ev->srv, ev->evt);

   if(!r) return;

   uint8_t payload[8] = {0};

   unpack_signals(payload, &ev->payload, r->sig_map);

   can_send(r->can_ch, r->can_id, payload);

}

要点:

以太网侧带时间戳,CAN侧按原周期重发,别收到一条发一条→总线风暴

远程控制类必须做源鉴权,OBD/云连接进来的指令走独立VLAN

失败帧回SOME/IP Error,别静默丢

五、TSN:跨域骨干的确定性

CAN FD本身靠仲裁保序,以太网不加以太网会抢带宽。域间关键流(制动/转向指令)必须走TSN:

gPTP全网时间同步,中央网关当主时钟

802.1Qbv时间门控:控制流占高优时隙

VLAN+PCP映射:控制指令PCP7、传感流PCP5、诊断PCP3、日志PCP0

关键链路开802.1CB帧复制冗余

Linux侧用tc和硬件TSN交换机配置,不能只靠应用层socket优先级。

// 标记socket流量类

setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &(int){7}, 4);

// VLAN PCP由内层skb->priority映射

六、缓冲与防抖

CAN侧进RingBuf,路由任务轮询消费

以太网侧收包进per-service队列,按优先级调度

同ID报文未到发送周期不重复发

网断时CAN照常收,以太网重连后补发最新值(别补历史队列,控制量只认最新)

诊断/OTA走独立通道,不和实时控制流混队列

七、安全边界

CAN ID白名单,未配置不通

以太网侧做防火墙,仅允许已知Service ID

云→车指令必须安全访问解锁,防重放

HSM校验固件路由表签名,路由表别运行时随意改

OBD口接进来走独立路由域,不直连动力CAN

八、落坑清单

CAN ISR里组SOME/IP→阻塞CAN接收丢帧

收到以太网事件立马发CAN→广播风暴

信号映射不按DBC字节序→值域错乱

控制流和日志流同队列→TSN没配等于白搭

SOME/IP Event不订阅直接发→对端没起服务丢包

路由表运行时可被诊断改写→攻击面

CAN FD 64字节当8字节解→越界

以太网重连补发历史队列→执行器收到旧指令

不做ID过滤→网关被异常ECU刷爆

gPTP不同步→Qbv时隙错位

九、落地顺序

先定路由表:CAN ID↔Service/Event映射、方向、周期

CAN驱动收帧入RingBuf,信号按DBC提取

SOME/IP发送走UDP Event,诊断走DoIP

反向查表重组CAN帧,按原周期发

以太网口分VLAN,控制流PCP7+Qbv

gPTP主时钟放中央网关,TSN交换机配门控

白名单+服务鉴权+HSM校验路由表

CANoe回放DBC+SOME/IP SD联调

CAN与以太网融合不是协议转换盒子,是“信号域”和“服务域”的边界网关:CAN侧保周期确定性,以太网侧保带宽和服务发现,中间路由表是唯一真相源。静态映射先行、动态服务发现留给SOME/IP-SD,关键跨域流一定交给TSN排优先级——这三件做对,动力域和智驾域才能在同一辆车里互不踩线;剩下的就是字节序、周期重发和白名单,决定的是“转得对不对”而不是“转得快不快”。



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭