Compiler & IDEs
›
Thread
Data Abort Interrupt bei LPC2148
ES
Eduard S.
(rfk)
09.04.2008 16:57
#837996
Hallo allerseits. Ich habe leider ein kleines Problem mit meinem
LPC2148 , das ich im Linkerscript bzw. CRT vermute. Und zwar springt der
Controller immer die Data Abort Interruptroutine an, sobald ich mit
einem global initialisierten Pointer in ein globales Array schreibe:
1 // Verursacht einen Fehler
2 char array [ 100 ];
3 char * p = array ;
4
5 void demo () {
6 * p = 'a' ; // Data abort
7 }
Folgender Fall funktioniert:
1 // Funktioniert
2 char array [ 100 ];
3 char * p ;
4
5 void demo () {
6 p = array ;
7 * p = 'a' ;
8 }
Im Fehlerfall müsste ja array im .bss und p im .data Segment liegen. Im
zweiten Fall sollten beide im .bss Segment liegen. Mein Linkerscript
sieht wie folgt aus:
1 ENTRY(_start)
2 STARTUP("lpc2148-crt.o")
3
4 MEMORY {
5 flash (rx) : ORIGIN = 0x00000000, LENGTH = 512K /* Flash ROM */
6 ram_isp_low(A) : ORIGIN = 0x40000120, LENGTH = 224 /* ISP low */
7 ram : ORIGIN = 0x40000200, LENGTH = 32513 /* On-chip RAM */
8 ram_isp_high(A) : ORIGIN = 0x40007FE0, LENGTH = 32 /* ISP high */
9 ram_usb_dma : ORIGIN = 0x7FD00000, LENGTH = 8192 /* USB DMA */
10 }
11
12 _stack_end = 0x40007EDC;
13
14 SECTIONS {
15 .text 0x0000 : {
16 *(.text)
17 _text_end = .;
18 } >flash =0xFFFF
19
20 .rodata ALIGN(4) : {
21 *(.rodata*)
22 _rodata_end = .;
23 . = ALIGN(4);
24 _data_romimage = .;
25 } >flash =0x0000
26
27 .data : AT (ADDR(.rodata) + SIZEOF(.rodata)) {
28 _data_start = .;
29 *(.data)
30 _data_end = .;
31 } >ram =0x0000
32
33 .bss : {
34 _bss_start = .;
35 *(.bss)
36 *(COMMON)
37 _bss_end = .;
38 } >ram =0x0000
39 }
Mein CRT:
1 .set UND_STACK_SIZE, 0x00000010
2
3 .set ABT_STACK_SIZE, 0x00000080
4
5 .set FIQ_STACK_SIZE, 0x00000020
6
7 .set IRQ_STACK_SIZE, 0X00000200
8
9 .set SVC_STACK_SIZE, 0x00000020
10
11
12
13
14
15 /* Standard definitions */
16
17 .set MODE_USR, 0x10
18
19 .set MODE_FIQ, 0x11
20
21 .set MODE_IRQ, 0x12
22
23 .set MODE_SVC, 0x13
24
25 .set MODE_ABT, 0x17
26
27 .set MODE_UND, 0x1B
28
29 .set MODE_SYS, 0x1F
30
31 .set DISABLE_IRQ, 0x80
32
33 .set DISABLE_FIQ, 0x40
34
35
36
37 .text
38
39 .arm
40
41
42
43 .global _start
44
45 .func _start
46
47
48
49 _start:
50
51 _vectors: ldr PC, Reset_Addr
52
53 ldr PC, Undef_Addr
54
55 ldr PC, SWI_Addr
56
57 ldr PC, PAbt_Addr
58
59 ldr PC, DAbt_Addr
60
61 nop
62
63 ldr PC, [PC,#-0xFF0]
64
65 ldr PC, FIQ_Addr
66
67
68
69 Reset_Addr: .word Reset_Handler
70
71 Undef_Addr: .word undefHandler
72
73 SWI_Addr: .word swiHandler
74
75 PAbt_Addr: .word pabtHandler
76
77 DAbt_Addr: .word dabtHandler
78
79 IRQ_Addr: .word irqHandler
80
81 FIQ_Addr: .word fiqHandler
82
83 .word 0
84
85
86
87 Reset_Handler:
88 ldr r0, =_stack_end
89
90 msr CPSR_c, #MODE_UND
91
92 mov sp, r0
93
94 sub r0, r0, #UND_STACK_SIZE
95
96 msr CPSR_c, #MODE_ABT
97
98 mov sp, r0
99
100 sub r0, r0, #ABT_STACK_SIZE
101
102 msr CPSR_c, #MODE_FIQ
103
104 mov sp, r0
105
106 sub r0, r0, #FIQ_STACK_SIZE
107
108 msr CPSR_c, #MODE_IRQ
109
110 mov sp, r0
111
112 sub r0, r0, #IRQ_STACK_SIZE
113
114 msr CPSR_c, #MODE_SVC
115
116 mov sp, r0
117
118 sub r0, r0, #SVC_STACK_SIZE
119
120 msr CPSR_c, #MODE_SYS
121
122 mov sp, r0
123
124
125
126 /* copy .data section (Copy from ROM to RAM) */
127
128 ldr R1, =_text_end
129
130 ldr R2, =_data_start
131
132 ldr R3, =_data_end
133
134 1: cmp R2, R3
135
136 ldrlo R0, [R1], #4
137
138 strlo R0, [R2], #4
139
140 blo 1b
141
142
143
144 /* Clear .bss section (Zero init) */
145
146 mov R0, #0
147
148 ldr R1, =_bss_start
149
150 ldr R2, =_bss_end
151
152 2: cmp R1, R2
153
154 strlo R0, [R1], #4
155
156 blo 2b
157
158
159
160 /* Enter the C code */
161
162 b main
163
164
165 .endfunc
166
167 .end
Kann mir vielleicht jemand den entscheidenden Hinweis geben?
Danke!
AK
Andreas K.
(a-k)
09.04.2008 17:03
#838003
Der Startup-Code passt nicht zum Linker-Script. Die Initialisierung von
.data kopiert ab Ende von .text, aber da fängt nicht .data an, sondern
.rodata.
Sowohl im Code als auch im Linkerscript das dafür vorgesehene Symbol
_data_romimage für den Anfang der Daten im Flash verwenden. Also
ldr R1, =_data_romimage
und
.data : AT (_data_romimage) {
ES
Eduard S.
(rfk)
10.04.2008 07:35
#838520
Autsch, jetzt sehe ich es auch. Durch das viele Ausprobieren ist da in
der Tat was durcheinander gekommen. Vielen lieben Dank für deine Hilfe!!
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren