Wie kann ich dem CCS-Debugger sagen, wo er anfangen soll?

Ich fange gerade mit MSP430 und Code Composer Studio (CCS) an.

Ich möchte ein reines Montageprojekt machen. Im Moment habe ich ein "Hallo Welt" -Programm, das nichts anderes tut, als eine LED auf dem MSP430F5529 Launchpad zum Leuchten zu bringen.

Wenn ich dieses Programm jedoch im Debugger ausführe, beginnt die Ausführung bei der Adresse 0x0000 und nicht an meinem festgelegten Einstiegspunkt namens RESET (0x10000). Ich kann sehen, dass PC anfänglich auf 0x0000 eingestellt ist. Wenn ich es im Watch-Fenster manuell auf RESET stelle, läuft das Programm wie erwartet.

Ich habe RESET als global deklariert und die Linker-Option gesetzt, um RESET zum Einstiegspunkt zu machen.

Ich vermute, ich habe ein Problem mit den Debugger-Einstellungen oder dem (Boot-)Loader, aber ich könnte völlig auf der falschen Spur sein.

            .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
Wenn Sie sagen, dass die Ausführung bei 0x0000 beginnt, ist das nach dem Laden des Programms oder nach dem Zurücksetzen oder nachdem Sie auf die Schaltfläche Ausführen geklickt haben?
@AdamHaun, wenn ich die "Bug" -Taste drücke, dann die "Play" -Taste, beginnt es bei 0x0000 zu laufen.
Auch wenn ich die "Bug"-Taste drücke, dann "Programm neu laden", dann "Fortsetzen" (die Wiedergabetaste).
Wenn ich den Bug-Button drücke, dann PC auf RESET stelle, dann Play drücke, läuft das Programm.

Antworten (1)

Ich habe keinen MSP430 in Assembly programmiert, aber es scheint, als ob der Programmeintrittspunkt nicht auf die Adresse 0xFFFE geschrieben wird:

Der Programmzähler (PC) wird mit der Boot-Code-Adresse geladen und die Boot-Code-Ausführung beginnt an dieser Adresse. Weitere Informationen zum Boot-Code finden Sie in Abschnitt 1.9. Nach Abschluss des Boot-Codes wird der PC mit der Adresse geladen, die an der SYSRSTIV-Rücksetzstelle (0FFFEh) enthalten ist.

Aus Ihrer Beschreibung verwenden Sie also --entry_point= global_symboleine Option, um den Einstiegspunkt festzulegen. Ich kann nicht wirklich verstehen, warum das nicht funktionieren würde. Haben Sie den tatsächlichen Linker-Aufruf überprüft, wenn diese Option angewendet wird?

Eine andere Möglichkeit wäre also, den Wert Ihrer Startadresse an die Adresse 0xFFFE zu schreiben. Oder überprüfen Sie zumindest in Ihrem resultierenden Hex-Bild, welcher Wert dort geschrieben wird.

Ich habe gerade das gefunden :

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
}

als Standardplatzierung. Vielleicht, weil Sie Ihr Label auch RESET genannt haben, wird der Linker in irgendeiner Weise verwirrt? Benennen Sie Ihren Einstiegspunkt möglicherweise anders, z. B. START oder EINTRITT. Aber das gibt auch einen Hinweis, wie man die eigentliche Adresse bekommt, wo man sie haben möchte. Sie müssen nur eine 16-Bit-Konstante definieren, die in den .reset-Abschnitt eingefügt wird.

Es ist seltsam, wie unterschiedlich der TI-Assembler von dem IAR ist, mit dem ich etwas vertrauter bin.

Ich werde das am Montag ausprobieren.
Arsch treten bei den msp430-Fragen @Arsenal
@Passerby danke - denke ich: D Ich habe ein bisschen mit dem MSP430 gearbeitet und in meinem letzten Projekt ziemlich viel mit einigen Linker- und Platzierungskämpfen (auf einem anderen Controller, aber meh, kann hier nicht so unterschiedlich sein. .)