avr inline assembler

OP (Firma: Student) #2825941
Lesenswert?

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
}
Persönliche Seite #2829525
Lesenswert?

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
OP (Firma: Student) #2831199
Lesenswert?

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
  );

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren