mikrocontroller.net

Forum: Compiler & IDEs AVR-GCC warning: return type defaults to 'int' + ISR_NAKED


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche, eine enge und schnelle Interrupt Routine zu bauen - nur 
einen Wert auf ein IO-Register nageln.
#include <avr/interrupt.h>
ISR(TCC4_CCB_vect)
{
       VPORT2.DIR = portd_dir_mpx_drive;
}
Paßt soweit, erzeugt aber Standardprolog und -epilog (push Status, push 
R1 , ...).

Baue ich das als ISR_NAKED (dann mit inline asm)
ISR(TCC4_OVF_vect, ISR_NAKED) 
{
    asm volatile(
        "push   r24"  ); 
    asm volatile(
        "out    %0, %1"      "\n\t"
        :
        : "i" (_SFR_IO_ADDR(VPORT2.DIR)), "r" (portd_dir_mpx_drive) 
        :               // no clobber here
        );
    asm volatile(
        "pop  r24"         "\n\t"
        "reti"               "\n\t"
        );
}
bekomme ich zwar den gewünschte knappen Code (Status register muß ich ja 
nicht pushen, lds und out verändert da nichts), aber auch die Warnung:
Warning    type of '__vector_12' defaults to 'int' [-Wimplicit-int]

Wie bekomme ich diese warning weg?

Viele Grüße Wolfgang

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, ich habe deinen Code mal mit
#include <avr/io.h>
#include <avr/interrupt.h>

uint8_t portd_dir_mpx_drive;

ergänzt und mit -Os -mmcu=atxmega32e5 -Wall -Wextra compiliert – ohne 
jegliche Warnungen und mit dem gewünschten Ergebnis.

Davon abgesehen, wäre es hier nicht einfacher, das gleich in eine 
.S-Datei auszulagern, wenn du die ISR sowieso letztlich komplett als 
Assemblercode hinlegst?

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mein Fehler. Ich hatte die ursprüngliche ISR (halt ohne das Keywort ISR) 
gleich dahinter nochmal stehen, und eigentlich hat der Compiler dort 
gemeckert.

Richtig, es ist ein xmega e5, ürsprünglich wollte ich das Thema mit 
Comparechannels lösen. Nur hat Atmel/Microchip den Prozessor kastriert - 
Auf Port D gibt es keinen Timer für die Ports 0..3. Okay, dann halt mit 
DMA - grml, dieser EDMA (E soll enhanced bedeutet) is eher ein RDMA 
(reduced): Trigger des DMA geht im Peripheral-Mode nur aus ausgewählten, 
wenigen Quellen und im Standardmode sind es nur 2 Channels. Also 
Interrupt. Zu viel Jitter, zu lange Totzeit.

Dann quasi der letzte Rettungsanker: asm. Wegen der paar Zeile wollte 
ich jetzt kein extra Modul bauen, das ins make/git packen usw.

Danke nochmal

Wolfgang

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfgang schrieb:
> erzeugt aber Standardprolog und -epilog (push Status, push R1 , ...).

Schon mal eine aktuelle Compilerversion versucht (v8 oder neuer)?
#include <avr/io.h>
#include <avr/interrupt.h>

volatile uint8_t portd_dir_mpx_drive;

ISR (TCC4_CCB_vect)
{
    VPORT2.DIR = portd_dir_mpx_drive;
}

erzeugt etwa (-Os -mmcu=atxmega32e5):
000000ce <__vector_15>:
  ce:  8f 93         push  r24
  d0:  80 91 00 20   lds  r24, 0x2000
  d4:  88 bb         out  0x18, r24
  d6:  8f 91         pop  r24
  d8:  18 95         reti

Wolfgang schrieb:
> Dann quasi der letzte Rettungsanker: asm.

Dann aber korrekt, zum Beispiel so (dass dein Code wie gewünscht 
übersetzt wird bedeutet nicht, dass die Quelle korrekt ist :-))
ISR (TCC4_OVF_vect, ISR_NAKED) 
{
    asm volatile (
        "push  r24"         "\n\t" 
        "lds   r24, %1"     "\n\t"
        "out   %i0, r24"    "\n\t"
        "pop   r24"         "\n\t"
        "reti"
        :
        : "n" (&VPORT2.DIR), "i" (&portd_dir_mpx_drive)
        : "r24", "memory");

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.

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