[英]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.