我想知道,当这些模块处于不同的架构级别时,一个好的嵌入式sw架构师将如何选择在不同C文件模块上使用相同代码部分的最佳选择。
每个模块都是一个带有内部和外部函数的file.c,其对应的.h文件带有公共函数声明。
我有1)低级模块,2)中级模块,3)高级模块和4)应用级模块。其中4)调用3)函数,3)调用2)函数等。
但我已经意识到1),2)和3)函数中的一些函数在它们的例程的不同点处执行相同的指令。如果某些1)例程中的一部分代码也出现在某些2)和3)模块的例程中,那么做一个好的和有效的代码架构设计的最佳选择是什么?
我的第一个想法是将指令集打包在公共function_x中,并在头文件中声明它,以便为上层模块函数调用它。作为建筑师我学到了:
事实上,我已经继承了一个旧项目,他们通过数字输出写入一个字节,通过串行总线将字节发送到电位计。但是他们已经实现并声明了相同的功能,其名称与每个模块/文件的内部功能相同。其他时候我发现他们在其他例程中重写了这段代码,在那里我只调用例程而不是。我认为它可以改进。
所以,我的怀疑是:
一些提示和经验(不是一个决定性的答案)。
实用程序函数可以打包在一个或多个源级“库”C文件中。它们是实用程序,因此不是特定于硬件的,只能实现重复性任务。例如,strcmp
是一个效用函数。您还可以将这些作为真正的对象库提供给开发人员/团队。
数据结构及其操作可以在它们自己的模块(C文件)中实现。例如,Btree或链表。
硬件特定功能是您的“1级”低级功能。它们提供API,没有人可以直接操作硬件;只有通过这个API。您可以“堆叠”API,提供越来越多的抽象,但您也可以将其视为“1级”设计,它本身由多个级别组成。
应用级编码使用前面描述的所有内容。
在你的关卡中不要过于教条。必要时,更高级别的函数可以直接调用低级函数,而不强制它通过中间级别。从上到下的干净设计通常很难实现。