1. Module
Module 是逻辑强相关的功能单元,以统一的组织结构提供逻辑处理单元块,其内部主要包含如下信息:

- a set of Ports:用于传入和传出数据的 endpoint,port 包含如下属性:
- id:port id, Module 内部唯一, id名只能由下划线、字母和数字组成,且以英文字母或者下划线开头 ;
- direction:IN/OUT;
- msg_type: 接受/发送的消息类;
- serializer:消息通讯使用的序列化/反序列化方式,目前支持 serializer 有:
- DoNothingSerializer:消息不做任何序列化,此方式只支持进程内通信;dataflow层面的接口为:
- RawSerializer:对于一些场景,例如数据录制、数据落盘等场景,需要直接获取二进制数据落盘,而不是获取到消息再进行序列化落盘。针对这种场景,可以使用RawSerializer创建input port接收二进制数据;或者同一个pub需要发送多种类型的数据,用户自行将数据序列化好后,通过rawserializer将二进制数据发送出去,接收端收到二进制数据后再自行解析。此方式支持进程间通信;dataflow层面的接口为:
- ProtobufSerializer:以 PB 方式序列化/反序列化,支持跨进程,用于 pb 工具定义的 msg,支持进程间通信;dataflow层面的接口为:
- MESSAGE_CLASS##_TypeSupport:Bole IDL 序列化,支持跨进程,用于 Bole IDL 工具生成的msg。 dataflow层面的接口为:
SERIALIZER: 用户自定义的serializer,非框架自带,是否支持跨进程由实现决定。dataflow层面的接口为:
- a set of Procs:逻辑处理的描述,是调度执行的最小单元,默认每个 Proc 占用一个线程,Proc 包含如下属性:
- id:proc id, Module 内部唯一, id名只能由下划线、字母和数字组成,且以英文字母或者下划线开头;
- Proc type:Dataflow 抽象出的逻辑场景类型,主要有:
- DF_MSG_TIMER_PROC:周期触发型,用户可以配置 Proc 执行的周期、次数。同时周期性触发型 Proc 也可以接受消息,默认行为是将周内收到的所有消息(包括周期内没有消息到来,也会触发执行),传递给 Proc;用户也可设置只获取周期内部分消息传递给 Proc;
DF_MSG_TIME_STAMP_SYNC_PROC:时间戳匹配型,Proc 依赖多路消息,只有多路消息的时间戳正负值符合设置的阈值,则将符合条件的消息传递给 Proc;
- DF_MSG_COND_PROC:条件触发型,Proc 依赖多路消息,用户可以设置条件,如 Input1 需要有2条消息并且 Input2 需要有3条消息,一旦条件满足,则将相关消息传递给 Proc;默认行为是所有路至少存在1条消息。
DF_RESIDENT_PROC:常驻任务,Proc 随着 module 启动而启动,此类 Proc 会一直占用一个线程。
- Input port list: Proc 依赖的 Input Port 列表,Module 中的 Input Port 可以被多个 Proc 依赖;
- Output port list:Proc 发送消息的 Output Port 列表,Module 中的 Output Port 可以被多个 Proc 依赖;
- function:Proc 绑定的回调函数,由用户实现逻辑。
2. schedulegroup
Schedulegroup 是调度器资源的分组,不同的分组代表着不同的调度策略,有可能是针对 IO 密集型的任务,亦或是周期型任务等。ScheduleGroup 调度的对象是 Module 中的 Proc,一个进程中可以存在多种调度策略的 Schedulegroup。

如上图所示,一个进程中创建了三个 Schedulegroup(三种不同背景色的椭圆),用户可依据 Proc 的特性绑定到特定的 Schedulegroup 上。
3. 编程范式
3.1 module 设计

Module 设计主要是规划 Module 需实现的功能点以及和外部交互的方式。TROSModule 是 Module 的组织方式,可视为多个Module类的动态库,一个 TROSModule 对应一份.trosmodule 文件,.trosmodule 文件中描述了库中每个 Module 类的属性:
类名
Module 类型
Input 和 Output Ports
Procs
.trosmodule 的内容如下:
可通过 Studio UI 进行 Module 的设计。
3.2 module 生成
Module 的生成包含三部分:
代码生成工具依据 .trosmodule 文件生成一系列的 c++ .h .cpp 文件,主要包含 Module 的框架代码;

逻辑代码填充
对于Proc的回调函数,填充具体的逻辑实现,如上图中的相关函数:
TROSModule生成

3.3 graph构建
graph (顶层 graphlet ) 构建主要是用户依据自己的业务场景,将 port 直接通过连线串联,形成整个业务 graph。其中用户可以通过创建 GraphLet 来分解复杂 Application 以及逻辑子图的复用。整个 graph 构建可通过 Studio UI 进行相关操作。

3.4 部署配置
部署配置主要完成如下工作:
graph 进程级别的划分(下图中不同颜色的色块表示不同的进程);
进程资源的分配(ScheduleGroup 属性配置,下图中椭圆表示一个 Schedulegroup);
执行单元和调度资源的绑定(将 Proc 和 Schedulegroup 进行绑定,如果配置文件中未进行绑定,默认行为是 Proc 运行在一个独立的线程上);
执行单元运行时参数配置。

3.5 Application 运行
dataflow 框架提供了 launch2 和 mainboard2 工具,配合 package 以及部署配置文件,将整个 Application 运行起来。

