www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVRStudio Assembler übersetzt alles


Autor: MichaelMüller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

sorry erst mal für den komischen Betreff, aber mir ist nix treffendes 
eingefallen.
Zum Tehma: ich rufe aus meinem Hauptprogramm ein Unterprogramm aus einer 
Includedatei auf. Die Includedatei soll nun verschiedene Unterprogramme 
beinhalten die jedoch nicht immer gebraucht werden. Leider wird beim 
Assemblieren immer die gesamte Includedatei übersetzt. Das führt dazu, 
dass ich alle verwendeten Variabeln auch deklarieren muss egal ob diese 
benötigt werden oder nicht.
Kann man den Assembler so einstellen, dass nur der Teil assembliert 
wird, der auch wirklich aufgerufen wird?

Gruß, Michael

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wärs den per #define / #ifdef / #endif einzelne Blocke 
auszukommentieren?

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bedingte Assemblierung des Präprozessors... (IFDEF, ...)

Die Bedingungen, was assembliert werden soll, musst Du allerdings selbst 
setzen (Defines), von alleine erkennt der das nicht.

Einfacher wird es wohl sein, die Include-Datei zu splitten und die 
benötigten Teile einzeln einzubinden.

...

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Kann man den Assembler so einstellen, dass nur der Teil assembliert
>wird, der auch wirklich aufgerufen wird?

Nein. Eine Includedatei wird immer komplett eingebunden.

Ich mache das in solchen Fällen in der Includedatei folgendermassen:
Am Dateianfang:

         .equ use_funktion = 1 ; wenn verwendet
  oder   .equ use_funktion = 0 ; wenn nicht verwendet

         .if use_funktion == 1

funktion: .....

          ret

         .endif

Also alle Funktionen erhalten also eine Variable, und werden 
entsprechend dieser bedingt assembliert. Das 'Nachrüsten' bestehender 
Dateien ist natürlich u.U. etwas mühselig. Wenn man beim Erstellen neuer 
Dateien gleich so vorgeht ist es nur wenig Mehraufwand.

MfG Spess

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein. Der geht unerschütterlich davon aus, daß der Benutzer das, was er 
hinschreibt, auch übersetzt haben will.

Oliver

Autor: MichaelMüller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen Dank,
mit Hilfe der  Ifdef-Funktion geht es ganz gut.
Wäre noch interesant ob man mit einem & Operator arbeiten kann. Ich habe 
es ausprobiert, leider nur eine Fehlermeldung.
#ifdef Mega88 && GetSampleADC
#endif

Der Vorschlag von Spess klingt ebenfalls gut, für eins muss ich mich 
wohl entscheiden...

Autor: MichaelMüller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun ist mir doch aufgefallen, dass etwas nicht stimmt.
mein Unterprogramm M88_UART_Sendbyte wird nicht übersetzt, obwohl ich in 
meinem Hauptprogramm folgendes definiert habe:
.equ M88_UART_Sendbyte = 1

eigentlich sollte sich da was tun, hat jemand einen Tip für mich?
Was mich verwirrt, wann verwende ich die Raute und wann den Punkt?

Gruß Micha

Autor: MichaelMüller (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
sorry, wollte noch die Datei hochladen

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Nun ist mir doch aufgefallen, dass etwas nicht stimmt.
>mein Unterprogramm M88_UART_Sendbyte wird nicht übersetzt, obwohl ich in
>meinem Hauptprogramm folgendes definiert habe:
>.equ M88_UART_Sendbyte = 1

Was hast du denn genau gemacht?

>Was mich verwirrt, wann verwende ich die Raute und wann den Punkt?

Die mit dem Punkt sind 'normale' Assemblerdirektiven. Die mit dem 
Doppelkreuz sind Präprozessordirktiven speziell für den AVR-Assembler2.

MfG Spess

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>sorry, wollte noch die Datei hochladen

Nimm mal '.if / .endif'.

MfG Spess

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MichaelMüller schrieb:
> vielen Dank,
> mit Hilfe der  Ifdef-Funktion geht es ganz gut.
> Wäre noch interesant ob man mit einem & Operator arbeiten kann. Ich habe
> es ausprobiert, leider nur eine Fehlermeldung.
> #ifdef Mega88 && GetSampleADC
> #endif

Lies mal die Anleitung deines Präprozessors...
#if defined(Mega88) && defined(GetSampleADC)
...
#endif

.if gehört normalerweise zum Assembler. das #-Gedöhns ist der 
C-Präprozessor, den man aber ohne Weiteres auch über Assemblerquellen 
laufen lassen kann.

Autor: MichaelMüller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja, in der Includedatei ist folgendes definiert:
#ifdef Mega88
 UART0_Init:
 ; Baudrate einstellen
  ldi     temp, HIGH(UBRR_VAL)
  sts     UBRR0H, temp
  ldi     temp, LOW(UBRR_VAL)
  sts     UBRR0L, temp

; Frame-Format: 8 Bit
  ldi     temp,  (3<<UCSZ00)
  sts     UCSR0C, temp
  ldi    temp,  (1<<TXEN0)      
  sts   UCSR0B, temp
 ret
#endif

#if M88_UART_Sendbyte == 1
 UART_sendbyte:
  ldi    temp, (1<<UDRE0)
  sts     UCSR0A, temp               
    rjmp    UART_sendbyte
    sts     UDR0, zeichen
ret
#endif
Im Hauptprogramm ist folgendes definiert:
 #define Mega88
 .equ M88_UART_Sendbyte = 1

die Initroutine wird per 'rcall UART0_Init' aufgerufen, das scheint zu 
funktionieren.

das Untprogramm wird wie folgt aufgerufen: 'rcall UART_sendbyte'
Da bekomme ich jedoch eine Fehlermeldung, dass das Symbol nicht 
definiert ist.

Autor: MichaelMüller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also das mit dem ifdef hat schon funktioniert, Der Vorschlag von Spess 
mit Hilfe der if-Anweisung jedoch nicht. Meiner Meinung nach sollte das 
aber funktionieren.

Ich habe mal die Variante mit #if define ausprobiert, funktioniert auch 
soweit.
Leider bekomme ich eine Fehlermeldung wenn ich das Unterprogramm 
GetSampleADC aufrufe. (unexpected integer)
Habe auch die serielle Schnittstelle eingebunden, dort funktioniert 
dieselbe Vorgehensweise noch. Das ist mir etwas suspekt.

Mehrere Dateien kann man hier nicht hochladen?
#if defined(Mega8) && defined(GetSampleADC)
 GetSampleADC:                       <--- hier erscheint die Fehlermeldung
    sbi     ADCSRA, ADSC        ; den ADC starten

  wait_adc:
    sbic    ADCSRA, ADSC        ; wenn der ADC fertig ist, wird dieses Bit gelöscht
    rjmp    wait_adc

; ADC mit 10 Bit einlesen:
    in      ADClow,  ADCL        ; immer zuerst LOW Byte lesen
    in      ADChigh, ADCH        ; danach das mittlerweile gesperrte High Byte
 ret
#endif

Autor: MichaelMüller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mir ist der Fehler gerade aufgefallen:
Mein Unterprogramm hatte genau den gleichen Namen wie die def-Variable 
aus der If-Anweisung. Nach dem Umbennen war der Fehler weg

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.