AR3X_BMT 项目能力

此内容应用于 V7.6.1 或更高版本。 AUTOSAR AR3x_BMT 项目定义了 AUTOSAR SW 体系结构以及该 SW 体系结构用于原子 SW/C 类型的 Rhapsody® 实现。

AR3X_BMT 项目

AR3X_BMT 项目可以包含:
AR3X_BMT 项目有两种附加图:
  • RIMB 图 - 用于定义 Rhapsody 实现块
  • SWC 实现图 - 用于通过 RIMB 对象定义 AR SW/C 类型的实现,以将 RIMBO 与 SW/C 类型进行链接
RIMB 端口仅用于通过委派连接符连接到 AR 端口。有四种符合 RIMB 接口的 RIMB 端口:
  • RIMB 接收方端口 - 由 RIMB 接收方端口接口确定类型并用于连接至 AR 接收方端口(AR 所需端口具有 S/R 接口)
  • RIMB 发送方端口 – 用于连接至 AR 发送方端口
  • RIMB 客户机端口 – 用于连接至 AR 客户机端口
  • RIMB 服务器端口 – 用于连接至 AR 服务器端口
RIMB 接口 - 有四种 RIMB 接口:
  • RIMB 接收方端口接口
  • RIMB 发送方端口接口
  • RIMB 客户机端口接口
  • RIMB 服务器端口接口
RIMB 接口可以:
  • 在发送方或接收方接口中确定属性和操作参数的类型,在客户机或服务器接口中确定操作参数的类型。为属性和操作参数确定的类型必须为 C 类型以与匹配的 AR 数据元素类型保持一致。
  • 在必须由 Rhapsody 事件确定类型的发送方或接收方接口中使用 Rhapsody 事件来确定属性的类型。由 Rhapsody 生成的辅助函数也将生成相应具有将数据本身作为可选参数的 Rhapsody 事件。这样的 Rhapsody 事件可以用于在 RIMB 的状态图上触发过渡。Rhapsody 事件可以没有参数或具有与要连接至的 AR 数据元素类型一致的 C 类型参数。提供的辅助函数简化了对 Rhapsody 事件的处理。
  • 指定取决于接口类型的访问方式并提供所需的其他信息:
    • 接收方接口:需要在属性选项卡中为每个属性指定访问方式访问方式可以具有以下某个访问方式的值:
      • 显式阻塞 - 表示一直阻塞到某个值到达为止的 AR 显式访问。在访问 & 激活选项卡中,没有活动元素具有接收到数据事件的激活策略。

      • 显式非阻塞 - 表示以某个状态码立即返回的 AR 显式访问。在访问 & 激活选项卡中,没有活动元素可以具有数据接收事件上唤醒的激活策略。

      • 隐式 - 表示 AR 隐式访问。在访问 & 激活选项卡中必须有一个活动元素对其进行访问。

  • 指定需要以下信息的调用方式:
    • 客户机接口:需要在操作选项卡中为每个操作指定调用方式调用方式可以为:
      • 同步 – 此调用将阻塞到服务器完成操作为止

      • 异步 – 调用立即返回

    另一个具有“异步服务器调用返回了事件”激活策略的活动操作可用于检索写入的参数值

RIMB 活动操作 - 此选项卡定义了 AR 可运行实体。RIMB 中定义的所有行为必须由活动操作激活(调用),包括“状态图”执行。活动操作可以由任何代码实现。活动操作选项卡的主要功能部件为:
  • 对发送方或接收方接口中的 DataElements,以及对客户机或服务器接口中的操作的访问。基于访问 & 激活选项卡来定义访问。

  • 确定 RTE 调度程序何时激活操作的激活策略。它可以为以下选项中的任一值:

    异步激活策略 - 操作基于访问 & 激活选项卡来定义

    定期激活策略 - 定义周期和偏移量

  • 受防护 - 受防护活动操作相互排斥。 由专用 AR 互斥区域实现,在互斥区域中所有受防护的活动操作都指定为“在其中运行”。
RIMB 访问和激活 - 此选项卡定义了相关的内部行为工件。
  • 访问 - 端口上的哪个元素由哪个活动元素(诸如数据读/写访问、数据发送/接收点、服务器同步或异步调用点、等待点之类的)来进行访问。 隐式或显式的访问方式在 RIMB 接口中的属性级别中进行指定,而不是在这里进行指定。

  • 激活 - 代表异步活动元素的激活策略。定义除计时事件外的哪个 RTE 事件将引起每个异步活动元素的激活。在用一行定义(其他)访问的情况下,激活可以为“不适用”

注: 如果激活策略为“‘接收到数据’事件”或“‘接收到数据时唤醒’事件”,那么此行定义了激活策略也定义了对数据元素的访问。指定的活动元素可以在表中具有多行。在这种情况下,定义的激活策略和访问是所有行之和。

RIMB 并行可以为活动(缺省值)或顺序。 并行为“活动”时,将为 RIMB 的“doExecute”方法创建 RunnableEntity。激活策略确定 RTE 何时激活 RIMB 的“doExecute”方法,必须进行指定。激活策略可以为“异步”或“定期”。“异步”激活策略基于“访问 & 激活”选项卡来定义。定义周期或偏移量后可使用“定期”激活策略。并行为“顺序”时,未定义任何显式激活。如果将 RIMB 定义为执行管理器,那么 RIMB 将实现用于管理它的状态图(如果状态图以及它的部件存在)的“doExecute”方法,并且RIMB 将有一个事件队列。

生成的辅助函数

Rhapsody 可以生成为 RIMB 生成几个类型的辅助函数。辅助函数可以从活动操作进行调用,可以隐藏 RTE API 的复杂性和特性,并可以启用诸如 receiveAndHandleP_x 的进一步服务。 辅助函数包括:
  • 接收方 - 用于在接收方端口上读取数据。 在一些情况下,允许在不更改用户代码的情况下更改访问方式。

  • 发送方 - 用于在发送方端口上发送数据

  • 处理程序 - 用于处理接收到的数据

  • 接收并处理 - 结合了接收和处理的效果

  • 调用者 - 用于调用所需的(客户机)服务

  • 接收方、发送方、接收并处理以及调用者 - 用于返回 RTE API 状态

表 1.
生成的辅助函数 描述

receiveData_p_x (int* const x)

读取接收方端口 p 上的属性值,并将其放入参数 x 中。仅当 p.x 的类型由某种 C 类型确定,而不是由某个事件确定时才会生成此函数。

handleData_p_x (int x)

仅当 p.x 的类型由某种 C 类型确定,而不是由某个事件确定时才会生成此函数。
  • 如果 RIMB 有一个触发操作 evP_x,那么调用该辅助函数。

  • 如果 RIMB 有属性 p_x,那么将其设置为该参数的值。

  • 如果 RIMB 另有一个名称为 chP_x 的接收并且 x 被更改,那么将生成 Rhapsody 事件 chP_x 并在管理器的队列中进行排队。

receiveAndHandleData_p_x()

立即接收并处理。 此代码是直接插入的,例如,它不表示两个附加函数调用。

receiveEvent_p_x (int* const x)

读取接收方端口 p 上的属性值,并将其放入参数 x 中。仅当 p.x 的类型由某种 Rhapsody 事件确定时才会生成此函数。 最好直接调用 receiveAndHandleEvent

handleEvent_p_x()

仅当 p.x 的类型由某种事件确定时才会生成此函数。
  • 如果 RIMB 有一个 ev 接收,那么将生成 Rhapsody 事件 ev,并在管理器的队列中进行排队。

  • 如果事件类型化 p.x 具有参数,那么 handleEvent 将具有复制到事件的参数。

receiveAndHandleEvent_p_x()

立即接收并处理。此代码是直接插入的,例如,它不表示两个附加函数调用。

sendData_p_x(int x)

将该参数的值发送到发送方端口 p. 中的属性 x 中。仅当 p.x 的类型由某种 C 类型确定时才会生成此函数。

sendEvent_p_x()

仅当 p.x 的类型由某种事件 ev 确定时才会生成此函数。
  • 如果 ev 有一个参数,那么 sendEvent 也有一个将被发送的参数。

  • 如果 ev 没有参数,那么将发送一个任意值。

call_p_f

客户机端口 p 中的操作 f 需要此调用。

事件处理

超时实现为:
  • 两个可运行实体:

    TimeTick - 用于管理时间增量

    PostTimedElements - 用于记入到期的超时。在 mxf/RiCTimer.c 中实现。

  • 两个计时事件:

    TimeTick_tmev、PostTimedElements_tmev - 用于定期触发以上可运行实体

  • 一个互斥区域:

    TimerManager_EA - 用于确保对时间计数器进行访问的互斥。 通过叫做 RiCOSTimerManagerMutex_lock() 和 RiCOSTimerManagerMutex_free() 的 mxf API 进入和退出此互斥区域。

所有工件在 ARXML 中进行声明。

RIMB 的状态图

生成的接收方、发送方和处理程序简化了对 Rhapsody 事件的此处理。RIMB 的状态图可以按以下两种方式之一执行:

由 RTE 管理方式定义用于执行的 RIMB 状态图:
  • 将 RIMB 定义为“顺序”

  • 对 RIMB 接收方端口 p 上的每个应该触发过渡的属性 x 使用名称 evP_x 来定义触发操作

  • x 的访问方式必须为显式阻塞显式非阻塞(例如,不是隐式),并且它的类型必须由常规 C 类型确定(例如,不是 Rhapsody 事件)

  • 使用这些触发操作撰写状态表,用作过渡触发器

  • 对每个这样的 p.x 定义一个活动操作以用作 p.x分派器

  • 实现活动操作必须调用 receiveAndHandleP_x()

    无论是在“由 RTE 管理”还是“由 Rhapsody 管理”方式下,此步骤相同。区别在于,Rhapsody 为 receiveAndHandleP_x() 生成的代码不同。

  • 将状态图的所有分派器都标记为“受防护”,以确保由独立可运行实体激活的分派器之间互相排斥

由 Rhapsody 管理方式定义用于执行的 RIMB 状态图:
  • 将 RIMB 定义为具有“定期”执行策略的“活动”

  • 使用 Rhapsody 事件来确定 RIMB 接收方接口类型化端口上的属性类型

  • 接收方端口 p 上的 AR 数据元素 x 将触发在事件队列中添加 ev 事件

  • 端口 p 的 RIMB 接收方接口上的 x 的类型必须由 ev 确定

  • ev 是状态图上的事件名称,而不是 p.x 上的名称

  • evp.x 的绑定是通过使 x 的类型由 ev 确定来实现的。

  • 使用 Rhapsody 事件 ev 撰写状态表,用作过渡触发器

  • 对每个这样的 p.x 定义一个活动操作以用作 p.x 的 轮询

  • 实现活动操作应该调用 receiveAndHandleP_x()

    无论是在“由 RTE 管理”还是“由 Rhapsody 管理”方式下,此步骤相同。区别在于,Rhapsody 为 receiveAndHandleP_x() 生成的代码不同。


反馈