乐于分享
好东西不私藏

底盘控制软件中的loop counter

底盘控制软件中的loop counter

0 引言

底盘控制软件中,有一个看似简单但功能安全意义重大的基础变量,loop counter(循环计数器)。它只是一个循环自增的整型变量,但在ECU软件中承担着两个完全不同的关键角色。

在CAN通信链路上,loop counter作为AUTOSAR E2E保护中的滚动计数器,每发送一帧自动加1,接收端通过检查计数值的连续性来判断是否发生了丢帧、重复或乱序。

在任务执行链路上,loop counter作为程序流监控中的心跳计数器,每个安全关键任务在每个周期内自增一次,外部看门狗或监控任务定期检查这些计数值的增量是否在预期范围内。

线控转向或线控制动这类ASIL D等级的系统中,任何CAN报文的丢失或重复都可能导致方向盘非预期的偏转或制动力的偏差。

loop counter正是防止这些故障的第一道防线,它不仅保护外部通信的数据完整性,也保护内部任务调度的实时性。

本文不介绍单个寄存器如何配置,而是从通信安全和任务监控两个维度展开loop counter的工作机制和工程价值。

1 loop counter的基本概念与两种角色

loop counter本质上是一个循环自增的整型变量。

当计数值达到最大值后回绕到零,然后继续递增。

这个机制虽然简单,但在底盘控制软件中分别以两种角色嵌入两条完全独立的保护链路。

在通信安全中,loop counter作为滚动计数器工作。

AUTOSAR E2E保护机制在发送端为数据附加控制字段,CRC校验码、滚动计数器、Data ID等,接收端通过验证这些字段来检测传输故障。

其中滚动计数器专门检测数据丢失、重复及序列错误。

AUTOSAR E2E定义的多种Profile中,全部依赖滚计数器实现消息丢失和消息重复的检测。

在程序流监控中,loop counter作为任务心跳计数器工作。

AUTOSAR WdgM将loop counter定义为局部控制变量,其刷新分布在多个任务执行点上,底层驱动、E2E保护模块、安全逻辑处理三个层各自循环自增。

计数器必须同时满足“变化”和“变化速率符合预期”两个条件,才能判定任务正常。

这两个角色虽然都使用循环自增的同一机制,但它们的保护对象完全不同,一个是CAN报文的数据完整性,另一个是处理器上的任务执行时序。

2 角色一 通信安全中的滚动计数器

在底盘CAN通信中,最常用的是AUTOSAR E2E Profile 1。

发送端使用4位计数器从0到14循环自增,接收端持续检查计数器连续性。

滚动计数器的工作逻辑是,发送端每发送一帧报文,计数器自动加1。当计数值达到最大值14后回绕到0。

接收端记录上一帧收到的计数值,与当前帧的计数值比较,

如果当前计数值与上一帧相同,判定为消息重复,CAN控制器将同一帧报文发送了两次;

如果当前计数值与上一帧不连续,判定为消息丢失,中间有一帧或多帧报文在传输中丢失;

如果计数值跳变超出MaxDeltaCounterInit阈值,判定为消息序列错误。

当控制器断电重启后,发送端计数器从0开始。

接收端通过同步计数器机制容忍首次接收到的计数值,但会进入同步状态以防止对断电前旧数据的误判,如果重启后收到的第一帧计数值与断电前最后一帧不连续,接收端不会立即报错,而是先确认这是重启后的新序列。

对于拆分为多帧发送的大数据,通过单帧计数器和帧索引计数器组合校验确保完整性。

如果缺少E2E中的计数器保护,CAN控制器无法独立检测到消息的丢失或重复。

CRC只能检测数据损坏,Data ID只能防止消息错误路由,滚计数器才能保障消息时序,三者彼此独立、相互补充,loop counter是通信安全中不可替代的一环。

3 角色二 程序流监控中的任务心跳计数器

在底盘控制软件的AUTOSAR WdgM框架中,Loop Counter是任务和看门狗之间的关键“翻译器”,它把任务的执行状态翻译成看门狗能直接读取和判断的计数信号。

每个安全关键任务在各自的主循环内执行完毕后,调用WdgM API将其Loop Counter自增一次。

如果任务正常执行,监控模块在每个采样周期读取到的计数值都会比上一个周期多1。

如果任务卡死或跑飞,计数值连续不变,监控模块判定任务异常。

工程上对Loop Counter有严格的约束。

看门狗触发条件通常设置为连续计数异常超过预设容错次数(例如3次)则判定系统故障,计数器的更新频率需满足规定的最小更新率(例如每10ms更新一次)。

WdgM通过获取WdgM_LocalStatusParamsType中的计数器值,并与上一次成功读取值比较来决定任务状态。如果计数器未更新或数值回退,WdgM直接标记任务异常并上报WdgM_GlobalStateIndex。

Loop Counter的更新速率必须满足最小规定,看门狗触发条件预设容错次数的设计是为了防止偶发丢帧或瞬态超时引发误触发。

4 一个控制器中的两种Loop Counter同步工作

在一个线控转向控制器中,两种Loop Counter同步工作,各自独立、彼此分离。

CAN通信链路上,E2E保护模块在每次发送CAN报文前提取当前Loop Counter值嵌入报文的RC字段。

接收端的E2E检查模块提取报文中的RC值,与本地记录的上一帧RC值比较,判定消息是否重复、丢失或乱序。

任务执行链路上,WdgM模块在每个监控周期内读取所有注册任务的Loop Counter值。

监控MCU通过与主MCU的私CAN通信获取这些计数值,在每个固定的监控窗口(如10ms)结束时检查所有计数器的增量是否均为1。如果连续3个监控窗口某个计数器的增量均为0,WdgM触发故障响应,系统进入降级模式。

两条保护链路共享同一个loop counter变量,但两个模块读取的是不同时间点的值,E2E在CAN报文组包时读取,WdgM在每个监控窗口边界读取。

这种“共享但不互斥”的设计在同一套软件体系内利用一个简单的自增计数器同时保障了外部通信的完整性和内部调度的实时性。

5 结语

通信安全解决“数据对不对”的问题,任务监控解决“程序活不活”的问题,一个loop counter,两条保护链路,分别看住了底盘控制软件系统面对外部和内部失效的两个最关键维度。

在ASIL D等级的底盘控制器中,任何一个维度的保护缺失都可能导致系统安全目标的失败。

loop counter之所以在底盘控制软件中不可或缺,正是因为它用最简洁的机制在通信和任务两个维度上为功能安全提供了可审计、可验证的防护能力。