Génération de code incompréhensible (occupation mémoire)

Liste des GroupesRevenir à fcl c 
Sujet : Génération de code incompréhensible (occupation mémoire)
De : JKB (at) *nospam* hilbert.invalid (JKB)
Groupes : fr.comp.lang.c
Date : 16. May 2023, 08:38:15
Autres entêtes
Organisation : Guest of ProXad - France
Message-ID : <646324d7$0$22266$426a34cc@news.free.fr>
User-Agent : slrn/1.0.3 (Linux)
Bonjour à tous,

Je suis en train de développer un firmware sur un AVR 8 bits:

hilbert:[~] > /usr/local/cross/avr/bin/avr-gcc -v
Using built-in specs.
Reading specs from /usr/local/cross/avr/lib/gcc/avr/12.2.0/device-specs/specs-avr2
COLLECT_GCC=/usr/local/cross/avr/bin/avr-gcc
COLLECT_LTO_WRAPPER=/usr/local/cross/avr/libexec/gcc/avr/12.2.0/lto-wrapper
Target: avr
Configured with: /usr/local/cross/build/avr/src/gcc/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=avr --prefix=/usr/local/cross/avr --exec_prefix=/usr/local/cross/avr --with-local-prefix=/usr/local/cross/avr/avr --with-headers=/usr/local/cross/avr/avr/include --with-newlib --enable-threads=no --disable-shared --with-pkgversion='crosstool-NG 1.25.0.143_5248760' --disable-__cxa_atexit --disable-libgomp --disable-libmudflap --disable-libmpx --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libstdcxx-verbose --with-gmp=/usr/local/cross/build/avr/buildtools --with-mpfr=/usr/local/cross/build/avr/buildtools --with-mpc=/usr/local/cross/build/avr/buildtools --with-isl=/usr/local/cross/build/avr/buildtools --enable-lto --enable-target-optspace --disable-nls --enable-multiarch --enable-languages=c
Thread model: single
Supported LTO compression algorithms: zlib zstd
gcc version 12.2.0 (crosstool-NG 1.25.0.143_5248760)

Il s'agit d'un cross compilateur que j'ai compilé moi-même.

La cible est un ATmega 1284 (128 Ko de mémoire programme, 16 Ko de
RAM et 4 Ko d'eeprom émulée par de la flash).

Considérons le bout de code suivant :

void
task_etats(void *pointer)
{
    inter_thread        *it;

    stimuli_t           stimuli;

    uint8_t             etat;

    uint16_t            stimuli16;

    it = (inter_thread *) pointer;
    USE(it);

    memset(&stimuli, 0, sizeof(stimuli));

    etat = state_A;
    stimuli.tc_25 = 25;

    for(;;)
    {
        hz_set_t0(hz_timeout_etats);

        // pseudo différentiel, le + sur CH0
        stimuli.cp = mcp3202_get_value(spi_mcp3202_cp, 0x00);
        stimuli.pp = mcp3202_get_value(spi_mcp3202_pp, 0x00);
        stimuli.temp = 25 + (100 *
                ((mcp3202_get_value(spi_mcp3202_temp, 0x00) * (3.3 / 4096))
                 - 0.75));

/*
Un gros bloc switch/case sans aucune boucle.
*/


        while(hz_get_ts(hz_timeout_etats) < stimuli.tc_25)
        {
            task_yield();
        }
    }
}

Le code généré occupe la place suivante :

AVR Memory Usage
----------------
Device: atmega1284

Program:   14884 bytes (11.4% Full)
(.text + .data + .bootloader)

Data:        609 bytes (3.7% Full)
(.data + .bss + .noinit)

Si maintenant, je mets la dernière boucle dans une fonction

void
hz_wait_timeout(int8_t hz, int32_t ticks)
{      
    for(;;)
    {
        if (hz_get_ts(hz) >= ticks)
        {
            break;
        }

task_yield();
    }

    return;
}

et que j'appelle cette fonction à la place de la boucle
while(hz_get_ts(hz_timeout_etats) < stimuli.tc_25) { ... }
le code généré utilise :

AVR Memory Usage
----------------
Device: atmega1284

Program:   75690 bytes (57.7% Full)
(.text + .data + .bootloader)

Data:        609 bytes (3.7% Full)
(.data + .bss + .noinit)

Les sections .data/.bss/.noinit ne changent pas. Mais pourquoi ce
simple appel de fonction fait passer mon code de 14884 à 75690 ?

Les deux binaires se comportent identiquement.

Je n'ai pas cherché à désassembler le code (je suis pas au point en
assembleur AVR8) mais je ne comprends pas pourquoi le remplacement
d'une boucle par une fonction faisant la même chose se comporte de
la sorte. Je veux bien qu'il y ait un appel de fonction
supplémentaire, mais ça ne fait pas la différence.

Les options de compilation dans les deux cas sont les suivantes :
-Os -g -Werror -Wextra --param=min-pagesize=0

Merci pour vos lumières,

JKB

--
Si votre demande me parvient en code 29, je vous titiouillerai volontiers
une réponse.

Date Sujet#  Auteur
16 May 23 o Génération de code incompréhensible (occupation mémoire)1JKB

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal