簡體   English   中英

C中的大結構初始化

[英]big struct init in 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實例,因此內存非常大。

有人有更好的主意嗎?

在您提供的所有方案中(可能性),這些值都必須作為變量或作為初始化變量的值存在內存中。 因此,內存占用沒有太大差異。 使用初始化功能會產生執行初始化所需的代碼字節開銷。

擁有一個包含所有值的靜態數組,並在每次需要一個值時都對其進行索引,這會產生指令對該數組進行索引的開銷。 將數組索引的值復制到“工作集”變量中會產生額外變量的開銷。

可能您可以通過制作多個版本來測量最小的版本,例如:

  • 為每個參數訪問建立索引的靜態數組;

  • 一個靜態數組,並將工作集復制到一個額外的變量中;

  • 使用初始化函數初始化工作集變量。

但這假設工作值的集合在執行期間會發生變化。 如果它們沒有變化,則可以使用#define來選擇值的工作集,並將其用於工作集變量的靜態初始化。

這是簡短而干凈的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM