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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.