C语言 在支持多设备的代码库中实现配置文件的动态选择的过程是什么?

but5z9lq  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(113)

我正在使用两个密切相关的设备,它们有着大多数相似之处,但也有明显的差异。具体地,设备1表示设备2的较旧迭代。每个设备都有自己独立的代码库(用C编写)。我的目标是将这些代码库合并为一个统一的代码库,该代码库可以根据所连接的设备动态地适应并正确地公开相关的默认和配置文件。
这里的关键要求是需要在运行时确定这些值。我目前不确定在运行时启用选择config.h文件的方法。
项目结构:

parent directory
│
├── device1_config
│   └── config.h
│
├── device2_config
│   └── config.h
│
└── Source files

该项目在SoftConsole中开发。通过从寄存器阅读来检测器件。目前,我已经设置了两个不同的构建配置,每个配置都有自己的路径指向相应的config.h文件。但这违反了运行时配置要求。
我目前正在努力解决实现适应不同硬件配置的可适应运行时代码的挑战。我如何才能有效地实现这一点?
到目前为止,我已经探索了几种方法来实现对config.h文件和可适应代码库的选择:
1.我尝试在源代码中使用预处理器指令,根据特定的设备类型或配置有条件地合并相关的config.h文件。然而,该方法仅解决了在编译时的确定,而不是在运行时期间。
1.另一种方法涉及在每个config.h文件中插入像**#define DEVICE_1_ENABLED**这样的指令。随后,我在源文件中设计了一个函数,试图根据以下条件初始化配置:

void initConfig(){
    #ifdef DEVICE1
    #include "/device1_config/config.h"
    #endif
    // ... other devices
}

但是......由于可见性问题,这种解决方案并不完全有意义。如果头文件还没有建立,DEVICE1将如何定义...
1.我探索了构造统一的config.h文件并使用**#ifdef指令的选项。但是,我认识到这种方法只能在编译时进行配置,这与我的需求不符。
此外,我的项目需要动态包含各种其他文件,例如
DEVICE1_regs.hDEVICE2_regs.h**,以及其他五个文件。config.h问题的解决方案也可能扩展到解决这些包含需求。

mnemlml8

mnemlml81#

您真的希望在运行时选择配置,还是希望在编译时选择配置?我问这个问题是因为你使用了预处理器条件,这些条件是在编译时处理的,而不是在运行时。
我不知道配置文件的内容,但如果你真的想在运行时加载它们,也许你正在寻找一个结构体数组?其中,每个结构体将包含设备ID和相关设备. h文件的内容,以便在阅读设备ID寄存器后,您可以在运行时**从数组中选择正确的结构体。

struct device_configuration
{
    uint8_t device_id;
    uint8_t cfg_value_0
    uint16_t cfg_value_1;
    uint32_t cfg_value_2;
};

// this is the content of all config.h files stored in the "configs" array
struct device_configuration configs[] = {
    {0xAB, 0x00, 0x0001, 0x00000002}, // device 1, device-id = 0xAB
    {0xBE, 0x00, 0x0001, 0x00000002}, // device 2, device-id = 0xBE
};

struct device_configuration* my_config = NULL;

// now you can select a configuration at runtime like this:
uint8_t device_id = read_devid_register();
for (uint32_t i = 0; i < 2; i++) {
    if (configs[i].device_id == device_id) {
         my_config = &configs[i];
    }
}

// use config value to calibrate xtal or whatever
xtal_trim(my_config->cfg_value_0);

但是,如果你想在编译时选择相关的头文件,因为你想从同一个源构建两个设备,但它们有不同的引脚,或者设备1缺少外部ic或其他东西,你可以:
1.用特性标志封装使用的模块/驱动程序,特性标志在ide/makefile中启用。
1.根据您正在编译的设备,只需设置正确的包含路径以指向deviceN_config/。
例如,当编译device 1时(我在这里使用gcc作为示例):

// compile for device 1
gcc -c -Idevice1_config/ source.c

// source.c
#include <config.h> // automatically selected device1_config/config.h because of the include path (-I option).

相关问题