www.mikrocontroller.net

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


Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht 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.
void __attribute__ ((interrupt("IRQ"))) cam_hsync()
{

  for(register int i=0;i<88;i++)
  {
    while(!(FIO0PIN&(1<<15)));//warte bis FIO0PIN.15==1
    *(pixelpointer++)=FIO1PINU; //speichere FIO0PIN2 in [pixelpointer] und erhöhe ihn
    while(FIO0PIN&(1<<15));//warte bis FIO0PIN.15==0
    while(!(FIO0PIN&(1<<15)));//warte bis FIO0PIN.15==1
    while(FIO0PIN&(1<<15));//warte bis FIO0PIN.15==0
  }
  
  if(hsynccount)
  {
    pixelpointer-=88;
    hsynccount=0;
  }
  else hsynccount=1;
  
  
  vsync=0;
  EXTINT=(1<<3);//Extint-flag löschen
  VICVectAddr = 0; // Interrupt im VIC bestätigen
}

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

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

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

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

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

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

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

);

  if(hsynccount)
  {
    pixelpointer-=88;
    hsynccount=0;
  }
  else hsynccount=1;
  
  vsync=0;
  EXTINT=(1<<3);
  VICVectAddr = 0; // Interrupt im VIC bestätigen
}

MfG Mark

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil der Code sonst zu langsam ist.

Autor: kosmonaut pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
behauptung. beweise bitte.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.