当同一代码部分 used/executed 被项目的大部分 modules/code 文件分布在不同的架构级别时的设计解决方案
Design solutions when the same code part is used/executed by great part of a project modules/code files diferent architecture level distributed
我想知道当这些模块处于不同的体系结构级别时,优秀的嵌入式 sw 架构师将如何选择最佳选项以在不同的 C 文件模块中使用相同的代码部分。
每个模块都是一个 file.c,具有内部和外部函数,其相应的 .h 文件具有 public 函数声明。
我有 1) 低级模块,2) 中级模块,3) 高级模块和 4) 应用程序级模块。其中 4) 调用 3) 函数,3) 调用 2) 函数等。
但我已经意识到 1)、2) 和 3) 函数中的某些函数在其例程的不同点执行相同的指令。如果某些 1) 例程中的部分代码也存在于某些 2) 和 3) 模块的例程中,那么进行良好且高效的代码架构设计的最佳选择是什么?
我的第一个想法是将指令集打包成public function_x,并在头文件中声明,以便上层模块函数调用。作为建筑师,我学到了:
- 将头文件file_x.h视为一个模块API以供其他和上层文件查看和使用(模块之间唯一的接口通信)。
- 如果 API 函数在实现它们的同一模块 file_x.c 中用作内部函数,这不是一个好的设计。
- 即:4) 模块无法直接与 1) 模块 API 通信。一个4)模块函数只能调用一个3)模块API函数,3)模块函数只能调用一个2)模块函数;因此 2) 模块函数只能调用 1) 模块函数。
事实是我继承了一个旧项目,他们通过数字输出写了一个字节,通过串行总线将字节发送到电位计。但是他们已经实现并声明了相同的函数,在每个 module/file 处使用与内部函数相同的名称。其他时候我发现他们在其他例程中重写了这段代码,我只是调用例程而不是。我认为它可以改进。
所以,我的疑惑是:
将指令集打包到 1) 模块级别的函数中并从其余级别的模块调用是否是一个好的设计?
如果 2) level 模块也打包 1) level 模块函数,给出一个不同的名称并将其带到它的 API header,准备好用于 3 level 是一个更好的主意模块功能?
如果我也在不同的模块中使用代码,但它们属于同一模块级别怎么办?
如果同一个函数需要作为内部函数使用,同时又需要作为public函数被其他文件调用,你如何面对设计
一些提示和经验(不是决定性的答案)。
实用函数可以打包在一个或多个源代码级 "library" C 文件中。它们是实用程序,因此不是特定于硬件的,并且仅执行重复性任务。例如 strcmp
是效用函数。您还可以将这些作为真正的对象库提供,您可以将它们分发到 developers/teams.
数据结构及其操作可以在自己的模块(C 文件)中实现。例如 Btree 或链表。
硬件特定功能是您的 "level 1" 低级功能。他们提供了一个API,没有人可以直接操作硬件;只有通过这个API。您可以 "stack" APIs,提供越来越多的抽象,但您也可以将其视为本身包含多个级别的 "level 1" 设计。
应用程序级编码使用前面描述的所有内容。
关卡不要太教条。必要时,更高级别的功能可以直接调用低级别功能,而无需强制它通过中间级别。一个干净的自上而下的设计通常很难实现。
我想知道当这些模块处于不同的体系结构级别时,优秀的嵌入式 sw 架构师将如何选择最佳选项以在不同的 C 文件模块中使用相同的代码部分。
每个模块都是一个 file.c,具有内部和外部函数,其相应的 .h 文件具有 public 函数声明。
我有 1) 低级模块,2) 中级模块,3) 高级模块和 4) 应用程序级模块。其中 4) 调用 3) 函数,3) 调用 2) 函数等。
但我已经意识到 1)、2) 和 3) 函数中的某些函数在其例程的不同点执行相同的指令。如果某些 1) 例程中的部分代码也存在于某些 2) 和 3) 模块的例程中,那么进行良好且高效的代码架构设计的最佳选择是什么?
我的第一个想法是将指令集打包成public function_x,并在头文件中声明,以便上层模块函数调用。作为建筑师,我学到了:
- 将头文件file_x.h视为一个模块API以供其他和上层文件查看和使用(模块之间唯一的接口通信)。
- 如果 API 函数在实现它们的同一模块 file_x.c 中用作内部函数,这不是一个好的设计。
- 即:4) 模块无法直接与 1) 模块 API 通信。一个4)模块函数只能调用一个3)模块API函数,3)模块函数只能调用一个2)模块函数;因此 2) 模块函数只能调用 1) 模块函数。
事实是我继承了一个旧项目,他们通过数字输出写了一个字节,通过串行总线将字节发送到电位计。但是他们已经实现并声明了相同的函数,在每个 module/file 处使用与内部函数相同的名称。其他时候我发现他们在其他例程中重写了这段代码,我只是调用例程而不是。我认为它可以改进。
所以,我的疑惑是:
将指令集打包到 1) 模块级别的函数中并从其余级别的模块调用是否是一个好的设计?
如果 2) level 模块也打包 1) level 模块函数,给出一个不同的名称并将其带到它的 API header,准备好用于 3 level 是一个更好的主意模块功能?
如果我也在不同的模块中使用代码,但它们属于同一模块级别怎么办?
如果同一个函数需要作为内部函数使用,同时又需要作为public函数被其他文件调用,你如何面对设计
一些提示和经验(不是决定性的答案)。
实用函数可以打包在一个或多个源代码级 "library" C 文件中。它们是实用程序,因此不是特定于硬件的,并且仅执行重复性任务。例如 strcmp
是效用函数。您还可以将这些作为真正的对象库提供,您可以将它们分发到 developers/teams.
数据结构及其操作可以在自己的模块(C 文件)中实现。例如 Btree 或链表。
硬件特定功能是您的 "level 1" 低级功能。他们提供了一个API,没有人可以直接操作硬件;只有通过这个API。您可以 "stack" APIs,提供越来越多的抽象,但您也可以将其视为本身包含多个级别的 "level 1" 设计。
应用程序级编码使用前面描述的所有内容。
关卡不要太教条。必要时,更高级别的功能可以直接调用低级别功能,而无需强制它通过中间级别。一个干净的自上而下的设计通常很难实现。