Hallo ich habe den folgenden inline Code. ich will von der Schleife
rausgehen, wenn der Wert vom "Keypad_PORT" (PORTA) ungleich den Wert von
der Variable "Keypad_PIN_OLD_VAL" ist. ich habe es in 3 Zeilen
geschrieben: 1 | "in r15,%6 ;1 cycle." "\n\t"
| 2 | "cp r15,%7 ;1 cycle." "\n\t"
| 3 | "breq 1b ;2 cycles." "\n\t"
|
es siehst so aus als ob es nicht funktionniert. Im Folgenden steht den
inline Code. ich habe die Schleife von dem restlichen Code getrennt,
damit es übersichtlicher wird.
Hat Jemand eine Idee?
Danke!
1 | void static inline Signal_OUT(const uint8_t *signal, uint8_t ad2, uint8_t ad1, uint8_t ad0,uint8_t Keypad_PIN_OLD_VAL)
| 2 | {
|
1 | asm volatile( "eor r18, r18 ;r18<-0" "\n\t"
| 2 | "eor r19, r19 ;r19<-0" "\n\t"
| 3 | "eor r17, r17 ;r17<-0" "\n\t"
| 4 | "eor r16, r16 ;r16<-0" "\n\t"
| 5 | "com r16 ;r16<- 0xff-r16" "\n\t"
| 6 |
| 7 |
| 8 | "1:" "\n\t"
| 9 | "add r18, %0 ;1 cycle" "\n\t"
| 10 | "adc r19, %1 ;1 cycle" "\n\t"
| 11 | "adc %A3, %2 ;1 cycle" "\n\t"
| 12 | "out %5, r17 ;cs=0;rw=0; cs und rw in PORTC;1 cycle" "\n\t"
| 13 | "lpm ;3 cycles" "\n\t"
| 14 | "out %4, __tmp_reg__ ;1 cycle" "\n\t"
| 15 | "out %5, r16 ;cs=1;rw=1; cs und rw in PORTC;1 cycle" "\n\t"
| 16 | "in r15,%6 ;1 cycle." "\n\t"
| 17 | "cp r15,%7 ;1 cycle." "\n\t"
| 18 | "breq 1b ;2 cycles." "\n\t"
| 19 |
| 20 |
| 21 | :
| 22 | :"r" (ad0),"r" (ad1),"r" (ad2),"e" (signal),"I" (_SFR_IO_ADDR(AD_WERTE_PORT)), "I" (_SFR_IO_ADDR(AD_CTRL_PORT)), "I" (_SFR_IO_ADDR(Keypad_PORT)),"r" (Keypad_PIN_OLD_VAL)
| 23 | :"r15","r16","r17","r18", "r19"
| 24 | );
| 25 | }
|
Guy Ngamy schrieb:
> Hallo ich habe den folgenden inline Code. ich will von der Schleife
> rausgehen, wenn der Wert vom "Keypad_PORT" (PORTA) ungleich den Wert von
> der Variable "Keypad_PIN_OLD_VAL" ist. ich habe es in 3 Zeilen
> geschrieben: [...]
Auf die Schnelle sehe ich folgende Probleme:
1) 1b macht Probleme wenn die Funktion mehrfach vorhanden ist durch
Inlining, Loop-Unrolling, Cloning, etc.
2) Z ist bei LPM undefiniert
3) Ein Inline-Asembler mit 8 Parametern und 5 Clobbers scheint mir
nicht wirlkich wartbar.
Was soll das erledigen?
Muss das wirklich aufs Tick genau sein?
Für Hilfe zu Inline-Asm kannst du [1] lesen und bei Fragen nochmal
konkret nachhaken.
> eor Rn, Rn
Schreibt sich auch als "clr Rn" (Clear Register)
> eor r16, r16
> com r16
Einfacher: "ldi r16, 0xff" oder "ldi r16, -1"
[1] http://www.rn-wissen.de/index.php/Inline-Assembler_in_avr-gcc
Johann L. schrieb:
> 1) 1b macht Probleme wenn die Funktion mehrfach vorhanden ist durch
> Inlining, Loop-Unrolling, Cloning, etc.
Was meinst du damit? Wie soll denn zwischen das Label und dem "breq 1b"
anderer Code kommen?
Stefan Ernst schrieb:
> Johann L. schrieb:
>> 1) 1b macht Probleme wenn die Funktion mehrfach vorhanden ist durch
>> Inlining, Loop-Unrolling, Cloning, etc.
>
> Was meinst du damit? Wie soll denn zwischen das Label und dem "breq 1b"
> anderer Code kommen?
Ja, stimmt. Ich sollte so spät keine Beiträge mehr schreiben.
hallo,
es funktionniert mit dem folgenden Code. wenn "Keypad_PIN" (PINA)
ungleich den Wert von der Variable "Keypad_PIN_OLD_VAL" ist, geht der
raus von der Schleife. Danke schön:
@ Johann L.: Danke, deine Vorschläge werde ich noch berücksichtigen.
MfG
Christian
1 | asm volatile( "eor r18, r18 ;r18<-0" "\n\t"
| 2 | "eor r19, r19 ;r19<-0" "\n\t"
| 3 | "eor r17, r17 ;r17<-0" "\n\t"
| 4 | "eor r16, r16 ;r16<-0" "\n\t"
| 5 | "com r16 ;r16<- 0xff-r16" "\n\t"
| 6 | "1:" "\n\t"
| 7 | "add r18, %0 ;1 cycle" "\n\t"
| 8 | "adc r19, %1 ;1 cycle" "\n\t"
| 9 | "adc %A3, %2 ;1 cycle" "\n\t"
| 10 | "out %5, r17 ;cs=0;rw=0; cs und rw in PORTC;1 cycle" "\n\t"
| 11 | "lpm ;3 cycles" "\n\t"
| 12 | "out %4, __tmp_reg__ ;1 cycle" "\n\t"
| 13 | "out %5, r16 ;cs=1;rw=1; cs und rw in PORTC;1 cycle" "\n\t"
| 14 | "in r15,%6 ;1 cycle." "\n\t"
| 15 | "cp r15,%7 ;1 cycle." "\n\t"
| 16 | "breq 1b ;2 cycles. Total 13 cycles" "\n\t"
| 17 | :
| 18 | :"r" (ad0),"r" (ad1),"r" (ad2),"e" (signal),"I" (_SFR_IO_ADDR(AD_WERTE_PORT)), "I" (_SFR_IO_ADDR(AD_CTRL_PORT)), "I" (_SFR_IO_ADDR(Keypad_PIN)),"r" (Keypad_PIN_OLD_VAL)
| 19 | :"r15","r16","r17","r18", "r19"
| 20 | );
|
Der Inhalt des Z-Registers bei LPM ist noch immer undefiniert.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|