C正在跳过正在更改的变量

C正在跳过正在更改的变量,c,msp430,C,Msp430,我的问题出现在变量total上。调试器会一步一步地运行,就像它不在那里一样,或者如果你去掉了*,它会一个接一个地运行,并提供一个奇怪的数字。该计划的想法是在总数中增加10美分(或10美分),直到它大于目标值10000 我使用IAR Embedded Workbench和MSP430G2553用C编写这篇文章 #include <msp430g2553.h> #include <stdio.h> volatile unsigned int i; int dime=0; in

我的问题出现在变量
total
上。调试器会一步一步地运行,就像它不在那里一样,或者如果你去掉了
*
,它会一个接一个地运行,并提供一个奇怪的数字。该计划的想法是在
总数中增加10美分(或10美分),直到它大于目标值
10000

我使用IAR Embedded Workbench和MSP430G2553用C编写这篇文章

#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;
          }
        }
    }
}
#包括
#包括
易失性无符号整数i;
int-dime=0;
int目标z=10000;
内部主(空)
{
//停止看门狗定时器,防止超时复位
WDTCTL=WDTPW+WDTHOLD;
P1DIR |=0x00;
对于(;;){
P1OUT=0x01;
而(1)
{
如果((位4和P1IN))
{
P1OUT |=0x01;
dime++;
int*total=0;
*总计=&dime;
}
其他的
{
P1OUT |=0x00;
}
}
}
}
这是错误的,因为您正试图将
dime
(不是它的值)的地址存储在
total
所指的位置,即零=>不是您想要的(有人建议这是寄存器的位置,因此即使它没有崩溃,它也是无效的。写入INTENA寄存器并不好!)

调试器可能会优化此语句,直接在零中写入

不完全确定您想要实现什么,但您必须将
total
声明为全局变量,并将
dime
添加到其中。这里不需要使用指针或变量地址

这是错误的,因为您正试图将
dime
(不是它的值)的地址存储在
total
所指的位置,即零=>不是您想要的(有人建议这是寄存器的位置,因此即使它没有崩溃,它也是无效的。写入INTENA寄存器并不好!)

调试器可能会优化此语句,直接在零中写入


不完全确定您想要实现什么,但您必须将
total
声明为全局变量,并将
dime
添加到其中。这里不需要使用指针或变量地址。

可能是因为编译器甚至没有生成代码,所以调试器已经完成了一步。在堆栈中创建变量total(指针或整数)(即,添加一个项),分配一个值,然后超出范围,因此变量不再存在

我认为你想要实现的是:

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

但是,同样地,变量total是完全无用的,因为它总是与dime相同的值。
total
dime
应该有什么不同呢?

可能是因为编译器甚至没有生成代码,所以调试器已经完成了一步。在堆栈中创建变量total(指针或整数)(即,添加一个项),分配一个值,然后超出范围,因此变量不再存在

我认为你想要实现的是:

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

但是,同样地,变量total是完全无用的,因为它总是与dime相同的值。
total
dime
应该有什么不同?

注意
P1OUT |=0x00是禁止操作的。您是否想到了
P1OUT&=~0x01重置最低有效位?编译器应该警告赋值中的类型不匹配
*total=&dime-注意编译器的警告。如果它发出警告,那是因为您的代码错误太大,它认为它无法在编译代码时不让您知道您可能犯了错误是禁止操作的。您是否想到了
P1OUT&=~0x01重置最低有效位?编译器应该警告赋值中的类型不匹配
*total=&dime-注意编译器的警告。如果它发出警告,那是因为您的代码错误太大,它认为它无法编译代码而不让您知道您可能犯了错误。在MSP430x2xx上,地址0包含中断启用寄存器。在MSP430x2xx上,地址0包含中断启用寄存器。