显式阻塞 - 表示一直阻塞到某个值到达为止的 AR 显式访问。在访问 & 激活选项卡中,没有活动元素具有接收到数据事件的激活策略。
显式非阻塞 - 表示以某个状态码立即返回的 AR 显式访问。在访问 & 激活选项卡中,没有活动元素可以具有数据接收事件上唤醒的激活策略。
隐式 - 表示 AR 隐式访问。在访问 & 激活选项卡中必须有一个活动元素对其进行访问。
同步 – 此调用将阻塞到服务器完成操作为止
异步 – 调用立即返回
另一个具有“异步服务器调用返回了事件”激活策略的活动操作可用于检索写入的参数值
对发送方或接收方接口中的 DataElements,以及对客户机或服务器接口中的操作的访问。基于访问 & 激活选项卡来定义访问。
确定 RTE 调度程序何时激活操作的激活策略。它可以为以下选项中的任一值:
异步激活策略 - 操作基于访问 & 激活选项卡来定义
定期激活策略 - 定义周期和偏移量
访问 - 端口上的哪个元素由哪个活动元素(诸如数据读/写访问、数据发送/接收点、服务器同步或异步调用点、等待点之类的)来进行访问。 隐式或显式的访问方式在 RIMB 接口中的属性级别中进行指定,而不是在这里进行指定。
激活 - 代表异步活动元素的激活策略。定义除计时事件外的哪个 RTE 事件将引起每个异步活动元素的激活。在用一行定义(其他)访问的情况下,激活可以为“不适用”
RIMB 并行可以为活动(缺省值)或顺序。 并行为“活动”时,将为 RIMB 的“doExecute”方法创建 RunnableEntity。激活策略确定 RTE 何时激活 RIMB 的“doExecute”方法,必须进行指定。激活策略可以为“异步”或“定期”。“异步”激活策略基于“访问 & 激活”选项卡来定义。定义周期或偏移量后可使用“定期”激活策略。并行为“顺序”时,未定义任何显式激活。如果将 RIMB 定义为执行管理器,那么 RIMB 将实现用于管理它的状态图(如果状态图以及它的部件存在)的“doExecute”方法,并且RIMB 将有一个事件队列。
接收方 - 用于在接收方端口上读取数据。 在一些情况下,允许在不更改用户代码的情况下更改访问方式。
发送方 - 用于在发送方端口上发送数据
处理程序 - 用于处理接收到的数据
接收并处理 - 结合了接收和处理的效果
调用者 - 用于调用所需的(客户机)服务
接收方、发送方、接收并处理以及调用者 - 用于返回 RTE API 状态
| 生成的辅助函数 | 描述 |
|---|---|
receiveData_p_x (int* const x) |
读取接收方端口 p 上的属性值,并将其放入参数 x 中。仅当 p.x 的类型由某种 C 类型确定,而不是由某个事件确定时才会生成此函数。 |
handleData_p_x (int x) |
仅当 p.x 的类型由某种 C 类型确定,而不是由某个事件确定时才会生成此函数。
|
receiveAndHandleData_p_x() |
立即接收并处理。 此代码是直接插入的,例如,它不表示两个附加函数调用。 |
receiveEvent_p_x (int* const x) |
读取接收方端口 p 上的属性值,并将其放入参数 x 中。仅当 p.x 的类型由某种 Rhapsody 事件确定时才会生成此函数。 最好直接调用 receiveAndHandleEvent。 |
handleEvent_p_x() |
仅当 p.x 的类型由某种事件确定时才会生成此函数。
|
receiveAndHandleEvent_p_x() |
立即接收并处理。此代码是直接插入的,例如,它不表示两个附加函数调用。 |
sendData_p_x(int x) |
将该参数的值发送到发送方端口 p. 中的属性 x 中。仅当 p.x 的类型由某种 C 类型确定时才会生成此函数。 |
sendEvent_p_x() |
仅当 p.x 的类型由某种事件 ev 确定时才会生成此函数。
|
call_p_f |
客户机端口 p 中的操作 f 需要此调用。 |
两个可运行实体:
TimeTick - 用于管理时间增量
PostTimedElements - 用于记入到期的超时。在 mxf/RiCTimer.c 中实现。
两个计时事件:
TimeTick_tmev、PostTimedElements_tmev - 用于定期触发以上可运行实体
一个互斥区域:
TimerManager_EA - 用于确保对时间计数器进行访问的互斥。 通过叫做 RiCOSTimerManagerMutex_lock() 和 RiCOSTimerManagerMutex_free() 的 mxf API 进入和退出此互斥区域。
生成的接收方、发送方和处理程序简化了对 Rhapsody 事件的此处理。RIMB 的状态图可以按以下两种方式之一执行:
由 RTE 管理 - 到达 AR 接收方端口的数据元素变换为触发式操作。 数据元素到达时,RTE 将调用相应的操作,该操作将直接触发状态图过渡。 RIMB 可能为顺序的,不是活动管理器,也不是执行管理器,并且不需要 Rhapsody 事件。在此方式下,只有由于 AR 数据元素到达而引发的触发式操作才能触发状态图过渡。 不允许调用 RiCGEN。
由 Rhapsody 管理 - 到达 AR 接收方端口的数据元素变换为 Rhapsody 事件。数据元素到达时,将调用一项活动操作,该操作将使相应 Rhapsody 事件在 RIMBO 的事件队列中排队。RIMB 需要进行定期活动并且是执行管理器。 该实现块的 doExecute 将定期运行,并且会将事件逐个分派到状态图中,从而模仿一般 Rhapsody 机制。
将 RIMB 定义为“顺序”
对 RIMB 接收方端口 p 上的每个应该触发过渡的属性 x 使用名称 evP_x 来定义触发操作
x 的访问方式必须为显式阻塞或显式非阻塞(例如,不是隐式),并且它的类型必须由常规 C 类型确定(例如,不是 Rhapsody 事件)
使用这些触发操作撰写状态表,用作过渡触发器
对每个这样的 p.x 定义一个活动操作以用作 p.x 的 分派器
实现活动操作必须调用 receiveAndHandleP_x()
无论是在“由 RTE 管理”还是“由 Rhapsody 管理”方式下,此步骤相同。区别在于,Rhapsody 为 receiveAndHandleP_x() 生成的代码不同。
将状态图的所有分派器都标记为“受防护”,以确保由独立可运行实体激活的分派器之间互相排斥
将 RIMB 定义为具有“定期”执行策略的“活动”
使用 Rhapsody 事件来确定 RIMB 接收方接口类型化端口上的属性类型
接收方端口 p 上的 AR 数据元素 x 将触发在事件队列中添加 ev 事件
端口 p 的 RIMB 接收方接口上的 x 的类型必须由 ev 确定
ev 是状态图上的事件名称,而不是 p.x 上的名称
ev 与 p.x 的绑定是通过使 x 的类型由 ev 确定来实现的。
使用 Rhapsody 事件 ev 撰写状态表,用作过渡触发器
对每个这样的 p.x 定义一个活动操作以用作 p.x 的 轮询
实现活动操作应该调用 receiveAndHandleP_x()
无论是在“由 RTE 管理”还是“由 Rhapsody 管理”方式下,此步骤相同。区别在于,Rhapsody 为 receiveAndHandleP_x() 生成的代码不同。