большая структура init в C - PullRequest
       14

большая структура init в C

0 голосов
/ 08 октября 2018

У меня есть выбор для инициализации большой структуры в 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 экземпляр для каждой заводской конфигурации.

У кого-нибудь есть идея получше?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Во всех предоставленных вами сценариях (возможностях) значения должны храниться в памяти, либо как переменные, либо как значения для инициализации переменных.Таким образом, нет большой разницы в памяти.Использование функций инициализации требует дополнительных байтов кода, необходимых для выполнения инициализации.

Имеет один статический массив, содержащий все значения, и который вы индексируете каждый раз, когда вам нужно значение, имеет дополнительные инструкции для индексации массива.,Копирование значений индекса массива в переменную «рабочий набор» приводит к дополнительным издержкам дополнительной переменной.

Возможно, вы можете измерить наименьшую из нескольких версий, например:

  • один статический массив, который индексируется для каждого доступа к параметрам;

  • один статический массив и копирование рабочего набора в дополнительную переменную;

  • инициализация переменной рабочего набора с помощью функции инициализации.

Но это предполагает, что рабочий набор значений может измениться во время выполнения.Если они не меняются, вы можете использовать #define s для выбора рабочего набора значений и использовать его для статической инициализации переменных рабочего набора.

0 голосов
/ 08 октября 2018

Это коротко и чисто:

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