Ich habe das ganze mal auf folgendes Minimalbeispiel runtergebrochen.
Die SWI Anweisung scheint einfach "durchzulaufen", d.h. die
Ausgangsleitung PB21 wird auf 0 gesetzt. Erwartet hätte man, dass PA30
auf 0 gezogen wird. Ich bin echt ratlos, warum funktioniert das nicht ?
1 | .section .vectors
|
2 | .arm
|
3 |
|
4 | reset:
|
5 | ldr pc, .Lvector_reset
|
6 | b exit
|
7 | ldr pc, .Lvector_swi
|
8 | b exit
|
9 | b exit
|
10 | nop
|
11 | b exit
|
12 | b exit
|
13 |
|
14 | .Lvector_reset: .word .Lstartup
|
15 | .Lvector_undef: .word 0
|
16 | .Lvector_swi: .word .Lswi_isr
|
17 | .Lvector_pref_abt: .word 0
|
18 | .Lvector_data_abt: .word 0
|
19 | .word 0
|
20 | .Lvector_fiq: .word 0
|
21 | .word 0
|
22 |
|
23 |
|
24 | .section .text
|
25 | .arm
|
26 |
|
27 | .equ PSR_MODE_SVC, 0x13 /* (10011) Supervisor Mode (SVC) */
|
28 | .equ PSR_I_BIT, 0x80 /* IRQ disable bit */
|
29 | .equ PSR_F_BIT, 0x40 /* FIQ disable bit */
|
30 |
|
31 | .Lstartup:
|
32 |
|
33 | /* switch to SVC mode and setup stack */
|
34 | msr cpsr_c, #(PSR_MODE_SVC|PSR_I_BIT|PSR_F_BIT)
|
35 |
|
36 | /* strange behavior */
|
37 | swi 0x80
|
38 |
|
39 | /* PIOB_PIO_PER = (1 << 21) */
|
40 | ldr r0, =0xFFFFF600
|
41 | mov r1, #(1 << 21)
|
42 | str r1, [r0]
|
43 | /* PIOB_PIO_OER = (1 << 21) */
|
44 | ldr r0, =0xFFFFF610
|
45 | mov r1, #(1 << 21)
|
46 | str r1, [r0]
|
47 | /* PIOB_PIO_CODR = (1 << 21) */
|
48 | ldr r0, =0xFFFFF634
|
49 | mov r1, #(1 << 21)
|
50 | str r1, [r0]
|
51 |
|
52 | b .Lexit
|
53 |
|
54 | .Lswi_isr:
|
55 | /* PIOA_PIO_PER = (1 << 30) */
|
56 | ldr r0, =0xFFFFF400
|
57 | mov r1, #(1 << 30)
|
58 | str r1, [r0]
|
59 | /* PIOA_PIO_OER = (1 << 30) */
|
60 | ldr r0, =0xFFFFF410
|
61 | mov r1, #(1 << 30)
|
62 | str r1, [r0]
|
63 | /* PIOA_PIO_CODR = (1 << 30) */
|
64 | ldr r0, =0xFFFFF434
|
65 | mov r1, #(1 << 30)
|
66 | str r1, [r0]
|
67 |
|
68 | exit:
|
69 | .Lexit: b .Lexit
|