搜索
bottom↓
回复: 9

仿真,c语言变量不变

[复制链接]

出0入0汤圆

发表于 2012-12-1 22:30:03 | 显示全部楼层 |阅读模式
今天在做工作时,绘制好的PCB,焊上了芯片,进行程序调整。

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

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

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

很纠结

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-12-1 22:36:21 | 显示全部楼层
volatile?

出0入0汤圆

 楼主| 发表于 2012-12-2 00:00:59 | 显示全部楼层
穷折腾 发表于 2012-12-1 22:36
volatile?

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

出0入0汤圆

发表于 2012-12-2 08:58:21 | 显示全部楼层
是不是用中断了?

出0入0汤圆

 楼主| 发表于 2012-12-2 10:09:46 | 显示全部楼层
yunshuhualei 发表于 2012-12-2 08:58
是不是用中断了?

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

出0入0汤圆

发表于 2012-12-2 10:16:55 | 显示全部楼层
zhanglongtumi 发表于 2012-12-2 10:09
恩,中断了。不中断怎么在调试的时候看变量呢

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

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

出0入0汤圆

 楼主| 发表于 2012-12-2 14:26:22 | 显示全部楼层
chencc8 发表于 2012-12-2 10:16
变量要被后面的应用使用,才会被真正的赋值,要不然很可能会被优化掉赋值的动作。
比如
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)

出0入0汤圆

 楼主| 发表于 2012-12-2 14:31:35 | 显示全部楼层
而且,我在开发板上,跑。就没这样问题。。。

会不会是单片机有问题呀

出0入0汤圆

发表于 2012-12-2 15:52:12 | 显示全部楼层
zhanglongtumi 发表于 2012-12-2 14:26
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,虽然在宏定义里是一样的玩意……

出0入0汤圆

 楼主| 发表于 2012-12-3 09:24:41 | 显示全部楼层
谢谢楼上,我按的方法找了。没找到问题出在哪里。。
不过,我重新又焊了一块板子。结果就没有这问题了。
之前,我在换过单片机。但是,还是老样子。所以我就重新焊了一块。

等有空了。再找问题了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 05:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表