gpt4 book ai didi

c - 嵌入式c编程背景下高效传递变量给模块

转载 作者:太空狗 更新时间:2023-10-29 17:22:59 25 4
gpt4 key购买 nike

我在嵌入式目标中编写 C 语言。由于日益增加的复杂性和可测试性问题,模块化是必须的。

乍一看,该程序是一个控制循环。使用内部硬件读取物理输入,应用一些计算,并应用计算输出。然而,控制相当复杂,并且有许多内部状态和变化的变量。

此控件分为不同的模块,捆绑了不同状态的功能。常见的任务/计算在单独的模块中提供,并在不同的模块中调用,以保持我自己的 DRY。为了在整个项目中实现枚举和类型的一致性,使用了顶级 .H 文件(因为就我而言,继承等 OO 策略在我的框架中不是一个选项)。

我的问题出现在决定如何将变量传入和传出模块时。

我最初的做法是:

mymodule.H:

struct Inputs{
int input1;
...
int inputN;
}

struct Outputs{
int output1;
...
int outputN;
}

void mymodule(Inputs in,Outputs* out);

并且在主函数(或调用该模块的模块)中创建了“输入”和“输出”类型的结构。

然后,将变量复制到 Inputs 结构,调用函数(引用 Outputs 结构),一旦完成,该结构的内容将用于进一步的计算。

但是,这会导致大量内存占用,因为每个模块都需要在调用模块中创建 InputType 和 OutputType 的实例。在我看来,这不是一个优雅的解决方案。顺便说一句,我的项目不允许动态分配。

您能否为我提供一些指导方针和/或替代想法以获得良好的解决方案?

谢谢。

已添加

其中一个解决方案可能是将 InputStruct 也作为指针传递,但由于它们实际上是模块的输入,我如何确保它们没有随着代码被修改?

已添加

顺便说一句,出现的另一个问题是并非所有模块都接收相同的变量,并且没有可用的继承机制(因为这是 C),每个模块的结构都必须加载正确的值。我很困惑......

最佳答案

您不必接受将参数传入和传出函数所占用的大量内存。关键是通过引用传递参数,并使用 const 关键字来确保输入不被修改。一个众所周知的例子是:

int strcpy(char *destination, const char *source);

其中只有指向源和目标字符缓冲区的指针被传入,而不是缓冲区的副本,但是 const 关键字阻止 strcpy() 修改源缓冲区的内容。

如果你有太多的参数以至于单独传递每个参数是不切实际的,那么一定要将指向结构的指针传递到你的函数中,再次使用 const 关键字来保证输入不被修改:

int myFunc(struct myFuncOut *outputs, const struct myFuncIn *inputs);

因为结构是通过引用传递的,所以 myFunc() 将在调用函数使用的同一内存上运行(但它将无法写入 inputs 指向的内存,感谢const 关键字),因此将其传递给函数的内存开销仅为指针的内存开销,在典型的嵌入式系统中指针为四个字节,并且没有复制开销。


至于你的第二个隐含问题,一个函数的输出需要作为输入传递给另一个函数,但参数列表不相同,除了从一个结构复制到其他。如果你幸运的话,你也许可以做这样的事情:

struct myFunc1Out
{
int common1;
int common2;
int common3;
};
struct myFunc2In
{
int common1;
int common2;
int common3;
int special1;
int special2;
}

struct myFunc2In data;

myFunc1((struct myFunc1Out *)(*data), *inputs);
data.special1 = 1;
data.special2 = 2;
myFunc2(*outputs, *data);

你看到这里发生了什么吗? struct myFunc2In 的第一部分与 struct myFunc1Out 相同,因此您可以将前者转换为后者,多余的字段将被忽略。您可以将其视为(非常)可怜的人的多态性。

另一种可能不那么晦涩的方法是将结构 myFunc1Out 与附加参数的第二个结构一起传递给第二个函数。额外的内存成本是一个指针。或许您可以将数据组织成逻辑组,每个组由一个结构表示,这样就没有太多的结构,但没有结构包含在使用该结构的其余部分时并不总是需要的字段?


顺便说一下,您的一条评论似乎暗示您希望结构的定义在可执行文件中有内存开销。这不是真的。仅当分配结构的实例时才使用内存。

关于c - 嵌入式c编程背景下高效传递变量给模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15924752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com