Der Debugger von Code Composer Studio 6.1.0 verhält sich nicht so, wie er sollte

Ich lerne, auf einem Mikrocontroller von Texas Instruments, MSP430FR6969 ( Link ), mit dem MSP-EXP430FR6969 Launch Pad ( Link ) zu programmieren.

Ich verwende auch eine IDE CCS 6.1.0 ( Link ).

Ich mache einen einfachen Kilometerzähler, bei dem das Programm von 0 bis 99.999 zählt und dann wieder zurücksetzt.

Code unten

#include <msp430.h> 

#define DEVELOPMENT 0x5A80
#define ENABLE_PINS 0xFFFE

int main(void)
{
    WDTCTL = DEVELOPMENT;//disable WDT
    PM5CTL0 = ENABLE_PINS;//this is needed in order to enable pins

    P1DIR = 0x01;//P1.1 is output
    P1OUT = 0x00;//port 1 = 0x00

    unsigned int tnth, thou, hund, tens, ones;

    unsigned long km = 0;

    while(1)
    {
        for(tnth = 0;tnth < 10;tnth++)
        {
            for(thou = 0;thou<10;thou++)
            {
                for(hund = 0;hund<10;hund++)
                {
                    for(tens = 0;tens<10;tens++)
                    {
                        for(ones = 0;ones<10;ones++)
                        {
                            km = 10000*tnth + 1000*thou + 100*hund +10*tens+ 
                            ones;
                        }

                    }
                }
            }
        }

        P1OUT = ~P1OUT;//I added a breakpoint there.
        km = 0;
    }


    return 0;
}

Ich habe einen Haltepunkt bei hinzugefügt P1OUT = ~P1OUT;, ihn erstellt und wie im Bild unten debuggt.

Geben Sie hier die Bildbeschreibung ein

Wenn der Debugger den Haltepunkt erreicht, sehe ich im Variablenüberwachungsfenster Einer, Zehner, Hunderter, Tausend und Tnth, die alle gleich 10 sind, was ich erwarte.

Aber ich habe auch erwartet km = 99999, stattdessen habe ich km = 34463, was keinen Sinn macht, wie kmes istunsigned long

Auch.

Wenn ich den Code ändere und unsigned int tnth, thou, hund, tens, oneszu ändere signed int, setze einen Haltepunkt beim P1OUT = ~P1OUTErstellen und debugge ich km = 4294936223im Variablenüberwachungsfenster.

Ich habe die Frage im TI-Forum ( Link ) gestellt, und ein Mitglied hat das in meinem Build gesagt

"../main.c", Zeile 16: Warnung #552-D: Variable "km" wurde gesetzt, aber nie verwendet

Bitte helfen Sie mir in dieser Angelegenheit und entschuldigen Sie den langen Beitrag.

Code Composer Studio 8.0 ist verfügbar.

Antworten (1)

Ihr MSP430 ist eine 16-Bit-Maschine, daher führt der Compiler dies (10000*tnth)als Multiplikation von 16-Bit-Zahlen aus und kürzt das Ergebnis auf 16 Bit, bevor er mit dem Rest der Berechnung fortfährt.

10000 * 9 = 90000 = 0x15F90  
truncate to 16-bits = 0x5F90 = 24464  
24464 + 9999 = 34463  

10000ULWenn Sie die 10000-Integer-Konstante mit so etwas wie und/oder die Variable mit in 32-Bit umwandeln (unsigned long)tnth, sollten Sie Ihre erwarteten Ergebnisse sehen.

Die Warnung für „Variable „km“ wurde gesetzt, aber nie verwendet“ wird erwartet.
Sie weisen Werten zu km, lesen sie aber nie zurück oder verwenden sie kmauf andere Weise, aber das hat nichts mit Ihrem unerwünschten Verhalten zu tun.

Wenn Sie Ihren 16-Bit-Datentyp von vorzeichenlos auf vorzeichenbehaftet geändert haben, passiert, dass der Wert 34463 (0x869F) als negativer 16-Bit-Wert von -31073 behandelt wird (da das MSB eine 1 ist).
Beim Konvertieren in einen 32-Bit-Wert wird er zunächst vorzeichenerweitert zu einem 32-Bit-Wert mit Vorzeichen – jetzt also 0xFFFF869F.
Da Sie dies jedoch in eine vorzeichenlose 32-Bit-Ganzzahlvariable einfügen, wird dieser Wert jetzt als 4294936223 dargestellt.

Besteht die Möglichkeit, dass der Code (vom Compiler) wegoptimiert wird, weil km nie verwendet wird?
Einige Compiler tun dies möglicherweise, aber das Ergebnis, das das OP erhält (34463), ist genau das, was Sie erhalten würden, wenn die erste Multiplikation auf 16 Bit gekürzt wird, sodass es so aussieht, als würde es nicht optimiert.
@ChrisKnudsen, Optimierung war ausgeschaltet
@brhans Wie kommt es dann, wenn ich unsigned int in int geändert habe, bekomme ich , sollte ich nicht auch km > 4000000bekommen34463
@brahans deine Antwort macht Sinn, wenn ich km = 34463 bekomme, aber wenn ich unsigned int tnthauf int tnth90.000 ändere, sind es immer noch 24465, was mir geben solltekm = 34463
@Forat - siehe Update.