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.
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 km
es istunsigned long
Auch.
Wenn ich den Code ändere und unsigned int tnth, thou, hund, tens, ones
zu ändere signed int
, setze einen Haltepunkt beim P1OUT = ~P1OUT
Erstellen und debugge ich km = 4294936223
im 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.
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
10000UL
Wenn 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 km
auf 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.
km > 4000000
bekommen34463
unsigned int tnth
auf int tnth
90.000 ändere, sind es immer noch 24465, was mir geben solltekm = 34463
Tyler