Brauche Hilfe mit C->ARM-Assembler

OP #621582
Lesenswert?

Hallo,

kann mir bitte jemand helfen, eine kleine C-Routine nach ARM-Assembler 
umzuschreiben? Meine funktioniert irgendwie garnicht.
Das ist die funktionierende C-ISR.
1
void __attribute__ ((interrupt("IRQ"))) cam_hsync()
2
{
3

4
  for(register int i=0;i<88;i++)
5
  {
6
    while(!(FIO0PIN&(1<<15)));//warte bis FIO0PIN.15==1
7
    *(pixelpointer++)=FIO1PINU; //speichere FIO0PIN2 in [pixelpointer] und erhöhe ihn
8
    while(FIO0PIN&(1<<15));//warte bis FIO0PIN.15==0
9
    while(!(FIO0PIN&(1<<15)));//warte bis FIO0PIN.15==1
10
    while(FIO0PIN&(1<<15));//warte bis FIO0PIN.15==0
11
  }
12
  
13
  if(hsynccount)
14
  {
15
    pixelpointer-=88;
16
    hsynccount=0;
17
  }
18
  else hsynccount=1;
19
  
20
  
21
  vsync=0;
22
  EXTINT=(1<<3);//Extint-flag löschen
23
  VICVectAddr = 0; // Interrupt im VIC bestätigen
24
}

Und das der nicht funktionierende ASM-Code. Die ISR wird nie verlassen
1
void __attribute__ ((interrupt("IRQ"))) cam_hsync()
2
{
3
asm(
4
"LDR R0,=0x3FFFC014\n" //Adresse von FIO0PIN
5
"MOV R1,#88 \n"//i=88
6
"LDR R4,=pixelpointer \n"//adresse von pixelpointer
7
"LDR R2,[r4]\n" //r2=pixelpointer
8

9
//warte bis FIO0PIN.15==1
10
"for_schleife:\n"
11
"LDR r3,[r0]\n" //r3=FIO0PIN
12
"ANDS R3,#0x8000\n" //AND r3,(1<<15)
13
"BEQ for_schleife\n" //if(FIO0PIN.15==0) goto for_schleife
14

15
//*(pixelpointer++)=FIO1PINU
16
"LDRB R3,[R0,#0x22]\n"//r3=FIO1PIN2
17
"STRB R3,[r2],#1\n" //*pixelpointer++=r3
18

19
//warte bis FIO0PIN.15==0
20
"w_u_c0:\n"
21
"LDR r3,[r0]\n" //r3=FIO0PIN
22
"ANDS r3,#0x8000\n" //and r3,(1<<15)
23
"BNE w_u_c0\n" //if(FIO0PIN.15==1) goto w_u_c0
24

25
//warte bis FIO0PIN.15==1
26
"w_u_s1:\n"
27
"LDR r3,[r0]\n" //r3=FIO0PIN
28
"ANDS r3,#0x8000\n" //and r3,(1<<15)
29
"BEQ w_u_s1\n" //if(FIO0PIN.15==0) goto w_u_s1
30

31
//warte bis FIO0PIN.15==0
32
"w_u_c1:"
33
"LDR r3,[r0]\n" //r3=FIO0PIN
34
"ANDS r3,#0x8000\n" //and r3,(1<<15)
35
"BNE w_u_c1\n" //if(FIO0PIN.15==1) goto w_u_c1
36

37
//for(i=88;i>0;i--)
38
"SUBS r1,#1\n" //i--
39
"BNE for_schleife\n"//if(i!=0)goto for_schleife
40
"STR R2,[r4]\n"//speichere pixelpointer
41

42
);
43

44
  if(hsynccount)
45
  {
46
    pixelpointer-=88;
47
    hsynccount=0;
48
  }
49
  else hsynccount=1;
50
  
51
  vsync=0;
52
  EXTINT=(1<<3);
53
  VICVectAddr = 0; // Interrupt im VIC bestätigen
54
}

MfG Mark
Gast #621849
Lesenswert?

Der Code sieht eigentlich ziemlich einfach aus. Ich wüßte nicht, warum 
der Compiler da langsamen Code generieren sollte. Du kannst aber 
trotzdem den generierten Assembler-Code als Basis verwenden und dann die 
Teile, die dir suboptimal erscheinen, entsprechend abändern.

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