Autosar bswm 代码分析记录

1.总述

BswM 下本身分为 modeArbitration ,modeControl, general 三大配置组

1. modeArbitration

arbitration 主要用于条件判断的搭建,类比C 语言中中 if 判断条件。其下有四个配置组:

  1. logicExpressions,
    设置各种条件(modeConditions)的逻辑组合,与或非异或等

  2. modeConditions,
    设置各种基础判断条件,requestPort与状态量的 (等于不等于大于小于) 关系

  3. RequestPorts,
    设置各种port 及其状态量
    标准模块中在这个配置组里面都有各自对应的 port 和其状态量(如Comm模块 和其各种CommunicationMode)
    除了标准模块外,用户还可以定义自己的port 口,用于后续的条件判断(modeCondtions 中)

  4. Rules,
    连接判断条件 和 其处理操作

2. modeControl

主要建立各种处理操作。其下也有四个配置组

  1. Actions,
    主要设置的动作是对前面RequestPorts 的状态量操作,timer 操作,也可以通过callout 函数编写自己的处理

  2. ActionLists,
    设置Actions 的组合,因为某些条件满足后,需要做很多不同的处理操作
    在生成的代码中,一个actionlist生成一个函数,其中包含 配置的 action 子函数

  3. RteModeRequestPorts,
    连接需要关联的Rte port

  4. SwitchPorts,
    没有用过

3. general

功能模块或接口的使能配置,schedule 函数的调度周期之类的

4. 代码分析

  1. api 函数分析,bswm 的 api 函数主要分为三类
  • 初始化函数,BswM_Init (一般放置在EcuM_StratupTwo 中)

  • 主调函数, BswM_MainFunction

  • 模块的同步函数

    • 标准模块的状态通知,如 BswM_ComM_CurrentMode
    • 自定义的状态通知,如 BswM_RequestMode
  1. 因为 对 modeRequest的处理有 立即处理的(immediate),和 延迟处理(Deffered),在可抢占式的os 中可能出现函数的重入场景。这也是bswm 的模块函数复杂的地方。

  2. 另外,一个modeRequest 可能在多个 Rules 中作为判断条件,因此一个modeRequest 的状态变化可能引发多个actionList 的执行。这也是造成bswm 函数复杂的另一个地方。

  3. bswm 代码中用了分层的方式来处理上述场景需求

    1. 当 Generic request 发生后 ,先转化成 ModeRequestQueue中的记录

      FUNC(void, BSWM_CODE) BswM_RequestMode
      (
          BswM_UserType requesting_user,  /*The user that requests the mode.*/
          BswM_ModeType requested_mode    /*The requested mode.*/
      )
      
      
      FUNC(void, BSWM_CODE) BswM_ImmediateModeRequest
      (
      	uint8 start, 			/*Start Value Of Immediate User Index.*/
      	uint8 end				/*End Value Of Immediate User Index.*/
      )
      

      当请求的user Id 跟 BswM_GenericMapping[] 中某个元素的 ExternalId 一致时,则将该元素的immediateUser_start/end 作为索引,将ModeRequestQueue[] 记录为Queued。

    2. 将 ModeRequestQueue 中的记录,根据 Rules 转化成 ActionListQueue 中的记录,并执行对应的actionlist

      FUNC(void, BSWM_CODE) BswM_ProcessQueuedRequests(void)
      

      在 ModeRequestQueue [] 中查找 有记录(Queued)的元素,用其index 值 在 BswM_ImmediateUser 中找到对应的元素。 然后根据ImmediateUser 对应的Rules 检查,将需要执行的actionlist 记录到 ActionListQueue 中,然后进行执行。

    3. 一个modeRequest 对应多个Rules, 但是为甚么中间要多加一级 ImmediateUser?

      自己的理解,主要是考虑到多个Rules 本身的排序是不连续的,所以多使用一级 ImmediaimmteUser。
      外部发出请求的User 对应多个ImmediaimmteUser, 每个ImmediaimmteUser 再对应多个Rules, 通过这种方式来实现管理。
      或许这个理解是错误的,只是自己的理解,并非最初的设计意图。
      同样的实现目的,为啥不用一个mapping数组来实现呢?

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值