Fonction inline

Liste des GroupesRevenir à fcl c 
Sujet : Fonction inline
De : JKB (at) *nospam* hilbert.invalid (JKB)
Groupes : fr.comp.lang.c
Date : 31. Jan 2022, 17:44:43
Autres entêtes
Organisation : Guest of ProXad - France
Message-ID : <slrnsvg0vb.1acos.JKB@hilbert.systella.fr>
User-Agent : slrn/1.0.3 (Linux)
Bonjour à tous,

J'obtiens une erreur que je ne m'explique pas dans l'édition des
liens d'un firmware compilé avec avr-gcc.

J'ai écrit ceci :

void
freqdiv(uint8_t diviseur)
{
    mutex_lock(&mutex_freqdiv);

    if ((CLKPR & 0x0F) != diviseur)
    {
        stty_print("freqdiv ");
        stty_hexprint(CLKPR & 0x0F);
        stty_print("->");
        stty_hexprint(diviseur);
        stty_print("\r\n");

        while(uart0_BytesToSend() > 0);

        ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
        {
            diviseur &= 0x0F;
            CLKPR = (1 << CLKPCE);
            CLKPR = diviseur;
        }
...
}
...
}

L'édition des liens me répond :

make[1] : on quitte le répertoire « /home/bertrand/cvs/firmware-antivol4/usart »
/usr/local/cross/avr/bin/avr-gcc -mmcu=atmega1284 -Wl,-Map,firmware.map -o firmware.elf main.o affichage.o interruptions.o io.o spi.o vfd.o mcp3001.o mcp23s08.o random.o stty.o leds.o horloge.o badges.o task_25Hz.o task_gnss.o gnss.o satellites.o synchronisation.o rscombo.o trame.o derivation_clefs.o task_boutons.o task_affichage.o eui64.o lorawan.o task_lorawan.o task_commandes.o task_puissance.o programmation.o iso14443a.o clrc632.o task_nfc.o usart/libusart.a crypto/libcrypto.a lorawan/liblorawan.a multitasking/libmultitasking.a \
                -Wl,-u,vfprintf -lprintf_flt -lm
/usr/local/cross/avr/lib/gcc/avr/11.1.0/../../../../avr/bin/ld: task_25Hz.o: in function `freqdiv':
/home/bertrand/cvs/firmware-antivol4/task_25Hz.c:47: undefined reference to `uart0_BytesToSend'
collect2: error: ld returned 1 exit status
make: *** [Makefile:68 : firmware] Erreur 1

Ce que je ne saisis pas, c'est que cette fonction est une fonction
inline définie dans une bibliothèque que j'utilise (libusart pour
avoir un vrai port série avec RTS et CTS).

J'ai regardé ce que me sort le compilo avec l'option -E :

...
  void uart0_flush(void);

  extern volatile uint8_t tx0_Head, tx0_Tail;
  inline uint8_t uart0_BytesToSend(void) { return (tx0_Head - tx0_Tail - 1) & (128 - 1); }
# 1836 "usart/usart.h"
  char uart0_getc(void);
...

puis la ribambelle d'includes et mon code qui est inclus comme ceci
:

# 53 "task_25Hz.c"
                     & 0x0F);
  stty_print("->");
  stty_hexprint(diviseur);
  stty_print("\r\n");

  while(uart0_BytesToSend() > 0);

Je ne comprends pas pourquoi une fonction inline déclarée comme ceci
provoque un problème à l'édition des liens.

Je suis preneur de toute explication.

Merci d'avance,

JKB

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

Date Sujet#  Auteur
31 Jan 22 * Fonction inline6JKB
1 Feb 22 +- Re: Fonction inline1Stephane Tougard
10 Feb 22 `* Re: Fonction inline4Arnaud DUMERAT
10 Feb 22  `* Re: Fonction inline3JKB
11 Feb 22   `* Re: Fonction inline2Arnaud DUMERAT
11 Feb 22    `- Re: Fonction inline1JKB

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal