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包含中断启用寄存器。