我在嵌入式目标中编写C语言.由于日益复杂和可测试性问题,模块化是必须的.
一目了然,该程序是一个控制循环.使用内部硬件读取物理输入,应用一些计算并应用计算输出.但是,控件非常复杂,并且具有许多内部状态和变化的变量.
该控件分为不同的模块,捆绑不同状态的功能.常见的任务/计算在不同的模块中提供,并在不同的模块中调用,以保持自己的干燥.对于整个项目中的枚举和类型一致性,使用了一个顶级的.H文件(就我而言,在我的框架中,诸如继承之类的OO策略不是一个选项).
在决定如何将变量传递给模块和从模块传递变量时,我的问题出现了.
我最初的做法是:
mymodule.H:
struct Inputs{
int input1;
...
int inputN;
}
struct Outputs{
int output1;
...
int outputN;
}
void mymodule(Inputs in,Outputs* out);
Run Code Online (Sandbox Code Playgroud)
并且在main函数(或调用此模块的模块)中创建了"Inputs"和"Outputs"类型的结构.
然后,将变量复制到Inputs结构中,调用该函数(引用Outputs结构),一旦完成,该结构的内容将用于进一步的计算.
但是,这会导致大量内存占用,因为每个模块都需要在调用模块中创建InputType和OutputType实例.在我看来,这不是一个优雅的解决方案.顺便说一下,我的项目中不允许动态分配.
您能否提供一些指导和/或替代想法以获得良好的解决方案?
谢谢.
添加
其中一个解决方案可能是将InputStruct也作为指针传递,但由于它们是模块的有效输入,我怎么能保证它们不会沿着代码修改?
添加
顺便说一句,出现的另一个问题是,并非所有模块都接收相同的变量,并且没有可用的继承机制(因为这是C),每个模块的结构都必须加载适当的值.我很混淆......
我正在开发一个符合C90标准的编译器中的嵌入式C应用程序,另一方面,为了测试和调试目的,在Matlab/Simulink中部署了应用程序与CPP文件的接口.使用Matlab MEX编译此捆绑包,Matlab MEX配置为使用Visual Studio 2005进行构建.
这意味着我们有一个CPP文件,以及一些完全构建的.C/.H文件.这个工作流程对我来说是成功的,使用#ifdef __cplusplus extern "C" {...}每个C调用的技巧.
但是,当由于嵌入式应用程序中的时间限制而需要内联函数时,我遇到了问题.
接下来,SSCCE内置VS2005:
main.cpp中
#include "c_method.h"
void main()
{
for(int b = 0; b < 9; b++)
int a = c_method(b);
}
Run Code Online (Sandbox Code Playgroud)
c_method.c
#include "c_method.h"
inline int inline_fun(int x)
{
return x+1;
}
int c_method(int b)
{
return inline_fun(b);
}
Run Code Online (Sandbox Code Playgroud)
c_method.h
#ifndef __C_METHOD_H__
#define __C_METHOD_H__
int c_method(int b);
#endif
Run Code Online (Sandbox Code Playgroud)
这提供了以下错误:
c_method.c(7) : error C2054: expected '(' to follow 'inline'
c_method.c(8) : error C2085: 'inline_fun' : not in formal parameter …Run Code Online (Sandbox Code Playgroud)