• OSEK network management


    实现几种功能,全网唤醒自组网,物理加入,物理掉线,全网休眠,自我认知到无法建网(跛足)
    令牌环拓扑结构,利用了can总线的仲裁,使id从小到大顺序发送。
    虽然是令牌环,但物理上是单总线,其实每个节点都知道其他所有节点状态。
    用环可以减少ecu的负载,不需要维护总表,因为设备可能很多。只需要维护几个状态,自己下家是谁,全网申请休眠。
    can报文id为ecu自己的id,为4XX,can报文payload有两个字节,data[1]状态字节,有5个bit管用
    0x01 Alive(上线,本ecu是新加入的,或者本ecu被人跳过了)
    0x02 Ring(传递令牌)
    0x04 LimpHome(跛足,网络无人响应无法建环)
    0x10 SleepIndication(休眠申请,本ecu想休眠了)
    0x20 SleepAcknowledege(应答申请,检测到一次回环中所有报文都SleepIndication,可以休眠了)

    各个bit不能任意组合实际只有5种报文
    01:代表Alive报文,在总线上声明自己的存在,请求其他节点与自己建环。
    02:代表Ring报文;
    12:代表当前节点已无通讯请求(睡眠标志位SleepIndication置位),即告知其他节点我已满足睡眠条件;
    32:即将其睡眠应答位置1,当检测到其他节点都在发送12ring报文后,最后一个节点发送此应答报文,告知其他节点当前整个网络无通信请求,可以睡眠。此时进入睡眠等待状态即Twbs状态。
    04:代表跛行报文,如果网络管理报文接收计数器和发送计数器超限后,发送跛行报文即无其他节点与此节点建环,只有一个节点存在。

    data[0]两种情况,alive报文填本ecu的id,ring报文填写令牌要发给目的ecu的id。
    令牌环的逻辑,每个节点有独一无二的id。总线由id小的先发送,将data[0]设置为自认为比自己id大的下一个节点,发送报文相当于发送令牌环。id最大的下一节点为最小id节点。
    网络唤醒后,大家都发alive,各自记住自己下一个节点是谁。
    节点加入或错乱,每个节点监听自己是否被跨过去,即 can id < 自己的id < can data[0],发现后发alive,自己上一级节点更新它自认为比自己id大的下一个节点。
    节点掉线,超时后,开始刚唤醒时候流程。
    网络休眠,一次回环大家都发送休眠申请,计时进入全网休眠。
    相互独立的节点自组网,由于网络的不确定性,当然离不开时间的约定,报文响应时间,超时处理,状态机闭环,各个厂家要求不一样。

  • 相关阅读:
    Antd Vue a-select placeholder不显示问题
    k8s持久化存储PV、PVC
    MySQL基本语句操作
    MySQL中delete和truncate的用法和区别?哪个删除数据快?
    领域驱动设计——领域的重构
    LinkSLA坚持用户第一,打造可持续的运维服务方案
    当数据库的主表和relation表数据不完全匹配时怎么计算成员数
    用关键词获取店铺订单和物流
    php——三篇夯实根基第一篇
    【C++】C++入门
  • 原文地址:https://blog.csdn.net/jun7118/article/details/126320641