首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C中的大型结构体

C中的大型结构体
EN

Stack Overflow用户
提问于 2018-10-08 13:26:26
回答 2查看 343关注 1票数 1

我有一个选择,以初始化一个大的结构,在C,我正在工作的嵌入式微型和一个微小的内存大小。我把芯片配置保存在EEPROM中。因此,我有一个包含EEPROM中所有配置页面的结构:

代码语言:javascript
复制
Typedef struct
{
    unsigned int Param1;
    float Param2;
    unsigned char Param3;
    [...]
    char Paramx[SIZE];
} T_EEPROM;

我们必须记住,对于微型内存的微小大小,这个结构是很重的。

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

代码语言:javascript
复制
T_EEPROM MyConfig;

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

代码语言:javascript
复制
MyConfig.Param1 = NewValue;
WriteEEPROM(MyConfig);

现在我想用不同类型的工厂配置(配置A、配置B等)初始化这个变量--每个工厂配置的所有参数都可以通过#define来定义

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

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

代码语言:javascript
复制
bool InitEEPROM(unsigned int param1, float param2, unsigned char param3, [...], char *Paramx)
{
    MyConfig.Param1 = param1;
    MyConfig.Param2 = param2;
    MyConfig.Param3 = param3;
    [...]
    MyConfig.Paramx = paramx;
}

之后,我可以调用函数湖:

代码语言:javascript
复制
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)创建一个包含所有工厂配置的大数组:

代码语言:javascript
复制
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},
    [...]
};

具有更简单的初始化功能:

代码语言:javascript
复制
bool InitEEPROM(T_EEPROM factoryConfig)
{
    MyConfig.Param1 = factoryConfig.Param1 ;
    MyConfig.Param2 = factoryConfig.Param2;
    MyConfig.Param3 = factoryConfig.Param3;
    [...]
    MyConfig.Paramx = factoryConfig.Paramx;
}

而这一呼吁:

代码语言:javascript
复制
void InitFactoryEEPROM (unsigned char type)
{
    InitEEPROM(FactoryEepromConfig[type]);
}

Dis冒险主义:内存很重,因为我为每个工厂配置都有一个T_EEPROM实例。

有人有更好的主意吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-08 13:41:04

这是简短而干净的:

代码语言:javascript
复制
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];
}

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

代码语言:javascript
复制
void InitFactoryEEPROM (T_EEPROM* config, size_t type)
{
    assert(type < CONFIG_COUNT);
    *config = FactoryEepromConfig[type];
}
票数 0
EN

Stack Overflow用户

发布于 2018-10-08 13:48:51

在您给出的所有场景的(可能性)中,这些值需要作为变量或作为初始化变量的值存在于内存中。因此在内存占用方面没有太大的差异。使用初始化函数具有执行初始化所需的代码字节的开销。

如果有一个包含所有值的静态数组,并且每次需要一个值时都要进行索引,则需要对数组进行索引的指令开销。将数组索引的值复制到“工作集”变量有额外变量的开销。

也许你可以通过制作几个版本来衡量哪个是最小的,例如:

  • 为每个参数访问建立索引的静态数组;
  • 一个静态数组并将工作集复制到一个额外的变量;
  • 使用初始化函数初始化工作集变量。

但是,这假设值的工作集可以在执行过程中更改。如果它们不改变,那么您可以使用#define来选择值的工作集,并将其用于工作集变量的静态初始化。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52703384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档