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
Wie wärs den per #define / #ifdef / #endif einzelne Blocke auszukommentieren?
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. ...
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
Nein. Der geht unerschütterlich davon aus, daß der Benutzer das, was er hinschreibt, auch übersetzt haben will. Oliver
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...
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
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
Hi
>sorry, wollte noch die Datei hochladen
Nimm mal '.if / .endif'.
MfG Spess
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...
1 | #if defined(Mega88) && defined(GetSampleADC)
|
2 | ...
|
3 | #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.
naja, in der Includedatei ist folgendes definiert:
1 | #ifdef Mega88 |
2 | UART0_Init: |
3 | ; Baudrate einstellen |
4 | ldi temp, HIGH(UBRR_VAL) |
5 | sts UBRR0H, temp |
6 | ldi temp, LOW(UBRR_VAL) |
7 | sts UBRR0L, temp |
8 | |
9 | ; Frame-Format: 8 Bit |
10 | ldi temp, (3<<UCSZ00) |
11 | sts UCSR0C, temp |
12 | ldi temp, (1<<TXEN0) |
13 | sts UCSR0B, temp |
14 | ret |
15 | #endif |
16 | |
17 | #if M88_UART_Sendbyte == 1 |
18 | UART_sendbyte: |
19 | ldi temp, (1<<UDRE0) |
20 | sts UCSR0A, temp |
21 | rjmp UART_sendbyte |
22 | sts UDR0, zeichen |
23 | ret |
24 | #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.
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?
1 | #if defined(Mega8) && defined(GetSampleADC) |
2 | GetSampleADC: <--- hier erscheint die Fehlermeldung |
3 | sbi ADCSRA, ADSC ; den ADC starten |
4 | |
5 | wait_adc: |
6 | sbic ADCSRA, ADSC ; wenn der ADC fertig ist, wird dieses Bit gelöscht |
7 | rjmp wait_adc |
8 | |
9 | ; ADC mit 10 Bit einlesen: |
10 | in ADClow, ADCL ; immer zuerst LOW Byte lesen |
11 | in ADChigh, ADCH ; danach das mittlerweile gesperrte High Byte |
12 | ret |
13 | #endif |
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.