¿Cómo decirle al depurador CCS por dónde empezar?

Estoy empezando con MSP430 y Code Composer Studio (CCS).

Quiero hacer un proyecto de montaje puro. Por el momento, tengo un programa "hola mundo" que no hace más que encender un LED en el MSP430F5529 Launchpad.

Sin embargo, cuando ejecuto este programa en el depurador, la ejecución comienza en la dirección 0x0000 en lugar de en mi punto de entrada designado, llamado RESET (0x10000). Puedo ver que la PC está configurada inicialmente en 0x0000. Si lo configuro manualmente en la ventana de observación para REINICIAR, el programa se ejecuta como se esperaba.

Declaré que RESET es global y configuré la opción del enlazador para que RESET sea el punto de entrada.

Supongo que tengo un problema con la configuración del depurador o con el cargador (de arranque), pero podría estar totalmente equivocado.

            .cdecls C,LIST,"msp430.h"       ; Include device header file
    ;-------------------------------------------------------------------------------
            .text                           ; Assemble into program memory
            .retain                         ; Override ELF conditional linking
                                            ; and retain current section
            .retainrefs                     ; Additionally retain any sections
                                            ; that have references to current
                                            ; section
;-------------------------------------------------------------------------------
            .global RESET
RESET       mov.w   #__STACK_END,SP         ; Initialize stackpointer
StopWDT     mov.w   #WDTPW|WDTHOLD,&WDTCTL  ; Stop watchdog timer

;-------------------------------------------------------------------------------
                                            ; Main loop here
            bis.b #01h, &P1DIR
            bis.b #01h, &P1OUT
;-------------------------------------------------------------------------------
;           Stack Pointer definition
;-------------------------------------------------------------------------------
            .global __STACK_END
            .sect   .stack

;-------------------------------------------------------------------------------
;           Interrupt Vectors
;-------------------------------------------------------------------------------
            .sect   ".reset"                ; MSP430 RESET Vector
            .short  RESET
Cuando dice que la ejecución comienza en 0x0000, ¿es eso después de cargar el programa, o después de reiniciar, o después de hacer clic en el botón Ejecutar?
@AdamHaun, si presiono el botón "error", luego el botón "reproducir", comenzará a ejecutarse en 0x0000.
Además, si presiono el botón "error", luego "Recargar programa", luego "Reanudar" (el botón de reproducción).
Si presiono el botón de error, luego configuro la PC para REINICIAR, luego presiono reproducir, el programa se ejecuta.

Respuestas (1)

No he programado un MSP430 en ensamblaje, pero parece que el punto de entrada del programa no está escrito en la dirección 0xFFFE:

El contador de programa (PC) se carga con la dirección del código de inicio y la ejecución del código de inicio comienza en esa dirección. Consulte la Sección 1.9 para obtener más información sobre el código de arranque. Una vez completado el código de arranque, la PC se carga con la dirección contenida en la ubicación de reinicio de SYSRSTIV (0FFFEh).

Entonces, según su descripción, está utilizando --entry_point= global_symbolcomo una opción para establecer el punto de entrada. Realmente no puedo ver por qué eso no funcionaría, ¿ha verificado la llamada real del enlazador si se aplica esa opción?

Entonces, otra opción sería escribir en la dirección 0xFFFE el valor de su dirección de inicio. O al menos verifique en su imagen hexadecimal resultante qué valor se escribe allí.

Acabo de encontrar esto :

MEMORY
{
    MEM : origin = 0x0200, length = 0xFDFD
    RESET : origin = 0xFFFE, length = 0x0002
}
SECTIONS
{
    .text : {} > MEM
    .const : {} > MEM
    .data : {} > MEM
    .bss : {} > MEM
    .reset : > RESET
    .cinit : {} > MEM ;cflag option only
    .pinit : {} > MEM ;cflag option only
}

como ubicación predeterminada. Entonces, ¿tal vez porque también nombró su etiqueta RESET, el enlazador se confunde de alguna manera? Tal vez nombre su punto de entrada de manera diferente como INICIO o ENTRADA. Pero esto también da una pista sobre cómo obtener la dirección real donde la desea. Solo tiene que definir una constante de 16 bits para colocarla en la sección .reset.

Es extraño lo diferente que es el ensamblador TI del IAR, con el que estoy un poco más familiarizado.

Lo probaré el lunes.
Patear traseros en las preguntas de msp430 @Arsenal
@Passerby, gracias. Supongo: D He trabajado un poco con el MSP430 y en mi último proyecto bastante con algunos problemas con el enlazador y la ubicación (en un controlador diferente, pero meh, no puede ser tan diferente aquí... .)