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
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_symbol
como 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.
Adán Haun
el fotón
el fotón
el fotón