- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
背景:
我们正在为一个新的嵌入式系统建模固件。目前正在用 UML 对固件进行建模,但不会使用 UML 建模工具的代码生成功能。
目标语言将是 C(具体来说是 C99)。
低功耗(即性能、快速执行)和正确性很重要,但正确性是重中之重,高于一切,包括代码大小和执行速度。
在为系统建模时,我们确定了一组定义明确的组件。每个组件都有自己的接口(interface),许多组件与许多组件交互。
模型中的大多数组件将是实时操作系统 (RTOS) 下的独立任务(线程),尽管有些组件只不过是库。任务完全通过消息传递/队列发布相互通信。与库的交互将采用同步函数调用的形式。
因为意见/推荐可能取决于规模,我将提供一些信息。现在可能有大约 12-15 个组件,可能会增加到 20 个左右?不是 100 多个组件。假设平均而言,每个组件与 25% 的其他组件交互。
在component diagram ,有端口/连接器用于表示组件之间的接口(interface),即一个组件提供另一个组件所需的东西。到目前为止一切顺利。
难点在于:在很多情况下我们不希望“组件 A”访问所有“组件 B”的接口(interface),即我们希望将组件 A 限制为组件 B 提供的接口(interface)的子集。
问题/问题:
是否有一种系统的、相当直接的方式来执行(最好是在编译时)在组件图上定义的接口(interface)契约?
显然,编译时解决方案优于运行时解决方案(更早的检测、更好的性能、可能更小的代码)。
例如,假设库组件“B”提供函数 X()、Y() 和 Z(),但我只希望组件“A”能够调用函数 Z(),而不是 X() 和Y()。类似地,即使组件“A”可能能够通过其消息队列接收和处理大量不同的消息,我们也不能让任何组件能够向任何组件发送任何消息。
我能想到的最好办法是为每个组件-组件接口(interface)设置不同的头文件,并且只公开(通过头文件)允许组件使用的接口(interface)部分。显然,这可能会导致产生大量的头文件。这也意味着组件之间的消息传递不会直接使用 OS API 完成,而是通过函数调用完成,每个函数调用构建并发送特定(允许的)消息。对于同步调用/库,只会公开允许的 API 子集。
对于这个练习,你可以假设人们会表现得很好。换句话说,不要担心人们直接欺骗、剪切和粘贴函数原型(prototype),或者包括他们的头文件不允许。如果不允许,他们不会直接将消息从“A”发布到“B”,等等...
也许有一种方法可以通过编译时断言来执行契约(Contract)。也许有一种更优雅的方法可以在运行时检查/强制执行此操作,即使它会产生一些开销。
代码必须干净地编译和 lint,所以“函数原型(prototype)防火墙”方法是可以的,但似乎可能有更惯用的方法来做到这一点。
最佳答案
标题的想法是合理的,但是,根据您的组件之间的交错,将每个组件的接口(interface)划分为多个具有自己的头文件的子类别而不是提供头文件可能会更清晰对于每个组件-组件-连接。
子类别不一定是不相交的,但要确保(通过预处理器指令)您可以混合类别而无需重新定义;这可以以系统的方式实现,方法是为每个类型或函数声明创建一个带有自己的包含保护的头文件,然后从这些原子 block 构建子类别头文件。
关于c - 如何在编译时执行接口(interface)契约(在 C 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4027449/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!