仿真,c语言变量不变
今天在做工作时,绘制好的PCB,焊上了芯片,进行程序调整。我用的是ATmega128。本人,用ATmega的芯片,也有好久了。第一次遇到这样情况。
我做了大量实验,用的是jtag来调试的。
发现在,程序里设置的变量,不管我怎样让它自加变量、自减变量。变量总是一个固定的值。这个值,我是通过jtag读出来的。
用jtag烧写熔断丝,都很正常。代码调试,现象与平时没什么两样。
很纠结 volatile? 穷折腾 发表于 2012-12-1 22:36 static/image/common/back.gif
volatile?
在avr的gcc里面,我从来没用过volatile呀。。。我在dsp里面,会常用 是不是用中断了? yunshuhualei 发表于 2012-12-2 08:58 static/image/common/back.gif
是不是用中断了?
恩,中断了。不中断怎么在调试的时候看变量呢 zhanglongtumi 发表于 2012-12-2 10:09 static/image/common/back.gif
恩,中断了。不中断怎么在调试的时候看变量呢
变量要被后面的应用使用,才会被真正的赋值,要不然很可能会被优化掉赋值的动作。
比如
uint8_t K;
……
K = 14;
……
//if(K != 14){} 没有这句,在某些编译器里K就不会被真正的赋值
另外调试的时候看变量不是用中断,而是用断点。
LS的意思是问你是不是在中断里给变量赋值了。
如果是在中断中给变量赋值,而在正常的函数中设置断点观察的话,
这个变量就要加volatile,不管你用的是DSP还是单片机…… 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: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,虽然在宏定义里是一样的玩意…… 谢谢楼上,我按的方法找了。没找到问题出在哪里。。
不过,我重新又焊了一块板子。结果就没有这问题了。
之前,我在换过单片机。但是,还是老样子。所以我就重新焊了一块。
等有空了。再找问题了。
页:
[1]