Partage
  • Partager sur Facebook
  • Partager sur Twitter

Compresser la mémoire utilisée par un programme

    29 avril 2015 à 10:33:23

    Salut à tous !

    Actuellement en stage en entreprise, on m'a filé un programme C et on m'a demandé de réduire la taille prise par ce dernier sur un PIC18.

    Bon j'adore le C, mais n'étant qu'en 2°A de DUT GEII je n'ai pas ces compétences. Je suis donc parti à la recherche d'infos sur internet, mais ça prend du temps donc je viens ici pour avoir un complément, en espérant que vous puissiez m'aider !

    Je précise que je n'ai pas accès à un fichier exe (programme directement chargé depuis MPLAB vis usb sur le PIC), et que je cherche des solutions pour rendre mon code plus court, donc plus léger.

    Merci de votre aide ! :D

    -
    Edité par charlybonzon 29 avril 2015 à 14:50:20

    • Partager sur Facebook
    • Partager sur Twitter
      29 avril 2015 à 20:28:57

      Salut

      peut-être qu'il faut travailler sur les structures de données utilisées par ce programme. Il faut comprendre le code source et voir comment optimiser la consommation de mémoire des données. Tu peux commencer tout bêtement en affichant la taille des structures lors de l'exécution du programme.

      • Partager sur Facebook
      • Partager sur Twitter
        30 avril 2015 à 9:03:00

        Salut! Je pense que si on t'a demander de faire ça, c'est parce que le code n'est pas optimal et/ou pas maintenable, je te conseille donc de regarder ça! the clean code, il y a également un livre "the clean code" et "the clean coder".

        En général un code optimisé c'est un code bien factorisé (si tu écris deux fois un même bout de code à deux endroits différents, il faut faire une fonction), un code bien nommé avec des variables explicites, mais pas verbeux.

        -Analyse le code et essaye de grappiller des tours de boucles inutiles, en ajoutant des conditions de sorties par exemple.

        -Ajoute des contrôle et améliore la sécurité si il y a des saisies au claviers, ou des IO réseau.

        -Fait des structures pour améliorer l'organisation et la maintenabilité du code.

        -Si le programme est composé de plusieurs modules, essaye des les découpler au maximum afin de les rendre le plus indépendant possible.

        • Partager sur Facebook
        • Partager sur Twitter
          30 avril 2015 à 10:59:39

          Tout d'abord, merci pour le temps que vous prenez à me répondre !

          tsez a écrit: Tu peux commencer tout bêtement en affichant la taille des structures lors de l'exécution du programme.

          Tout bête mais, comment tu l'affiches ça ?

          para_doxx a écrit:

          -Analyse le code et essaye de grappiller des tours de boucles inutiles, en ajoutant des conditions de sorties par exemple.

          -Ajoute des contrôle et améliore la sécurité si il y a des saisies au claviers, ou des IO réseau.

          -Fait des structures pour améliorer l'organisation et la maintenabilité du code.

          -Si le programme est composé de plusieurs modules, essaye des les découpler au maximum afin de les rendre le plus indépendant possible.

          Ok pour les boucles inutiles. Pas de saisies claviers ni IO réseau. Qu'est-ce que tu entends par faire des structures ? Pareille pour module ...

          J'ai trouvé quelques pistes de mon côté !

          En ouvrant par curiosité les fichiers du dossier de mon projet, je suis tombé sur plusieurs fichiers intéressant.

          Tout d'abord un fichier nommémain.LST: il y a écrit en en-têteROM used : 15106 bytes (92%), Largest free fragment is 1274. Le 1274 signifie qu'il y a un "trou" de 1274 bits en plein milieu ?? (donc possibilité de gagner de la place je présume)

          Ensuite, j'ai ouvert le fichier main.sta : je vous montre pour une meilleure compréhension : main.sta . Ici on voit clairement que le main.c occupe 54% de la ROM, MATH.H 9%, stdlib.h 14% et string.h 4%. Déjà la somme ne fait que 81%, donc on a 11% qui disparaisse je ne sais où. Première idée que j'ai, tout simplement commenter les fonctions non utilisées des bibliothèques math, stdlib et string. Je pense qu'il y a moyen de gagner 4-5%. Si vous reprenez l'image juste au-dessus, il y a un tableau avec les colonnes Page, ROM, %, RAM et Functions. Quelqu'un saurait m'expliquer comment le déchiffrer, car je ne sais pas de quel pourcentage on parle.

          Finalement j'ai ouvert le fichier main.tre : pour une meilleure comppréhension : main.tre . J'ai un doute quand à son rôle, j'ai l'impression qu'on a ici l'utilisation de la RAM par chaque fonction (ce qui m'intéresse pour la suite), mais si l'on prend l'exemple de la fonction Read_EEPROM, je ne saisis pas la signification du 0/152. J'imagine que le Ram=9 veut dire 9 octets stockés sur la RAM ?


          L'idée sur laquelle je pars du coup c'est essayer de gagner de la place sur les fonctions non utilisées des librairies, et ensuite tester la mémoire occupée par chaque fonction du main, et tester des modifications pour voir si je peux en gagner un peu plus.

          J'attends vos réponses pour savoir si c'est viable comme solution, merci ! :D

          • Partager sur Facebook
          • Partager sur Twitter
            30 avril 2015 à 13:43:56

            Euh j'avoue que je ne comprend pas vraiment le contenu des fichiers que tu nous donne :o... mais concernant le main.tre j'en arriverai à la même conclusion que toi (au premier regard).. après si c'est des fonctions ou carrément des process, je ne sais pas vu que j'ignore même ce que fait le programme.

            Les structures en C sont comparables au classes dans les langages Objet elles sont définies par le mot clé struct. Ce que j'ai maladroitement appelé "module" c'est la notion de  brique logicielle qui fournissent des services  particuliers.

            "Tout bête mais, comment tu l'affiches ça ?"

            Et pour connaitre la taille des structures/variable je pense que la fonction sizeof() doit faire l'affaire.

            • Partager sur Facebook
            • Partager sur Twitter
              30 avril 2015 à 13:50:23

              Ok merci pour les structures et modules.

              J'ai déjà vu cette fonction sizeof(), mais le truc c'est qu'avec MPLAB je n'ai pas d'invite de commande, donc je fais comment pour me l'afficher la taille ?

              • Partager sur Facebook
              • Partager sur Twitter
                30 avril 2015 à 13:57:45

                Ah! mince j'avais pas vu que tu utilisais MatLab... je ne peux pas t'aider désolé...
                • Partager sur Facebook
                • Partager sur Twitter
                  30 avril 2015 à 16:08:30

                  Je n'utilise pas MatLab mais bien MPLAB
                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 mai 2015 à 15:05:38

                    Solution trouvée !

                    Tout simplement en lisant la datasheet du compilateur, j'ai trouvée une option

                    #OPT n

                    avec n allant de 1 à 11 et qui permet de choisir le niveau d'optimisation du code !

                    J'ai pu donc passer de 92% à 71% !

                    Merci à tous !

                    -
                    Edité par charlybonzon 5 mai 2015 à 15:09:02

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Compresser la mémoire utilisée par un programme

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown