zhanglongtumi 发表于 2012-12-1 22:30:03

仿真,c语言变量不变

今天在做工作时,绘制好的PCB,焊上了芯片,进行程序调整。

我用的是ATmega128。本人,用ATmega的芯片,也有好久了。第一次遇到这样情况。
我做了大量实验,用的是jtag来调试的。

发现在,程序里设置的变量,不管我怎样让它自加变量、自减变量。变量总是一个固定的值。这个值,我是通过jtag读出来的。

用jtag烧写熔断丝,都很正常。代码调试,现象与平时没什么两样。

很纠结

穷折腾 发表于 2012-12-1 22:36:21

volatile?

zhanglongtumi 发表于 2012-12-2 00:00:59

穷折腾 发表于 2012-12-1 22:36 static/image/common/back.gif
volatile?

在avr的gcc里面,我从来没用过volatile呀。。。我在dsp里面,会常用

yunshuhualei 发表于 2012-12-2 08:58:21

是不是用中断了?

zhanglongtumi 发表于 2012-12-2 10:09:46

yunshuhualei 发表于 2012-12-2 08:58 static/image/common/back.gif
是不是用中断了?

恩,中断了。不中断怎么在调试的时候看变量呢

chencc8 发表于 2012-12-2 10:16:55

zhanglongtumi 发表于 2012-12-2 10:09 static/image/common/back.gif
恩,中断了。不中断怎么在调试的时候看变量呢

变量要被后面的应用使用,才会被真正的赋值,要不然很可能会被优化掉赋值的动作。
比如
uint8_t K;
……
K = 14;
……
//if(K != 14){} 没有这句,在某些编译器里K就不会被真正的赋值

另外调试的时候看变量不是用中断,而是用断点。
LS的意思是问你是不是在中断里给变量赋值了。
如果是在中断中给变量赋值,而在正常的函数中设置断点观察的话,
这个变量就要加volatile,不管你用的是DSP还是单片机……

zhanglongtumi 发表于 2012-12-2 14:26:22

chencc8 发表于 2012-12-2 10:16 static/image/common/back.gif
变量要被后面的应用使用,才会被真正的赋值,要不然很可能会被优化掉赋值的动作。
比如
uint8_t K;


void void delay_us(uint16_t us)
{
        unsigned int i;
        for (i = 0; i < us; i++)
        {
                _delay_loop_2(2);//avr提供的延时函数
        }       
}

我就是写的这个函数。
我用delay_us(1000)在主函数里调用。
然后我在这个函数的for循环里面设置中断。每次中断。us都是一个莫名的值。而且它一直都不变。


我不设置中断时,程序跳不出这个delay_us函数。

而我用_delay_loop_2(20000);程序就可以正常使用。

关于编译器优化的事。我已经改了一下设置 optimization level: None(-O0)

zhanglongtumi 发表于 2012-12-2 14:31:35

而且,我在开发板上,跑。就没这样问题。。。

会不会是单片机有问题呀

chencc8 发表于 2012-12-2 15:52:12

zhanglongtumi 发表于 2012-12-2 14:26 static/image/common/back.gif
void void delay_us(uint16_t us)
{
        unsigned int i;


你说的中断是神马……
是中断服务程序ISR么
或者是用鼠标双击C语句,出现在左边框框上的小红点。
后者的话就做断点,而不是中断。
前者的话,在中断服务程序中,应该是看不到us的,因为us是动态变量,并且可见范围只有delay_us这个函数之内。
如果想确定是不是延迟函数导致的问题,新建一个工程,使用delay_us()来操作一下LED之类的简单IO口。
不要在新工程里使用数组之类的玩意,如果没有问题,那就是别的的地方出现的错误
影响到了本来正常的函数
最好是看仿真界面中的反汇编,单步反汇编来仿真,对照C语句,这样能找到为什么进入了死循环
而参数为2000的时候为什么就不会

另外你在楼上的程序里写多了一个void,并且同样的双字节数据结构,声明的时候应该用同样的格式
不要一个声明为uint16_t另一个声明为 unsigned int,虽然在宏定义里是一样的玩意……

zhanglongtumi 发表于 2012-12-3 09:24:41

谢谢楼上,我按的方法找了。没找到问题出在哪里。。
不过,我重新又焊了一块板子。结果就没有这问题了。
之前,我在换过单片机。但是,还是老样子。所以我就重新焊了一块。

等有空了。再找问题了。
页: [1]
查看完整版本: 仿真,c语言变量不变