mikrocontroller.net

Forum: Compiler & IDEs min()-/max()-Macro in AVR-AS


Autor: Verzweifelter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

gibt es irgendwo Macros für den AVR-AS (GCC) um den größten, bzw. 
kleinsten Wert aus 2 Werten zu bestimmen (sowas wie max(3,4)=3)?
Alle Versuche meinerseits mit .macro .... .endm, a>b? a:b, defines und 
sonstwas schlagen fehl und ich finde keine Macrosammlung oder sowas im 
Netz ;-(
Problem ist, daß zur Übersetzungszeit eine Berechnung ausgeführt wird, 
die zwar 0 ergeben kann, aber nicht darf. Dafür brauch ich halt das 
max()

Grüße, Verzweifelter

P.S.: Gibt es irgendwo eine Macro-Sammlung oder sowas?

Autor: Verzweifelter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Shit. max(3,4) ist natürlich 4 ;-)

Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So hab ich mir die Makros für Keil definiert:

#define MIN( a, b ) (a < b) ? a : b
#define MAX( a, b ) (a > b) ? a : b

Vielleicht hat es wegen deiner Klammernsetzung nicht funktioniert!?

Mfg, Mathias

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Apropos Klammernsetzung.

rechne mal

  2 + MIN( 3, 4 );
  MAX( 4, 3 ) + 2;

Ich denke nicht, dass 4, bzw. 5 die erwarteten Ergebnisse sind :-)


#define MIN( a, b ) ( ((a) < (b)) ? (a) : (b) )
#define MAX( a, b ) ( ((a) > (b)) ? (a) : (b) )

Sonst kann es zu unliebsamen Überraschungen kommen, wenn
man die Makros in Ausdrücken benutzt. Zumindest ein Teil
dieser Überraschungen lässt sich mit zusätzlichen Klammern
umgehen. Makroargumente bei der Verwendung in Klammern zu
setzen ist immer eine gute Idee.

Aber so wie ich den OP verstanden habe, braucht er das
für den Assembler und nicht für C.


Autor: Verzweifelter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

> Aber so wie ich den OP verstanden habe, braucht er das
> für den Assembler und nicht für C.
Genauso ist es. Allergings hab ich den GCC den Assembler aufrufen 
lassen. Dachte bei einem .S-File wird der gleiche Preprozessor 
verwendet. Scheint aber nicht so ;-(
#define __SFR_OFFSET 0
#include <avr/io.h>

#define MAX(a, b) ( ((a) > (b)) ? (a) : (b) )

.func Test
    ldi     25, MAX(3, 4)
    ret
.endfunc

liefert z.B.:
Test.S: Assembler messages:
Test.S:7: Error: missing ')'
Test.S:7: Error: garbage at end of line

Wieso er allerdings ein fehlendes ')' bemängelt ist mir ein wenig 
schleierhaft.

Grüße, Verzweifelter

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

Bewertung
0 lesenswert
nicht lesenswert
Verzweifelter wrote:

> Dachte bei einem .S-File wird der gleiche Preprozessor
> verwendet. Scheint aber nicht so ;-(

Doch, schon.

> Wieso er allerdings ein fehlendes ')' bemängelt ist mir ein wenig
> schleierhaft.

Weil der Assembler halt kein C-Compiler ist.  Den C-typischen
?:-Operator versteht er schlicht nicht, und der bleibt auch nach
deinem preprocessing noch da drin:

% avr-cpp foo.S
# 1 "foo.S"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "foo.S"

# 1 "/usr/local/lib/gcc/avr/4.1.1/../../../../avr/include/avr/io.h" 1 3
# 86 "/usr/local/lib/gcc/avr/4.1.1/../../../../avr/include/avr/io.h" 3
# 1 "/usr/local/lib/gcc/avr/4.1.1/../../../../avr/include/avr/sfr_defs.h" 1 3
# 87 "/usr/local/lib/gcc/avr/4.1.1/../../../../avr/include/avr/io.h" 2 3
In file included from foo.S:2:
/usr/local/lib/gcc/avr/4.1.1/../../../../avr/include/avr/io.h:332:6: warning: #warning "device type not defined"
# 336 "/usr/local/lib/gcc/avr/4.1.1/../../../../avr/include/avr/io.h" 3
# 1 "/usr/local/lib/gcc/avr/4.1.1/../../../../avr/include/avr/portpins.h" 1 3
# 337 "/usr/local/lib/gcc/avr/4.1.1/../../../../avr/include/avr/io.h" 2 3
# 346 "/usr/local/lib/gcc/avr/4.1.1/../../../../avr/include/avr/io.h" 3
# 1 "/usr/local/lib/gcc/avr/4.1.1/../../../../avr/include/avr/version.h" 1 3
# 347 "/usr/local/lib/gcc/avr/4.1.1/../../../../avr/include/avr/io.h" 2 3
# 3 "foo.S" 2



.func Test
    ldi 25, ( ((3) > (4)) ? (3) : (4) )
    ret
.endfunc

Autor: Verzweifelter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Weil der Assembler halt kein C-Compiler ist.  Den C-typischen
> ?:-Operator versteht er schlicht nicht, und der bleibt auch nach
> deinem preprocessing noch da drin:
Deswegen ja auch meine obigen Versuche mit .macro und #define.
Das '?' hatte ich mal versucht, aber aus Deinem genannten Grund 
ausgeschlossen. Ich wollte nur nochmal einen Versuch starten, weil
von den anderen Postern drauf verwiesen wurde.

Eine Mischung aus Macros und Defines schlägt leider fehl, da der 
Preprozessor innerhalb der Macrodefinition schon versucht die Defines 
aufzulösen ;-(
Peter Danegger hat mal sowas mit verschachtelten Macros hier gepostet 
(anderes Problem, aber trotzdem trotzdem trickreich den Preprozessor 
gelinkt g). Denke auf sowas wird es hinauslaufen.
Dachte halt es gibt da schon eine fertige Lösung ;-)

Grüße, Verzweifelter

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

Bewertung
0 lesenswert
nicht lesenswert
Ich denke nicht, dass der C-Präprozessor das kann, was du hier von
ihm erwartest.

Wenn du den Befehl selbst mit als Makro-Argument übergeben kannst,
geht sowas:
#define __SFR_OFFSET 0
#include <avr/io.h>

.macro max a, b, instr
        .if \a > \b
        \instr  \a
        .else
        \instr  \b
        .endif
.endm

.func Test
    .global Test
Test:
    max 3 5 "ldi r25, "
    ret
.endfunc

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.