www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Assembler für AT91RM9200


Autor: zeiro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe einen DNP/9200 mit einem RM9200 (mit Linux) und möchte gerne 
einen Interrupt programmieren. Als Vorlage habe ich mir das Dokument: 
Interrupt Generation 
www.atmel.com/dyn/resources/prod_documents/doc2683.pdf gesucht.

Muss man nun den Interrupt in Assembler schreiben oder geht das in C 
auch?
Wie compiliert man eine Assembler? Auf der mitgelieferten CD war ein 
Assembler dabei arm-linux-as leider funktioniert er nicht.

Vielleicht kann mit Jemand einen Tipp geben. Danke schon man im voraus.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unter Linux assembliert man doch auch mit dem gcc: die Dateiendung muß 
nur .s sein.

Autor: zeiro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider erkennt auch der gcc in jeder Zeile einen Fehler.

Hier ein Auszug:
zeiro@6715b:~/test2$ /usr/local/arm/2.95.2/bin/arm-linux-gcc Irq_timer.s
Irq_timer.s: Assembler messages:
Irq_timer.s:1: Error: Rest of line ignored. First ignored character is 
`-'.
Irq_timer.s:2: Error: bad instruction `the software is delivered "AS 
IS"without warranty or condition of any kind,either express,implied or 
statutory.'
Irq_timer.s:3: Error: bad instruction `this includes without limitation 
any warranty or condition with respect to merchantability or fitness for 
any particular purpose,or'
Irq_timer.s:4: Error: bad instruction `against the'
.
.
.

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der in der AppNote gezeigt Code muss für den GNU Assembler angepasst 
werden, wurde vermutlich für Realview-Tools gemacht. Die Fehlermeldungen 
im vorherigen Beitrag sind auf unterschiedliche Kommentarzeichen 
zurückzuführen (GNU-Assembler ohne vorgeschalteten Preprozessor nutzt 
@), das lässt sich einfach per search/replace anpassen. Portierung von 
AREA etc. ist ein wenig kniffliger, GNU Assembler-Manual hilft.

Autor: zeiro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenne mich leider sehr wenig aus in Assembler. Ich glaube es werden 
einfach nur die Speicherstände auf des Stack gelegt. Ich möchte 
eigentlich nur einen einfachen Interrupt programmieren. Ist dies auch in 
reinem C möglich hat jemand dazu ein code?

Autor: zeiro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe den "RealView"-Code für "GNU" Assembler angepasst, leider habe 
ich noch einige Fehler.

zeiro@6715b:~/test2$ /usr/local/arm/2.95.2/bin/arm-linux-gcc -o 
timer_interrupt.x timer_interrupt.c
/tmp/ccCjFzJu.s: Assembler messages:
/tmp/ccCjFzJu.s:287: Error: non-constant expression in ".if" statement
/tmp/ccCjFzJu.s:293: Error: non-constant expression in ".if" statement
/tmp/ccCjFzJu.s:293: Error: Garbage following instruction
/tmp/ccCjFzJu.s:293: Error: flag for {c}psr instruction expected

kann mir Jemamd helfen? -Danke-
void timer1_asm_irq_handler (void)
//* Begin
{

asm volatile(
" @---------------------------------------------------------------------\n\t"
" @- File source           : irq_timer.s        \n\t"
" @- Object                : Assembler timer Interrupt Handler    \n\t"
" @- Author                 : AT91 Application Group      \n\t"
" @---------------------------------------------------------------------\n\t"

" .text                 \n\t"
" .equ    AIC_BASE,  0xFFFFF000      \n\t"
" .equ    AIC_IVR,  0x100        \n\t"
" .equ    AIC_EOICR,  0x130        \n\t"

" @- ARM Core Mode and Status Bits        \n\t"
" .equ    ARM_MODE_IRQ,  0x12        \n\t"
" .equ    ARM_MODE_SYS,  0x1F        \n\t"
" .equ    I_BIT,    0x80        \n\t"

".macro  IRQ_ENTRY  reg          \n\t"
" @- Adjust and save LR_irq in IRQ stack      \n\t"
"  sub         r14, r14, #4        \n\t"
"  stmfd       sp!, {r14}          \n\t"

" @- Write in the IVR to support Protect Mode      \n\t"
" @- No effect in Normal Mode          \n\t"
" @- De-assert the NIRQ and clear the source in Protect Mode  \n\t"
"  ldr         r14, =AIC_BASE        \n\t"
"  str         r14, [r14, #AIC_IVR]      \n\t"

"@- Save SPSR and r0 in IRQ stack        \n\t"
"  mrs          r14, SPSR          \n\t"
"  stmfd        sp!, {r0, r14}        \n\t"

"@;- Enable Interrupt and Switch in SYS Mode    \n\t"
"  mrs          r0, CPSR        \n\t"
"  bic          r0, r0, #I_BIT      \n\t"
"  orr          r0, r0, #ARM_MODE_SYS    \n\t"
"  msr          CPSR_c, r0        \n\t"

"@- Save scratch/used registers and LR in User Stack  \n\t"
"  .ifeq  \reg          \n\t"
"    stmfd        sp!, { r1-r3, r12, r14}  \n\t"
"  .else            \n\t"  
"    stmfd        sp!, { r1-r3, $reg, r12, r14}  \n\t"
"  .endif            \n\t"
".endm              \n\t"

".macro  IRQ_EXIT  reg        \n\t"  

"@- Restore scratch/used registers and LR from User Stack  \n\t"
"  .ifeq  \reg            \n\t"
"    ldmia        sp!, { r1-r3, r12, r14}    \n\t"  
"  .else               \n\t"
"    ldmia        sp!, { r1-r3, $reg, r12, r14}  \n\t"
"  .endif              \n\t"

"@- Disable Interrupt and switch back in IRQ mode  \n\t"
"  mrs          r0, CPSR        \n\t"
"  bic          r0, r0, #ARM_MODE_SYS    \n\t"
"  orr          r0, r0, #I_BIT:OR:ARM_MODE_IRQ  \n\t"
"  msr          CPSR_c, r0        \n\t"

"@- Mark the End of Interrupt on the AIC    \n\t"
"  ldr          r0, =AIC_BASE      \n\t"
"  str          r0, [r0, #AIC_EOICR]    \n\t"  

"@- Restore SPSR_irq and r0 from IRQ stack    \n\t"
"  ldmia        sp!, {r0, r14}      \n\t"
"  msr          SPSR_cxsf, r14      \n\t"

"@- Restore adjusted    LR_irq from IRQ stack directly in the PC\n\t"
"  ldmia        sp!, {pc}^          \n\t"
".endm                \n\t"

"@---------------------------------------------------------------\n\t"
"@- Function             : timer1_asm_irq_handler    \n\t"
"@- Treatments           : Timer 1 interrupt handler.    \n\t"
"@- Called Functions     : timer1_c_irq_handler      \n\t"
"@- Called Macros         : IRQ_ENTRY, IRQ_EXIT      \n\t"
"@--------------------------------------------------------------\n\t"
"             .extern      timer1_c_irq_handler      \n\t"
"  .global    timer1_asm_irq_handler      \n\t"
"@- Manage Exception Entry          \n\t"
"             IRQ_ENTRY            \n\t"
"@- Call the timer Interrupt C handler        \n\t"
"             ldr         r1, =timer1_c_irq_handler    \n\t"
"             mov         r14, pc        \n\t"
"             bx          r1          \n\t"
"@- Manage Exception Exit          \n\t"
"            IRQ_EXIT            \n\t"
".end                \n\t"

);
}

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.