C中的大结构初始化

巴蒂斯特

我可以选择在C中初始化一个大结构。我正在开发一个内存很小的嵌入式微型计算机。我已经将芯片配置保存在EEPROM中。所以我有一个结构,其中包含EEPROM中的所有配置页:

Typedef struct
{
    unsigned int Param1;
    float Param2;
    unsigned char Param3;
    [...]
    char Paramx[SIZE];
} T_EEPROM;

我们必须记住,就微型存储器的微小内存而言,此结构很繁琐。

我有这种类型的全局变量:

T_EEPROM MyConfig;

这用于修改或访问EEPROM配置:

MyConfig.Param1 = NewValue;
WriteEEPROM(MyConfig);

现在,我想用不同的工厂配置(CONFIG A,CONFIG B等)来初始化此变量。每个工厂配置的所有参数都可以由#define定义。

之后,我不知道该使用哪种方法:

1)编写一个初始化函数,该函数接受参数中的所有值:

bool InitEEPROM(unsigned int param1, float param2, unsigned char param3, [...], char *Paramx)
{
    MyConfig.Param1 = param1;
    MyConfig.Param2 = param2;
    MyConfig.Param3 = param3;
    [...]
    MyConfig.Paramx = paramx;
}

之后,我可以将函数湖称为:

void InitFactoryEEPROM (unsigned char type)
{
    if (type == 1)
        InitEEPROM(DEFINE_PARAM1_CONFIG_1, DEFINE_PARAM2_CONFIG_1,DEFINE_PARAM3_CONFIG_1, [...], DEFINE_PARAMx_CONFIG_1);
    else if (type == 2)
        InitEEPROM(DEFINE_PARAM1_CONFIG_2, DEFINE_PARAM2_CONFIG_2,DEFINE_PARAM3_CONFIG_2, [...], DEFINE_PARAMx_CONFIG_2);
    else if (type == 3)
        [...]
}

缺点:写得很重

2)创建一个具有所有出厂配置的大型阵列:

T_EEPROM FactoryEepromConfig[CONFIG_COUNT] =
{
    {DEFINE_PARAM1_CONFIG_1, DEFINE_PARAM2_CONFIG_1, DEFINE_PARAM3_CONFIG_1, [...], DEFINE_PARAMx_CONFIG_1},
    {DEFINE_PARAM1_CONFIG_2, DEFINE_PARAM2_CONFIG_2,DEFINE_PARAM3_CONFIG_2, [...], DEFINE_PARAMx_CONFIG_2},
    [...]
};

通过更简单的初始化功能:

bool InitEEPROM(T_EEPROM factoryConfig)
{
    MyConfig.Param1 = factoryConfig.Param1 ;
    MyConfig.Param2 = factoryConfig.Param2;
    MyConfig.Param3 = factoryConfig.Param3;
    [...]
    MyConfig.Paramx = factoryConfig.Paramx;
}

这个电话:

void InitFactoryEEPROM (unsigned char type)
{
    InitEEPROM(FactoryEepromConfig[type]);
}

缺点:由于T_EEPROM每个工厂配置都有一个实例,因此内存非常大

有人有更好的主意吗?

哥科菲

这很简短:

static const T_EEPROM FactoryEepromConfig[CONFIG_COUNT] =
{
{DEFINE_PARAM1_CONFIG_1, DEFINE_PARAM2_CONFIG_1, DEFINE_PARAM3_CONFIG_1, [...],     DEFINE_PARAMx_CONFIG_1},
{DEFINE_PARAM1_CONFIG_2, DEFINE_PARAM2_CONFIG_2,DEFINE_PARAM3_CONFIG_2, [...],     DEFINE_PARAMx_CONFIG_2},
[...]
};

void InitFactoryEEPROM (size_t type)
{
    assert(type < CONFIG_COUNT);
    MyConfig = FactoryEepromConfig[type];
}

为了避免全局变量,您可以将函数更改为此:

void InitFactoryEEPROM (T_EEPROM* config, size_t type)
{
    assert(type < CONFIG_COUNT);
    *config = FactoryEepromConfig[type];
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章