У меня есть выбор для инициализации большой структуры в C. Я работаю над встроенным микро с небольшим объемом памяти.Я сохранил конфигурацию чипа в EEPROM.Итак, у меня есть структура, которая содержит всю страницу конфигурации в EEPROM:
Typedef struct
{
unsigned int Param1;
float Param2;
unsigned char Param3;
[...]
char Paramx[SIZE];
} T_EEPROM;
Мы должны помнить, что эта структура тяжелая, учитывая небольшой размер памяти микро.
Iиметь глобальную переменную этого типа:
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;
}
После этого я мог бы вызвать функцию lake, которая:
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]);
}
Disadventage: Очень тяжелая памятьпотому что у меня есть T_EEPROM
экземпляр для каждой заводской конфигурации.
У кого-нибудь есть идея получше?