www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit inline Funktionen


Autor: Uwe M. (lifthrasil)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi @all,

ich habe ein Problem mit inline Funktionen da diese nicht "echt"
inline sind ... z.B.

inline void HAL_USART_INIT(unsigned int wUBRR){
   UBRR0H = (unsigned char)(wUBRR>>8);
   UBRR0L = (unsigned char)wUBRR;
   UCSR0B = (1<<RXEN0)|(1<<TXEN0);
   UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}

=> Dissassembly

10:          HAL_INIT();
+00000042:   D01B   RCALL   PC+0x001C    Relative call subroutine

genau das wollte ich aber eigentlich verhindern?? Was besser
funktionierte (zumindest bzgl. Codegröße) war:

#define HAL_USART_INIT(ubrr)           \
   UBRR0H = (ubrr>>8);                 \
   UBRR0L = ubrr;                      \
   UCSR0B = (1<<RXEN0)|(1<<TXEN0);     \
   UCSR0C = (1<<USBS0)|(3<<UCSZ00);

allerdings hab ich hier keinerlei Typsicherheit und IMHO ist es auch
kein guter Stil (oder??). Ich hätte auch gedacht ich könnte inline Fkt.
direkt in der Header-File definieren allerdings bekomm ich dann immer
den Fehler:

gcc plug-in: Error: Object file not found on expected location [..]

Bin für jeden Tipp dankbar!

so long ... Lif

Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Prüfe mal den Optimierungslevel. Also bei mir wird bei O2 inline auch zu
inline.

Autor: Fritz Ganter (fritzg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So kenn ich das gar nicht. Bei mir tut das:
void delayu_schiff (uint16_t us) __attribute__ ((always_inline));

void
delayu_schiff (uint16_t us)
{
  OCR1A = (us << 4) - 1;
  TIFR |= _BV (OCF1A);
  TCNT1 = 0;

  loop_until_bit_is_set (TIFR, OCF1A);

}

Allerdings ist bei mir -O2 eingeschaltet.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
__attribute__((always_inline)) sollte man mit inline kombinieren.
Den Fehler hatte ich kürzlich auch in der avr-libc begangen, das
inline dabei wegzulassen...

Normalerweise benutzt der Compiler halt eine Heuristik, ab der
er denkt, dass es lohnt, die Funktion wirklich inline zu
erweitern, andernfalls wird sie wie eine normale Funktion
behandelt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.