2016-11-27 1 views
0

Mein Problem entsteht mit der Variablen total. Der Debugger läuft rüber wie es nicht einmal da ist, oder wenn Sie die * loswerden, läuft es und läuft und bietet eine seltsame Zahl. Die Idee des Programms besteht darin, dem total Dimes (oder 10) hinzuzufügen, bis es größer als das Ziel ist, das 10000 ist.C Änderung Variable wird über

Ich schreibe dies in C mit IAR Embedded Workbench und verwende ein MSP430G2553.

#include <msp430g2553.h> 
#include <stdio.h> 
volatile unsigned int i; 
int dime=0; 
int goalz =10000; 
int main(void) 
{ 
     // Stop watchdog timer to prevent time out reset 
     WDTCTL = WDTPW + WDTHOLD; 
     P1DIR |= 0x00; 
     for(;;){ 
     P1OUT =0x01; 
     while(1) 
     { 
      if((BIT4 & P1IN)) 
      { 
      P1OUT |= 0x01; 
      dime++; 
      int *total = 0; 
      *total = &dime; 
      } 
      else 
      { 
      P1OUT |= 0x00; 
      } 
     } 
    } 
} 
+1

Beachten Sie, dass 'P1OUT | = 0x00;' ein No-Op ist. Haben Sie daran gedacht, 'P1OUT & = ~ 0x01;' das niedrigstwertige Bit zurückzusetzen? Der Compiler sollte vor einem Typenkonflikt in der Zuweisung '* total = &dime; 'gewarnt haben - beachten Sie die Warnungen Ihres Compilers. Wenn es warnt, liegt es daran, dass Ihr Code so falsch ist, dass er denkt, dass er ihn nicht einfach kompilieren kann, ohne Sie wissen zu lassen, dass Sie wahrscheinlich einen Fehler gemacht haben. –

Antwort

3
int *total = 0; 
*total = &dime; 

die falsch ist, weil Sie die Adresse dime (nicht seinen Wert) in der Lage von total darauf zu speichern, sind versucht, das heißt Null => nicht, was Sie wollen (jemand schlägt vor, Dies ist der Ort eines Registers, also selbst wenn es nicht abstürzt, ist es nicht gültig.Das Schreiben des INTENA-Registers ist nicht gut!).

Der Debugger optimiert diese Anweisung wahrscheinlich, indem er direkt in Null schreibt.

nicht ganz sicher, was Sie erreichen möchten, aber Sie müssen total als globale Variable deklarieren und dime hinzufügen. Keine Notwendigkeit, Zeiger oder variable Adressen hier zu verwenden.

+0

Auf dem MSP430x2xx enthält Adresse 0 das Interrupt-Enable-Register. –

1

Wahrscheinlich ist der Debugger Schritte, da der Compiler nicht einmal den Code generiert. Sie erstellen die Variable total (Zeiger oder Ganzzahl) im Stapel (d. H., Sie fügen ein Element hinzu), weisen einen Wert zu und sind dann außerhalb des Bereichs, sodass die Variable nicht mehr vorhanden ist.

Ich denke, dass zu erreichen, was Sie versuchen, ist:

if (...) { 
    static int total = 0; 
    total = dime 
} 

aber dann wieder, die Variable insgesamt ist völlig nutzlos, da es immer der gleiche Wert wie Dime sein wird. Wie sollte total und dime anders sein?