打印

MPLAB的WATCH窗口观察变量问题

[复制链接]
7342|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liumda|  楼主 | 2011-4-18 14:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我定义了一个全局变量,然后将这个变量拉到WATCH窗口当中,不知道为何总是显示Not Found,如下图所示。
沙发
liumda|  楼主 | 2011-4-18 14:58 | 只看该作者
在main程序中给T_EEP赋值,WATCH窗口没有变化。注:程序编译没有问题。

使用特权

评论回复
板凳
yewuyi| | 2011-4-18 15:41 | 只看该作者
1、把变量定义代码和调用代码贴出来。
2、把编译信息内容贴出来。

使用特权

评论回复
地板
liumda|  楼主 | 2011-4-18 17:01 | 只看该作者
代码如下,很简单。编译出现warning
Warning [1090] G:\TOOLS\PIC\Test\Test.c; 8. variable "_T_EEP" is not used

#include"htc.h"
#define uchar unsigned char
uchar T_EEP;
void main(void)
{
        OSCCON = 0x7B;                                //16MHz
        T_EEP = 0x22;
        while(1);
}

使用特权

评论回复
5
yewuyi| | 2011-4-18 17:12 | 只看该作者
那个Warning已经清楚的说明了问题。

你定义的这个变量因为根本没用着它或者虽然有赋值,但属于无意义的操作,已经被编译器自动优化掉了,所以在WATCH窗口肯定就是看不到它的。

使用特权

评论回复
6
liumda|  楼主 | 2011-4-19 08:21 | 只看该作者
我已经对这个变量进行赋值了(T_EEP = 0x22;),怎么会认为没有操作呢?
另外,我将AD转换的结果赋值给这个变量,还是显示“NOT FOUND”

注,我用的是MPLAB 8.66和PICC

使用特权

评论回复
7
yewuyi| | 2011-4-19 09:11 | 只看该作者
编译器会对它认为的无效操作做出优化处理。

而你的T_EEP = 0x22;被编译器当成了无效代码优化掉了,从实际效果看,把它优化掉才确实符合一个高效编译器的特性,如果连这样的一条‘吃饱了撑的慌’的代码都优化不掉了,这样的C编译器估计也没实际商业价值。

请牢牢记住:在C代码编译后,定义了一个变量不代表这个变量一定会被开辟出一个RAM空间,使用了这个变量,也不代表这个变量一定能开辟成功,对于C编译器,会对变量进行扫描,只对那些它认为有用的变量进行空间开辟和定位。

使用特权

评论回复
8
liumda|  楼主 | 2011-4-19 11:16 | 只看该作者
我写了一个读片内EEPROM的操作(T_EEP =  EEPROM_READ(0xF000);),并且赋值给了T_EEP ,你认为这样编译器会开辟空间给T_EEP 变量吗?但还是显示“NOT FOUND”,这是为何?

使用特权

评论回复
9
yewuyi| | 2011-4-19 11:29 | 只看该作者
void main(void)
{
        OSCCON = 0x7B;                                //16MHz
        T_EEP = 250;
        while(T_EEP++){
                                 T_EEP=250;
                                 asm("clrwdt");
                                 }
}

你按照以上编译看看 。

使用特权

评论回复
10
yewuyi| | 2011-4-19 11:29 | 只看该作者
本帖最后由 yewuyi 于 2011-4-19 11:30 编辑

void main(void)
{
OSCCON = 0x7B;                                //16MHz        T_EEP = 250;                           while(T_EEP++){                              
                         T_EEP=250;
                         asm("clrwdt");                                 
                         }
}
你按照以上编译看看 。

使用特权

评论回复
11
liumda|  楼主 | 2011-4-19 11:39 | 只看该作者
本帖最后由 liumda 于 2011-4-19 11:43 编辑
void main(void)
{
        OSCCON = 0x7B;                                //16MHz
        T_EEP = 250;
        while(T_EEP++){
                                 T_EEP=250;
                                ...
yewuyi 发表于 2011-4-19 11:29

谢谢yewuyi的热心,这个没有显示“NOT FOUND”

使用特权

评论回复
12
liumda|  楼主 | 2011-4-19 11:39 | 只看该作者
本帖最后由 liumda 于 2011-4-19 11:42 编辑
void main(void)
{
OSCCON = 0x7B;                                //16MHz        T_EEP = 250;                           while(T_EEP++){                              
                         T_EEP=250;
...
yewuyi 发表于 2011-4-19 11:29

这个还是显示“NOT FOUND”
(后面“//16MHz  T_EEP = 250; while(T_EEP++){   ”都是注释掉的是吧?多了一个括号)

使用特权

评论回复
13
yewuyi| | 2011-4-19 11:58 | 只看该作者
因为BBS系统和我的IE有点问题,10楼的帖子被重复了,而且格式也错了。

请使用9楼代码测试

使用特权

评论回复
14
liumda|  楼主 | 2011-4-19 12:25 | 只看该作者
yewuyi:你好!
9楼代码编译完以后,T_EEP不再显示“NOT FOUND”,而显示为0x00。

使用特权

评论回复
15
yewuyi| | 2011-4-19 13:38 | 只看该作者
那不就对了吗?

你不就是想要这个吗?

使用特权

评论回复
16
yewuyi| | 2011-4-19 13:38 | 只看该作者
那不就对了吗?你不就是想要这个吗?

使用特权

评论回复
17
liumda|  楼主 | 2011-4-19 14:55 | 只看该作者
我的疑问是为何如下代码不能观察“T_EEP”变量?会显示“NOT FOUND”?你说我的变量“T_EEP”没有使用,优化掉了,但我将片内读取的EEPROM的数据赋值给它,总不该再次被优化掉了吧?为何还是显示“NOT FOUND”?
void main(void)
{
        OSCCON = 0x7B;                //16MHz
        T_EEP = 0x22;
        T_EEP =  EEPROM_READ(0xF000);
        while(1);
}

使用特权

评论回复
18
yewuyi| | 2011-4-19 15:12 | 只看该作者
为什么不能优化掉?

你从EEPROM读出的数值送给T_EEP,但T_EEP根本没什么用处,自然就会被优化掉。

你纠结这个问题是没有意义的,你如果需要弄清楚,你就应该去好好看看编译优化等方面的书籍,并把PICC的帮助手册完全看明白。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

117

帖子

3

粉丝