C中的大结构初始化

时间:2018-10-08 13:26:27

标签: c initialization embedded structure

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

richTextBox1.AppendText("foo");

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

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

richTextBox1.Paste();

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

getAssetTypesPromise() Observable<any> {
  return new Promise((resolve, reject) => {
      this.getAssetTypes().subscribe((response: any) => {
        resolve(response);
      }, reject);
    });
}

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

定义

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

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

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

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

T_EEPROM MyConfig;

障碍:写作繁重

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

MyConfig.Param1 = NewValue;
WriteEEPROM(MyConfig);

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

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)
        [...]
}

障碍: 内存非常大,因为每个工厂配置都有一个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}, [...] }; 实例。

有人有更好的主意吗?

2 个答案:

答案 0 :(得分:2)

在您提供的所有方案中(可能性),这些值都必须作为变量或作为初始化变量的值在内存中。因此,内存占用没有太大差异。使用初始化函数会产生执行初始化所需的代码字节开销。

具有一个包含所有值的静态数组,并且每次需要一个值时都对其进行索引,因此具有指示数组索引的开销。将数组索引的值复制到“工作集”变量中会产生额外变量的开销。

可能您可以通过制作多个版本来测量最小的版本,例如:

  • 为每个参数访问建立索引的一个静态数组;

  • 一个静态数组,并将工作集复制到一个额外的变量中;

  • 使用初始化函数初始化工作集变量。

但是这假设工作值的集合在执行期间可以更改。如果它们没有变化,则可以使用#define s选择值的工作集,并将其用于工作集变量的静态初始化。

答案 1 :(得分:0)

这是简短而干净的:

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];
}