分层组件-语法
组件定义可以包括组合和配置部分。组合和配置节必须是组件定义中的最后一项。组合和配置部分可以按任何顺序显示。可以在没有配置的情况下包含组合节,但是只有在存在组合时才允许包含配置节。
component Foo_Impl {
provides iface_a a_impl;
attribute string str;
}
component Foo {
provides iface_a a;
composition {
component Foo_Impl fi;
export fi.a_impl -> a;
}
configuration {
fi.str = "Hello, World!";
}
}
component Bar {
control;
uses iface_a a;
}
assembly {
composition {
component Foo f;
component Bar b;
connection seL4RPCCall c(from b.a, to f.a);
}
}
对于复合元件的每个实例,元件内声明的任何内部实例和内部连接都将复制到顶级组件中,复合元件实例的名称前面附加在它们自己的名称前面。在顶级组件的连接中,某个复合元件实例的虚拟接口的每个外观都会被替换为在解析该复合元件实例时复制到顶级组件中的内部实例的导出接口。然后,对于每个复合组件,将删除所有虚拟接口。如果这导致任何组件没有接口,则这些组件以及此类组件的所有实例都将从规范中删除。
component Foo_Impl {
provides iface_a a_impl;
attribute string str;
}
component Bar {
control;
uses iface_a a;
}
assembly {
composition {
component Bar b;
component Foo_Impl f.fi;
connection seL4RPCCall c(from b.a, to f.fi.a_impl);
}
configuration {
f.fi.str = "Hello, World!";
}
}
例子
连接多个复合组件:
连接的两端都可以是虚拟接口
component Foo_Impl {
provides iface_a a_impl;
}
component Bar_Impl {
uses iface_a a_usage;
}
component Foo {
provides iface_a a;
composition {
component Foo_Impl fi;
export fi.a_impl -> a;
}
}
component Bar {
uses iface_a a;
composition {
component Bar_Impl bi;
export bi.a_usage -> a;
}
}
assembly {
composition {
component Foo f;
component Bar b;
connection seL4RPCCall c(from b.a, to f.a);
}
}
此示例编译为
component Foo_Impl {
provides iface_a a_impl;
}
component Bar_Impl {
uses iface_a a_usage;
}
assembly {
composition {
component Foo_Impl f.fi;
component Bar_Impl b.bi;
connection seL4RPCCall c(from b.bi.a_usage, to f.fi.a_impl);
}
}