我有一个选择,以初始化一个大的结构,在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);现在我想用不同类型的工厂配置(配置A、配置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]);
}Dis冒险主义:内存很重,因为我为每个工厂配置都有一个T_EEPROM实例。
有人有更好的主意吗?
发布于 2018-10-08 13:41:04
这是简短而干净的:
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];
}发布于 2018-10-08 13:48:51
在您给出的所有场景的(可能性)中,这些值需要作为变量或作为初始化变量的值存在于内存中。因此在内存占用方面没有太大的差异。使用初始化函数具有执行初始化所需的代码字节的开销。
如果有一个包含所有值的静态数组,并且每次需要一个值时都要进行索引,则需要对数组进行索引的指令开销。将数组索引的值复制到“工作集”变量有额外变量的开销。
也许你可以通过制作几个版本来衡量哪个是最小的,例如:
但是,这假设值的工作集可以在执行过程中更改。如果它们不改变,那么您可以使用#define来选择值的工作集,并将其用于工作集变量的静态初始化。
https://stackoverflow.com/questions/52703384
复制相似问题