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.

Application doesn't run correctly after vectoring from boot to application

Other Parts Discussed in Thread: TMS320F2812

Hello,

I'm running some boot and some app code from seperate sections of the flash on a TMS320F2812. The app works fine when run from the XDS100 without the boot. Both are written predominantly in C++.

When I then load and run the boot, this behaves as expected. It then uses the 'standard' ExitBoot routine (see below) to vector to the start of the application. This gets me to the start of the 'main' in the application.  However, when stepping through the code, it would appear some things are not running as they did when the application was run stand-alone. This results in strange behaviour. For instance, a singleton object being instantiated for the first time thinks it's already been instantiated, so doesn't run the constructor. We also end up hitting  the illegal instruction trap :-(       Am I missing a step?  Thanks for your help,   Jluian.

-----------------------------------------------
; _ExitBoot
;-----------------------------------------------
;-----------------------------------------------
;This module cleans up after the boot loader
;
; 1) Make sure the stack is deallocated.
; SP = 0x400 after exiting the boot
; loader
; 2) Push 0 onto the stack so RPC will be
; 0 after using LRETR to jump to the
; entry point
; 2) Load RPC with the entry point
; 3) Clear all XARn registers
; 4) Clear ACC, P and XT registers
; 5) LRETR - this will also clear the RPC
; register since 0 was on the stack
;-----------------------------------------------
    .sect ".text"

_ExitBoot:
 ; Load the entry point for the application.
 ; The application's linker command file dictates where it will be.

 MOV AH, #03dh
 MOV AL, #08000h 
;-----------------------------------------------
; Ensure that the stack is deallocated
;-----------------------------------------------
 MOV SP,#__stack
;-----------------------------------------------
; Clear the bottom of the stack. This will endup
; in RPC when we are finished
;-----------------------------------------------
 MOV *SP++,#0
 MOV *SP++,#0
;-----------------------------------------------
; Load RPC with the entry point as determined
; by the boot mode. This address will be returned
; in the ACC register.
;-----------------------------------------------
 PUSH ACC
 POP RPC
;-----------------------------------------------
; Put registers back in their reset state.
;
; Clear all the XARn, ACC, XT, and P and DP
; registers
;
; NOTE: Leave the device in C28x operating mode
; (OBJMODE = 1, AMODE = 0)
;-----------------------------------------------
 ZAPA
 MOVL XT,ACC
 MOVZ AR0,AL
 MOVZ AR1,AL
 MOVZ AR2,AL
 MOVZ AR3,AL
 MOVZ AR4,AL
 MOVZ AR5,AL
 MOVZ AR6,AL
 MOVZ AR7,AL
 MOVW DP, #0
;-----------------------------------------------
; Restore ST0 and ST1. Note OBJMODE is
; the only bit not restored to its reset state.
; OBJMODE is left set for C28x object operating
; mode.
;
; ST0 = 0x0000 ST1 = 0x0A0B
; 15:10 OVC = 0 15:13 ARP = 0
; 9: 7 PM = 0 12 XF = 0
; 6 V = 0 11 M0M1MAP = 1
; 5 N = 0 10 reserved
; 4 Z = 0 9 OBJMODE = 1
; 3 C = 0 8 AMODE = 0
; 2 TC = 0 7 IDLESTAT = 0
; 1 OVM = 0 6 EALLOW = 0
; 0 SXM = 0 5 LOOP = 0
; 4 SPA = 0
; 3 VMAP = 1
; 2 PAGE0 = 0
; 1 DBGM = 1
; 0 INTM = 1
;-----------------------------------------------
 MOV *SP++,#0
 MOV *SP++,#0x0A0B
 POP ST1
 POP ST0
;-----------------------------------------------
; Jump to the EntryAddr to run the application code.
;-----------------------------------------------
 LRETR

  • Hi Julian

    what is the entry point for your application when you load and run it using the emulator? is there some code (Run Time Initialization library calls) being run before you stop at main?

    make sure the EntryAddr after the ExitBoot is same as the entry point when you use the emulator. I have seen such problems if I don't branch to the proper entry point, but instead directly branch to main after ExitBoot.

     

    Best Regards
    Santosh

  • Hello Santosh,   Thanks for your reply.    You did have me wondering for a moment, but I checked the .map file of the application, and the point where I'm jumping to corresponds with output section 'boot' - rts2800_ml.lib : boot.obj.  I believe this is correct.

        Thanks again,  

        Julian.

  • Hi Julian

    can you attach your map file, so that I can take a quick look at it?

    Also can you give me the location where CPU is branching at the end of ExitBoot routine?

     

    Best Regards

    Santosh