打印

全局变量值 莫名其妙的变了

[复制链接]
4656|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eein|  楼主 | 2007-3-30 14:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
全局变量值 莫名其妙的变了没有对全局变量值 再赋值 却在函数调用的时候,发现其值已经改变.

这是为什么呢?

使用C18 3.06和MPLAB
我把全局定义在文件A.h 和A.c

这样在其他文件中使用include调用

入定义变量

A.h中

extern unsigned char B[60];

extern unsigned char C[6];

extern unsigned char D[10];

A.c中

#pragma udata Var

unsigned char B[60];

unsigned char C[6];

unsigned char D[10];

#pragma udata

问题就存在

但是在A.c中如下定义,问题就OK了.

#pragma udata Var1

unsigned char B[60];

#pragma udata

#pragma udata Var2

unsigned char C[6];

#pragma udata

#pragma udata Var3

unsigned char D[10];

#pragma udata

其中Var1~3为再lkr中配置的DATABANK

这是为什么呢?

相关帖子

沙发
high| | 2007-3-30 17:39 | 只看该作者

re

A.h中

extern unsigned char B[];

extern unsigned char C[];

extern unsigned char D[];

使用特权

评论回复
板凳
eein|  楼主 | 2007-4-2 10:04 | 只看该作者

还是不大理解,能详细点吗?

那假如是变量呢?
比如:double DD; 呢?
谢谢!

使用特权

评论回复
地板
平常人| | 2007-4-2 22:04 | 只看该作者

定义没问题,你的程序有问题,改定义不解决问题,危机四

这种事情肯定是程序中有越界访问的问题,还是好好查查程序吧。改了定义只是暂时回避了问题,没有根本解决,后患无穷!

使用特权

评论回复
5
eein|  楼主 | 2007-4-3 08:20 | 只看该作者

越界访问的问题

越界访问的问题怎么处理呢?
谢谢!

使用特权

评论回复
6
eein|  楼主 | 2007-4-3 15:33 | 只看该作者

UP

UP
没有人遇到过吗?

使用特权

评论回复
7
ayb_ice| | 2007-4-3 15:39 | 只看该作者

随便说说

  指针有没有乱指...

使用特权

评论回复
8
eein|  楼主 | 2007-4-5 10:27 | 只看该作者

没有人遇到过吗?

我定义的文件代码:
*.C

#pragma udata Var1 
<Defined Variable list1 less than 256B.> 
#pragma udata 
#pragma udata Var2 
<Defined Variable list2 less than 256B.> 
#pragma udata 

*.lkr文件为:

DATABANK   NAME=gpr0       START=0x60           END=0x7FF 
DATABANK   NAME=gpr1       START=0x800          END=0x8FF PROTECTED        
DATABANK   NAME=gpr2       START=0x900          END=0x9FF PROTECTED    
DATABANK   NAME=gpr3       START=0xA00          END=0xCFF PROTECTED 
  
SECTION    NAME=CONFIG     ROM=config 
SECTION    NAME=Var1   RAM=gpr1 
SECTION    NAME=Var2   RAM=gpr2 
STACK SIZE=0x300 RAM=gpr3

gpr0用于其他数据

使用特权

评论回复
9
ayb_ice| | 2007-4-5 10:41 | 只看该作者

随便说说

变量不能乱声明externr的,这点和函数声明不一样
建议如下:

A.h中
#ifdef _A_C

unsigned char B[60];
unsigned char C[6];
unsigned char D[10];

#else

extern unsigned char B[60];
extern unsigned char C[6];
extern unsigned char D[10];

#endif

然后在A.C中定义
#define _A_C

使用特权

评论回复
10
eein|  楼主 | 2007-4-5 15:24 | 只看该作者

UP

这样行吗?

使用特权

评论回复
11
ayb_ice| | 2007-4-5 15:28 | 只看该作者

随便说说

  你的例子在同一文件中又定义又声明...

使用特权

评论回复
12
eein|  楼主 | 2007-4-6 08:39 | 只看该作者

问题依然存在

问题依然存在
有时候 修改多了连续对 系统的全局变量 进行多次操作 还会引起系统复位!
可是我没有开狗啊!
帮帮我啊!
谢谢了!

使用特权

评论回复
13
ayb_ice| | 2007-4-6 08:46 | 只看该作者

不知你是什么MCU

不知你是什么MCU,编译器...
#pragma udata Var2什么意思...

使用特权

评论回复
14
eein|  楼主 | 2007-4-9 09:45 | 只看该作者

使用的是PIC18F4685

使用的是PIC18F4685

使用特权

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

本版积分规则

9

主题

19

帖子

0

粉丝