This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS570LS1224: bootloader application jump leads to undefEntry after interrups are enabled

Part Number: TMS570LS1224
Other Parts Discussed in Thread: HALCOGEN

Hello all,

I have problems to add an bootloader to an existing project on a on a TMS570LS1224. Before adding the bootloader the application it self was running without any problems for 2 years now.

Now I have a problem to start the application from a bootlader . After I jumped to the application I end up in the undefEntry which is a endless loop in my case.

For both bootloader and application I use the same Halcogen configuration but different linker scripts of cause. Before jumping to the application I de initialize all used modules and I disable all interrupts with _disable_interrupts_. For the bootloader  the F021 API is configured to run from RAM and I copy it from FLASH to RAM in the bootloaders reset handler (_bl_c_init_00) just before calling bootloaders bl_main(). After that I'm able to write to the FLASH and EEPROM.  For the application the F021 API remains in FLASH since I only write to the EEPROM from there.

To analyze my problem I flashed both bootloader and application via JTAG. When I now debug the bootloader and do the jump to the application i reach the applications reset handler _c_init_00() and finally applications main(). Now everything seems to work fin until I enable Interrupts again by calling _enable_interrupts_. Either immediately or after a few further steps I end up in the bootloaders undefEntry. The link register always points to the RAM where the F021 API was located for the bootloader.

I guess I have some misconfigured interrupt handler in the VIM. Now my question is how I can determine which interrupt causes the problem.

Kind regards

Jens

  • Hello Jens,

    Please change your interrupt vector using the following example:
    (0x100F8 is the application start address minus 0x08)

    b _c_int00 ;0x00
    b #0x100F8 ;0x04; 0x100F8=$10100-0x8; where the 0x10100 is the application start addr
    b #0x100F8 ;0x08, Software interrupt
    b #0x100F8 ;0x0C, Abort (prefetch)
    b #0x100F8 ;0x10, Abort (data)
    reservedEntry
    b reservedEntry ;0x14
    ldr pc,[pc, #-0x1b0] ;0x18
    ldr pc,[pc, #-0x1b0] ;0x1C
  • Hello QJ,

    thank you very much for your reply. Is your example the vector table of the bootloader or the application?

    This is my vector table for the bootloder:

    resetEntry:
            b   _bl_c_int00
    undefEntry:
            b   undefEntry
    svcEntry:
            b   svcEntry
    prefetchEntry:
            b   prefetchEntry
            b   _dabort
            b   phantomInterrupt
            ldr pc,[pc,#-0x1b0]
            ldr pc,[pc,#-0x1b0]

    and this is the vector table of my Application:

    resetEntry:
            b   _c_int00
    undefEntry:
            b   undefEntry
    svcEntry:
            b   svcEntry
    prefetchEntry:
            b   prefetchEntry
            b   _dabort
            b   phantomInterrupt
            ldr pc,[pc,#-0x1b0]
            ldr pc,[pc,#-0x1b0]

    Kind regards

    Jens

  • Hello Jens,

    My example is the vector table for bootloader.
  • Hello QJ,

    since the undefEntry, svcEntry and prefetchEntry are are endless loops and I have no special handler for them its no problem that the application doesn't have its own vectors for undefEntry, svcEntry and prefetchEntry.  My Problem is not that my application ends up in the vector table of the bootlader for the undefEnrty, but that its ends up in the undefEntry at all.

    How can I determine the reason for the undef exception?

    Best regards

    Jens

  • Hi Jens,

    please try my vector table for your bootloader, and see what happens.
    where: 0x100F8 = application start address - 0x8

    b _c_int00
    b #0x100F8
    b #0x100F8
    b #0x100F8
    b #0x100F8
    reservedEntry
    b reservedEntry ;0x14
    ldr pc,[pc, #-0x1b0] ;0x18
    ldr pc,[pc, #-0x1b0] ;0x1C
  • Hello QJ,

    I'am out of office until end of the week. I will check it as soon as I'm back in office.

    Kind Regards
    Jens
  • Hello QJ,

    I tried your vector table, but with that I always end up in in the for loop of this part of code in my sys_startup.c and the ERROR LED turns on:

        /* Check if there were ESM group3 errors during power-up.
         * These could occur during eFuse auto-load or during reads from flash OTP
         * during power-up. Device operation is not reliable and not recommended
         * in this case.
         * An ESM group3 error only drives the nERROR pin low. An external circuit
         * that monitors the nERROR pin must take the appropriate action to ensure that
         * the system is placed in a safe state, as determined by the application.
         */
        if ((esmREG->SR1[2]) != 0U)
        {
    /* USER CODE BEGIN (24) */
    /* USER CODE END */
        /*SAFETYMCUSW 5 C MR:NA <APPROVED> "for(;;) can be removed by adding "# if 0" and "# endif" in the user codes above and below" */
        /*SAFETYMCUSW 26 S MR:NA <APPROVED> "for(;;) can be removed by adding "# if 0" and "# endif" in the user codes above and below" */
        /*SAFETYMCUSW 28 D MR:NA <APPROVED> "for(;;) can be removed by adding "# if 0" and "# endif" in the user codes above and below" */
            for(;;)
            { 
            }/* Wait */                 
    /* USER CODE BEGIN (25) */
    /* USER CODE END */
        }

    Kind regards

    Jens

  • Hello QJ,

    while trying to find the reason for the undefEntry IRQ I stepped trough the code with the debugger in single stepping mode. Using my version of the vector table I was able to run my application several times but most of the time I end up in the undefEntry. So I think my setup seems to be correct in principle but there must be a race condition that causes the undefEntry IRQ.

    Any Ideas how to narrow down the reason of the problem?

    Kind regards

    Jens

  • Jens,

    The Cortex-R4 TRM goes into the details about how to handle an "Undefined Instruction" exception. You can certainly identify the instruction that caused the exception and then choose to execute it again or return to the instruction after the one that caused the exception.

    See: developer.arm.com/.../undefined-instruction

    Regards,
    Sunil
  • Hi Jens,

    Since the application is not located the beginning of the flash, you need to modify the cmd file to use the application start address for vector and flash0.

    /*----------------------------------------------------------------------------*/

    /* Linker Settings                                                            */

    --retain="*(.intvecs)"

    -heap 0x800

    /*----------------------------------------------------------------------------*/

    /* Memory Map                                                                 */

    MEMORY{

       VECTORS (X)  : origin=0x00010000 length=0x00000020

       FLASH0  (RX) : origin=0x00010020 length=0x0007FFE0

       STACKS  (RW) : origin=0x08000000 length=0x00001300

       RAM     (RW) : origin=0x08001300 length=0x0003ED00

    }

    /*----------------------------------------------------------------------------*/

    /* Section Configuration                                                      */

    SECTIONS{

       .intvecs : {} > VECTORS

       .text    : {} > FLASH0

       .const   : {} > FLASH0

       .cinit   : {} > FLASH0

       .pinit   : {} > FLASH0

       .bss     : {} > RAM

       .data    : {} > RAM

    .sysmem  : {} > RAM

    }

    /*-----------------------------

  • Hello QJ,

    of cause I have different linker scripts for the bootloader and the application.

    Bootloader:

    /*----------------------------------------------------------------------------*/
    /* sys_link.ld                                                              */
    /*                                                                            */
    /* (c) Texas Instruments 2009-2013, All rights reserved.                      */
    /*                                                                            */
    /*----------------------------------------------------------------------------*/
    
    /* Entry Point */
    ENTRY(_bl_c_int00)
    
    /* Highest address of the stack */
    _estack = 0x8030000;    /* end of 192K RAM */
    
    /* Generate a link error if heap and stack don't fit into RAM */
    _Min_Heap_Size = 0x400;      /* required amount of heap  */
    
    /* Specify the memory areas */
    MEMORY
    {
      VECTORS(rx)     : ORIGIN = 0x00000000, LENGTH = 32    /* Bank 0 / Sektor 0 */
      F021_API (rx)   : ORIGIN = 0x00000020, LENGTH = 5088  /* Bank 0 / Sektor 0 */
      BL_FLASH (rx)   : ORIGIN = 0x00001400, LENGTH = 123K  /* Bank 0 / Sektor 0 .. 6 */
      FLASH  (rx)     : ORIGIN = 0x00020000, LENGTH = 0x0011FFFF /* Bank 0 / Sektor 7 .. 15 */
      CPU_STACK (rw)  : ORIGIN = 0x08000000, LENGTH = 0x00001500 /* Stack is configured in sys_core.asm */
      RAM (xrw)       : ORIGIN = 0x08001500, LENGTH = 0x0002EB00
      MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
      NVM_FLASH (rx)  : ORIGIN = 0xF0200000, LENGTH = 64K /* Bank 7 / Sektor 0 .. 3 */
    }
    
    _app_start    = ORIGIN(FLASH);
    _app_end      = ORIGIN(FLASH) + LENGTH(FLASH) - 1;
    _app_size_max = _app_end - _app_start;
    
    /* Define output sections */
    SECTIONS
    {
      /* The ISR vector goes first into RAM */
      .intvecs :
      {
        . = ALIGN(4);
        KEEP(*(.intvecs)) /* ISR vector */
        . = ALIGN(4);
      } >VECTORS
    
      .magic ORIGIN(FLASH) + LENGTH(VECTORS) : 
      {
        . = ALIGN(4);
        KEEP(*(.magic))
        . = . + 4; 
      } >FLASH
      _app_magic = ADDR(.magic);
    
      .f021_API :
      {
        KEEP(*(.f012_API))
        . = ALIGN(4);
        _f021API_start = .;
        *(.f021_API*)
        *nvm.o:*(.*)
        *libF021_API_CortexR4_BE_V3D16_NDS.a:*
       . = ALIGN(4);
        _f021API_end = .;
       } >RAM AT >F021_API
       
       _f021API_load = LOADADDR(.f021_API);
    
    
      /* The program code and other data goes into RAM */
      .text :
      {
        . = ALIGN(4);
        *(.text)           /* .text sections (code) */
        *(.text*)          /* .text* sections (code) */
        *(.glue_7)         /* glue arm to thumb code */
        *(.glue_7t)        /* glue thumb to arm code */
        *(.eh_frame)
    
        KEEP (*(.init))
        KEEP (*(.fini))
    
        . = ALIGN(4);
        _etext = .;        /* define a global symbols at end of code */
      } >BL_FLASH
    
      /* Constant data goes into RAM */
      .rodata :
      {
        . = ALIGN(4);
        *(.rodata)         /* .rodata sections (constants, strings, etc.) */
        *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
        . = ALIGN(4);
      } >BL_FLASH
    
       .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >RAM
        .ARM : {
        __exidx_start = .;
          *(.ARM.exidx*)
          __exidx_end = .;
        } >BL_FLASH
    
      .preinit_array     :
      {
        PROVIDE_HIDDEN (__preinit_array_start = .);
        KEEP (*(.preinit_array*))
        PROVIDE_HIDDEN (__preinit_array_end = .);
      } >BL_FLASH
      .init_array :
      {
        PROVIDE_HIDDEN (__init_array_start = .);
        KEEP (*(SORT(.init_array.*)))
        KEEP (*(.init_array*))
        PROVIDE_HIDDEN (__init_array_end = .);
      } >BL_FLASH
      .fini_array :
      {
        PROVIDE_HIDDEN (__fini_array_start = .);
        KEEP (*(SORT(.fini_array.*)))
        KEEP (*(.fini_array*))
        PROVIDE_HIDDEN (__fini_array_end = .);
      } >BL_FLASH
    
      /* used by the startup to initialize data */
      _sidata = LOADADDR(.data);
      
      /* Initialized data sections goes into RAM, load LMA copy after code */
      .data :
      {
        . = ALIGN(4);
        _sdata = .;        /* create a global symbol at data start */
        *(.data)           /* .data sections */
        *(.data*)          /* .data* sections */
    
        . = ALIGN(4);
        _edata = .;        /* define a global symbol at data end */
      } >RAM AT> BL_FLASH
    
      /* Uninitialized data section */
      . = ALIGN(4);
      .bss :
      {
        /* This is used by the startup in order to initialize the .bss secion */
        _sbss = .;         /* define a global symbol at bss start */
        __bss_start__ = _sbss;
        *(.bss)
        *(.bss*)
        *(COMMON)
    
        . = ALIGN(4);
        _ebss = .;         /* define a global symbol at bss end */
        __bss_end__ = _ebss;
      } >RAM
    
      PROVIDE ( end = _ebss );
      PROVIDE ( _end = _ebss );
    
      /* MEMORY_bank1 section, code must be located here explicitly            */
      /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */
      .memory_b1_text :
      {
        *(.mb1text)        /* .mb1text sections (code) */
        *(.mb1text*)       /* .mb1text* sections (code)  */
        *(.mb1rodata)      /* read-only data (constants) */
        *(.mb1rodata*)
      } >MEMORY_B1
    
      /* Remove information from the standard libraries */
      /DISCARD/ :
      {
        libc.a ( * )
        libm.a ( * )
        libgcc.a ( * )
      }
      
      .ARM.attributes 0 : { *(.ARM.attributes) }
    }
    

    Application:

    /*----------------------------------------------------------------------------*/
    /* sys_link.ld                                                              */
    /*                                                                            */
    /* (c) Texas Instruments 2009-2013, All rights reserved.                      */
    /*                                                                            */
    /*----------------------------------------------------------------------------*/
    
    /* Entry Point */
    ENTRY(_bl_c_int00)
    
    /* Highest address of the stack */
    _estack = 0x8030000;    /* end of 192K RAM */
    
    /* Generate a link error if heap and stack don't fit into RAM */
    _Min_Heap_Size = 0x400;      /* required amount of heap  */
    
    /* Specify the memory areas */
    MEMORY
    {
      VECTORS(rx)     : ORIGIN = 0x00000000, LENGTH = 32    /* Bank 0 / Sektor 0 */
      F021_API (rx)   : ORIGIN = 0x00000020, LENGTH = 5088  /* Bank 0 / Sektor 0 */
      BL_FLASH (rx)   : ORIGIN = 0x00001400, LENGTH = 123K  /* Bank 0 / Sektor 0 .. 6 */
      FLASH  (rx)     : ORIGIN = 0x00020000, LENGTH = 0x0011FFFF /* Bank 0 / Sektor 7 .. 15 */
      CPU_STACK (rw)  : ORIGIN = 0x08000000, LENGTH = 0x00001500 /* Stack is configured in sys_core.asm */
      RAM (xrw)       : ORIGIN = 0x08001500, LENGTH = 0x0002EB00
      MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
      NVM_FLASH (rx)  : ORIGIN = 0xF0200000, LENGTH = 64K /* Bank 7 / Sektor 0 .. 3 */
    }
    
    _app_start    = ORIGIN(FLASH);
    _app_end      = ORIGIN(FLASH) + LENGTH(FLASH) - 1;
    _app_size_max = _app_end - _app_start;
    
    /* Define output sections */
    SECTIONS
    {
      /* The ISR vector goes first into RAM */
      .intvecs :
      {
        . = ALIGN(4);
        KEEP(*(.intvecs)) /* ISR vector */
        . = ALIGN(4);
      } >FLASH
    
      .magic : 
      {
        . = ALIGN(4);
        KEEP(*(.magic)) 
      } >FLASH
      _app_magic = ADDR(.magic);
    
      /* The program code and other data goes into RAM */
      .text :
      {
        . = ALIGN(4);
        *(.text)           /* .text sections (code) */
        *(.text*)          /* .text* sections (code) */
        *(.glue_7)         /* glue arm to thumb code */
        *(.glue_7t)        /* glue thumb to arm code */
        *(.eh_frame)
    
        KEEP (*(.init))
        KEEP (*(.fini))
    
        . = ALIGN(4);
        _etext = .;        /* define a global symbols at end of code */
      } >FLASH
    
    
      /* Constant data goes into RAM */
      .rodata :
      {
        . = ALIGN(4);
        *(.rodata)         /* .rodata sections (constants, strings, etc.) */
        *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
        . = ALIGN(4);
      } >FLASH
    
       .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >RAM
        .ARM : {
        __exidx_start = .;
          *(.ARM.exidx*)
          __exidx_end = .;
        } >FLASH
    
      .preinit_array     :
      {
        PROVIDE_HIDDEN (__preinit_array_start = .);
        KEEP (*(.preinit_array*))
        PROVIDE_HIDDEN (__preinit_array_end = .);
      } >FLASH
      .init_array :
      {
        PROVIDE_HIDDEN (__init_array_start = .);
        KEEP (*(SORT(.init_array.*)))
        KEEP (*(.init_array*))
        PROVIDE_HIDDEN (__init_array_end = .);
      } >FLASH
      .fini_array :
      {
        PROVIDE_HIDDEN (__fini_array_start = .);
        KEEP (*(SORT(.fini_array.*)))
        KEEP (*(.fini_array*))
        PROVIDE_HIDDEN (__fini_array_end = .);
      } >FLASH
    
      /* used by the startup to initialize data */
      _sidata = LOADADDR(.data);
      
      /* Initialized data sections goes into RAM, load LMA copy after code */
      .data :
      {
        . = ALIGN(4);
        _sdata = .;        /* create a global symbol at data start */
        *(.data)           /* .data sections */
        *(.data*)          /* .data* sections */
    
        . = ALIGN(4);
        _edata = .;        /* define a global symbol at data end */
      } >RAM AT> FLASH
    
      /* Uninitialized data section */
      . = ALIGN(4);
      .bss :
      {
        /* This is used by the startup in order to initialize the .bss secion */
        _sbss = .;         /* define a global symbol at bss start */
        __bss_start__ = _sbss;
        *(.bss)
        *(.bss*)
        *(COMMON)
    
        . = ALIGN(4);
        _ebss = .;         /* define a global symbol at bss end */
        __bss_end__ = _ebss;
      } >RAM
    
      PROVIDE ( end = _ebss );
      PROVIDE ( _end = _ebss );
    
      /* MEMORY_bank1 section, code must be located here explicitly            */
      /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */
      .memory_b1_text :
      {
        *(.mb1text)        /* .mb1text sections (code) */
        *(.mb1text*)       /* .mb1text* sections (code)  */
        *(.mb1rodata)      /* read-only data (constants) */
        *(.mb1rodata*)
      } >MEMORY_B1
    
      /* Remove information from the standard libraries */
      /DISCARD/ :
      {
        libc.a ( * )
        libm.a ( * )
        libgcc.a ( * )
      }
      
      .ARM.attributes 0 : { *(.ARM.attributes) }  
    }
    

    The jump from the bootloader to the application works and I can step from the bootlader to the application with the debugger. If I place an endless loop "while(true); " directly  at the beginning of the applications main() the application keeps running. Only if I run the complete application which is very similar to the bootloader concering halcogen configuration I end up in the undefEntry; The application itself ran and runs without any problems if I use my initial linker script:

    /*----------------------------------------------------------------------------*/
    /* sys_link.ld                                                              */
    /*                                                                            */
    /* (c) Texas Instruments 2009-2013, All rights reserved.                      */
    /*                                                                            */
    /*----------------------------------------------------------------------------*/
    /* Entry Point */
    ENTRY(_c_int00)
    
    /* Highest address of the stack */
    _estack = 0x8040000;    /* end of 256K RAM */
    
    /* Generate a link error if heap and stack don't fit into RAM */
    _Min_Heap_Size = 0x400;      /* required amount of heap  */
    
    /* Specify the memory areas */
    MEMORY
    {
      VECTORS(rx)     : ORIGIN = 0x00000000, LENGTH = 0x00000020
      FLASH  (rx)     : ORIGIN = 0x00000020, LENGTH = 0x0013FFE0
      CPU_STACK (rw)  : ORIGIN = 0x08000000, LENGTH = 0x00001500 /* Stack is configured in sys_core.asm */
      RAM (xrw)       : ORIGIN = 0x08001500, LENGTH = 0x0002eb00
      MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
    }
    
    /* Define output sections */
    SECTIONS
    {
      /* The ISR vector goes first into RAM */
      .intvecs :
      {
        . = ALIGN(4);
        KEEP(*(.intvecs)) /* ISR vector */
        . = ALIGN(4);
      } >VECTORS
    
      /* The program code and other data goes into RAM */
      .text :
      {
        . = ALIGN(4);
        *(.text)           /* .text sections (code) */
        *(.text*)          /* .text* sections (code) */
        *(.glue_7)         /* glue arm to thumb code */
        *(.glue_7t)        /* glue thumb to arm code */
        *(.eh_frame)
    
        KEEP (*(.init))
        KEEP (*(.fini))
    
        . = ALIGN(4);
        _etext = .;        /* define a global symbols at end of code */
      } >FLASH
    
      /* Constant data goes into RAM */
      .rodata :
      {
        . = ALIGN(4);
        *(.rodata)         /* .rodata sections (constants, strings, etc.) */
        *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
        . = ALIGN(4);
      } >FLASH
    
       .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >RAM
        .ARM : {
        __exidx_start = .;
          *(.ARM.exidx*)
          __exidx_end = .;
        } >FLASH
    
      .preinit_array     :
      {
        PROVIDE_HIDDEN (__preinit_array_start = .);
        KEEP (*(.preinit_array*))
        PROVIDE_HIDDEN (__preinit_array_end = .);
      } >FLASH
      .init_array :
      {
        PROVIDE_HIDDEN (__init_array_start = .);
        KEEP (*(SORT(.init_array.*)))
        KEEP (*(.init_array*))
        PROVIDE_HIDDEN (__init_array_end = .);
      } >FLASH
      .fini_array :
      {
        PROVIDE_HIDDEN (__fini_array_start = .);
        KEEP (*(SORT(.fini_array.*)))
        KEEP (*(.fini_array*))
        PROVIDE_HIDDEN (__fini_array_end = .);
      } >FLASH
    
      /* used by the startup to initialize data */
      _sidata = LOADADDR(.data);
      
      /* Initialized data sections goes into RAM, load LMA copy after code */
      .data :
      {
        . = ALIGN(4);
        _sdata = .;        /* create a global symbol at data start */
        *(.data)           /* .data sections */
        *(.data*)          /* .data* sections */
    
        . = ALIGN(4);
        _edata = .;        /* define a global symbol at data end */
      } >RAM AT> FLASH
    
      /* Uninitialized data section */
      . = ALIGN(4);
      .bss :
      {
        /* This is used by the startup in order to initialize the .bss secion */
        _sbss = .;         /* define a global symbol at bss start */
        __bss_start__ = _sbss;
        *(.bss)
        *(.bss*)
        *(COMMON)
    
        . = ALIGN(4);
        _ebss = .;         /* define a global symbol at bss end */
        __bss_end__ = _ebss;
      } >RAM
    
      PROVIDE ( end = _ebss );
      PROVIDE ( _end = _ebss );
    
      /* MEMORY_bank1 section, code must be located here explicitly            */
      /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */
      .memory_b1_text :
      {
        *(.mb1text)        /* .mb1text sections (code) */
        *(.mb1text*)       /* .mb1text* sections (code)  */
        *(.mb1rodata)      /* read-only data (constants) */
        *(.mb1rodata*)
      } >MEMORY_B1
    
      /* Remove information from the standard libraries */
      /DISCARD/ :
      {
        libc.a ( * )
        libm.a ( * )
        libgcc.a ( * )
      }
      
      .ARM.attributes 0 : { *(.ARM.attributes) }
    }

    So my  configuration seems to be right so far.

  • Hello OJ, hello Sunil

    after a weekend of debugging I finally solved the problem. It was not caused by the setup of bootloader or application.

    While debugging I observed that the register r11 pointed inside the IRQ Stack region while I stuck inside the undefEntry. To prevent the controller from raising the undef exception I placed a dummy function to the location where the undef exception happened and set a break point there. After the next run I could see the complete call stack up to this place and locate the reason of the problem. It was an uninitialized array of callback functions which must be initialized by accident with the appropriate values (NULL) in the bootloader and the original application without bootloader.

    So, sorry for the trouble an thank you very much for your help.

    Kind Regards

    Jens

  • Hi Jens,

    Glad to hear. Please note that each of the exceptions except for an imprecise abort has a defined method of identifying the "guilty" instruction that caused the exception. The application must include handlers to address each of these (prefetch abort, data abort, undefined instruction) instead of an infinite loop that will eventually cause a watchdog reset, unless that is the actual response desired.

    Regards,
    Sunil