Forum: Compiler & IDEs Brauche Hilfe mit C->ARM-Assembler


von Mark .. (mork)


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

von Rolf Magnus (Gast)


Lesenswert?

> kann mir bitte jemand helfen, eine kleine C-Routine nach ARM-Assembler
> umzuschreiben?

Der Compiler kann das. Warum willst du es überhaupt in Assembler haben?

von Mark .. (mork)


Lesenswert?

Weil der Code sonst zu langsam ist.

von kosmonaut pirx (Gast)


Lesenswert?

behauptung. beweise bitte.

von Rolf Magnus (Gast)


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.

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
Noch kein Account? Hier anmelden.