Bonjour,
J'ai un choix à faire concernant la façon de coder un bout de programme et j'aimerai avoir des avis extérieurs :
Je travaille sur microcontrôleur en C.
J'ai une partie de configuration du microcontrôleur en EEPROM.
J'ai donc créé une structure qui contient la page de configuration :
Considérons que cette structure est lourde compte tenu de l'espace mémoire du microcontrôleur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Typedef struct { unsigned int Param1; float Param2; unsigned char Param3; [...] char Paramx[SIZE]; } T_EEPROM;
Cette structure est instanciée par une variable globale :
Cela me permet de mettre à jour l'EEPROM par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part T_EEPROM MaConfig;
Maintenant je souhaite pouvoir initialiser cette structure avec différentes configurations d'usine (Config A, config B, etc...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 MaConfig.Param1 = NewValue; WriteEEPROM(MaConfig);
Tous les paramètres de chaque type de configuration sera fixe et peuvent donc être défini par des #define
C'est là que j'hésite sur la bonne méthode :
1) écrire une fonction d'initialisation qui prend tous les champs en paramètre et initialise les champs dans le corps de la fonction :
En appelant la fonction à chaque fois avec le type de conf voulu :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 bool InitEEPROM(unsigned int param1, float param2, unsigned char param3, [...], char *Paramx) { MaConfig.Param1 = param1; MaConfig.Param2 = param2; MaConfig.Param3 = param3; [...] MaConfig.Paramx = paramx; }
Inconvénient : Je trouve très lourd en code et moche
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 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) Créer un gros tableau de structure comme ceci :
Avec une fonction d'init plus simple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 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}, [...] };
Et un appel à la fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 bool InitEEPROM(T_EEPROM factoryConfig) { MaConfig.Param1 = factoryConfig.Param1 ; MaConfig.Param2 = factoryConfig.Param2; MaConfig.Param3 = factoryConfig.Param3; [...] MaConfig.Paramx = factoryConfig.Paramx; }
Inconvénient :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 void InitFactoryEEPROM (unsigned char type) { InitEEPROM(FactoryEepromConfig[type]); }
Très très lourd en RAM puisque je crée un tableau de structure avec autant de structure que de configurations...
Est ce que quelqu'un aurait une idée ?
Merci d'avance pour votre aide
Baptiste
Partager