小编Man*_*nex的帖子

效率将变量传递给嵌入式c编程背景中的模块

我在嵌入式目标中编写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),每个模块的结构都必须加载适当的值.我很混淆......

c embedded performance paradigms modularity

6
推荐指数
1
解决办法
1738
查看次数

在cpp项目内编译的c模块中无法识别内联关键字(VS2005)

我正在开发一个符合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)

c c++ inline

2
推荐指数
1
解决办法
797
查看次数

标签 统计

c ×2

c++ ×1

embedded ×1

inline ×1

modularity ×1

paradigms ×1

performance ×1