www.mikrocontroller.net

Forum: Compiler & IDEs Data Abort Interrupt bei LPC2148


Autor: Eduard Steinberg (rfk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
// Verursacht einen Fehler
char array[100];
char *p = array;

void demo() {
  *p = 'a';  // Data abort
}

Folgender Fall funktioniert:
// Funktioniert
char array[100];
char *p;

void demo() {
  p = array;
  *p = 'a';
}

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:
ENTRY(_start)
STARTUP("lpc2148-crt.o")

MEMORY {
  flash (rx)    : ORIGIN = 0x00000000, LENGTH = 512K  /* Flash ROM */
  ram_isp_low(A)  : ORIGIN = 0x40000120, LENGTH = 224    /* ISP low */
  ram        : ORIGIN = 0x40000200, LENGTH = 32513  /* On-chip RAM */
  ram_isp_high(A)  : ORIGIN = 0x40007FE0, LENGTH = 32    /* ISP high */
  ram_usb_dma    : ORIGIN = 0x7FD00000, LENGTH = 8192  /* USB DMA */
}

_stack_end = 0x40007EDC;

SECTIONS {
  .text 0x0000 : {
    *(.text)
    _text_end = .;
  } >flash =0xFFFF
  
  .rodata ALIGN(4) : {
    *(.rodata*)
    _rodata_end = .;
    . = ALIGN(4);
    _data_romimage = .;
  } >flash =0x0000

  .data : AT (ADDR(.rodata) + SIZEOF(.rodata)) {
    _data_start = .;
    *(.data)
    _data_end = .;
  } >ram =0x0000
  
  .bss : {
    _bss_start = .;
    *(.bss)
    *(COMMON)
    _bss_end = .;
  } >ram =0x0000
}

Mein CRT:
.set  UND_STACK_SIZE, 0x00000010

.set  ABT_STACK_SIZE, 0x00000080

.set  FIQ_STACK_SIZE, 0x00000020

.set  IRQ_STACK_SIZE, 0X00000200

.set  SVC_STACK_SIZE, 0x00000020





/* Standard definitions */

.set  MODE_USR, 0x10

.set  MODE_FIQ, 0x11

.set  MODE_IRQ, 0x12

.set  MODE_SVC, 0x13

.set  MODE_ABT, 0x17

.set  MODE_UND, 0x1B

.set  MODE_SYS, 0x1F

.set  DISABLE_IRQ, 0x80

.set  DISABLE_FIQ, 0x40



.text

.arm



.global _start

.func   _start



_start:

_vectors:       ldr     PC, Reset_Addr

                ldr     PC, Undef_Addr

                ldr     PC, SWI_Addr

                ldr     PC, PAbt_Addr

                ldr     PC, DAbt_Addr

                nop

                ldr     PC, [PC,#-0xFF0]

                ldr     PC, FIQ_Addr



Reset_Addr:     .word   Reset_Handler

Undef_Addr:     .word   undefHandler

SWI_Addr:       .word   swiHandler

PAbt_Addr:      .word   pabtHandler

DAbt_Addr:      .word   dabtHandler

IRQ_Addr:       .word   irqHandler

FIQ_Addr:       .word   fiqHandler

                .word   0      



Reset_Handler:
    ldr   r0, =_stack_end

    msr   CPSR_c, #MODE_UND

    mov   sp, r0

    sub   r0, r0, #UND_STACK_SIZE

    msr   CPSR_c, #MODE_ABT

    mov   sp, r0

    sub   r0, r0, #ABT_STACK_SIZE

    msr   CPSR_c, #MODE_FIQ

    mov   sp, r0  

    sub   r0, r0, #FIQ_STACK_SIZE

    msr   CPSR_c, #MODE_IRQ

    mov   sp, r0

    sub   r0, r0, #IRQ_STACK_SIZE

    msr   CPSR_c, #MODE_SVC

    mov   sp, r0

    sub   r0, r0, #SVC_STACK_SIZE

    msr   CPSR_c, #MODE_SYS

    mov   sp, r0



    /* copy .data section (Copy from ROM to RAM) */

    ldr     R1, =_text_end

    ldr     R2, =_data_start

    ldr     R3, =_data_end

1:    cmp     R2, R3

    ldrlo   R0, [R1], #4

    strlo   R0, [R2], #4

    blo     1b



    /* Clear .bss section (Zero init)  */

    mov     R0, #0

    ldr     R1, =_bss_start

    ldr     R2, =_bss_end

2:    cmp     R1, R2

    strlo   R0, [R1], #4

    blo     2b



    /* Enter the C code  */

    b    main


.endfunc

.end

Kann mir vielleicht jemand den entscheidenden Hinweis geben?

Danke!

Autor: Andreas K. (a-k)
Datum:

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

Autor: Eduard Steinberg (rfk)
Datum:

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

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.