10952|20

66

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

想请问在keil环境下,将指针变量定义到片外RAM,进行写操作时,出现比较诡异的错误。恳请宝贵意见! [复制链接]

想请问在keil里,将指针变量定义到片外RAM,进行写操作时,出现比较诡异的错误。
比如从0x0000-0x4000是片外RAM空间。
int *i;
i=0x2300;
*i=0x1200;

片上调试运行时,结果为:
0x2300单元内容:0x1200;
0x1200单元内容:0x1200;---将0x1200单元内容也变成了0x1200

如果改成*i=0x1500;
结果为:
0x2300单元内容:0x1500;
0x1500单元内容:0x1500;;---将0x1500单元内容也变成了0x1500

想请问哪位遇到过这种情况?恳请宝贵建议!

最新回复

反汇编;   详情 回复 发表于 2008-6-2 08:42
点赞 关注

回复
举报

54

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
想请问在keil里,将指针变量定义到片外RAM,进行写操作时,出现比较奇怪的错误。
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
没碰到过这种情况。看看反汇编是否有对该单元的操作。
最好下载到芯片内跑一下看看。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

4
 
是啊,.c文件编译成汇编运行时,把不该改的单元内容也改了。郁闷中,一个星期了,找不到答案。
我用了是英飞凌的16位单片机,有哪位用过?上来冒个泡,讨论讨论。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
试试嵌入汇编,看结果如何
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

6
 
快乐虾您好,不太明白如何做,我的QQ:447137440,期待讨论,多谢。
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

7
 
你可以试试
asm("...");
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

8
 
这个不需要嵌入汇编那么夸张。
还是得先找到为什么会改数据。
看汇编。或者把反汇编相关的语句贴出来,帮你看。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(中级)

9
 
简单说,就是程序在反汇编语句执行时,把该改的地方改了,这是对的.但是同时把不该改的地方也改了,结果导致程序运行出错.

现在程序中有两处这样的错误,按照运行顺序先后:
第1处错误   MOV [-R0],R4

用的英飞凌的16位单片机,GPR有16个,从R0-R15

前提:R4=0x0003,        R0=0x81E6,
   
[-R0]所代表的地址单元是0x01E4-0x01E5,占两个字节空间,这个单元地址确保是正确的,这是英飞凌片子的寻址方式,它有24根地址线,但CPU是16位,有点类似8088,对地址作了分段处理,它不同的是有分段和分页两种寻址方式。

这条语句运行后,结果是:0x01E4和0x01E5单元变成了0x0003。但是我的0x01E6和0x01E7单元却由原来的0x0D1C变成了0x001C,后面这个结果不应该被改变

说明:这几个单元都在片外RAM空间,我的片外RAM从0-0x7fff

下面是第2处错误,也就是我上面帖子说的外部RAM的指针变量赋值
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

10
 
第2处错误:

SHL        R4,#0x02                ;这里把R4左移两位,移完成R4=0x00FC
EXTP        #0x0000,#2                ;这是一条分页跳转语句,是要求下面两句中的寻址到#0x0000页去寻址
MOV        [R4+#0x080C],R14        ;[R4+#0x080C]代表的单元地址号为:0x0908-0x0909(两个字节),R14=0x090C,运行结果:将立即数0x090C赋给0x0908-0x0909单元
MOV        [R4+#0x080E],R15        ;[R4+#0x080E] 代表的单元地址号为:0x090A-0x090B,R15=0x0000,运行结果:将立即数0x0000赋给0x090A-0x090B单元
但是程序单步运行时,把我的0x090C-0x090D单元内容也改成了0x090C

困惑中,恳请大家帮助
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

11
 
换成其它地址出不出错?比如RAM的起始或者结束的位置?
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

12
 
这个是用Debug调试时发现的?还是下载到芯片内跑的时候发现的?
建议用硬件直接跑一下看看结果。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

13
 
to快乐虾:
嗯,换成其它地址也出错,比如,在第二个错误的地方:
将R14=0x090C改成R14=0x0910,语句运行后,除了将0x0908写成0x0910外,会将0x0910单元的内容也写成0x0910

to蜗牛:
这两个错误都是在debug的片上调试时发现的,已经下载到片内.如果全速运行,也是这个结果,由于改了不该改的单元内容,后面程序会跑飞.

感觉应该是外部RAM的写操作问题,但是不知到底是哪里出错了.

另外,还发现一个可疑的地方,板上扩了外部RAM,是CMOS SRAM.每次程序复位后,外部RAM的值不是上次程序运行后的值.

全部是5BFF
运行到start文件的某一行后,就一下子同时恢复为上次程序运行后的结果了.这种现象也比较七巧.




 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

14
 
写个SRAM的测试程序,把整个空间范围都测试一遍,确认没有硬件的问题。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

15
 
读写内存固定地址的写法好像是:
#define addr (*((volatile unsigned char*)0x1234))

读:data = addr;
写:addr = data + 100;

    你试试内部RAM的操作是不是也会出同样问题?对于CPU来说,内部和外部的没什么差别。既然在硬件上跑会出问题,那可以排除keil Debug时出问题。而2片都有同样的问题,那就可以排除个别芯片损坏的可能;而对固定地址的操作是很成熟的,所以可以排除keil的编译错误。那么只能剩下程序本身的设计问题了。还是得查程序了看来。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

16
 
非常感谢大家的帮助!

to快乐虾:
做了一个外部SRAM的测试程序,对所有外部RAM单元遍历:0x0-0x8000
int *i,j;
i=0x2300;
for(j=0;j<0x8000;j=j+2)
{
*i=j;
}
测试结果:把所有外部RAM单元内容全部变成了单元地址号.比如:0x1050单元内容为:0x1050

to蜗牛快跑:
如果不用外部RAM,程序在内部RAM中跑是正常的.
可惜片子内部RAM太小,加一点点代码都会溢出.
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

17
 
to快乐虾:
也用读写内存固定地址的写法测试过外部RAM单元的读写,结果是:
如果单个测试一个单元,结果正常.
如果用for循环去遍历,结果也会把单元内容写成地址号.

 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

18
 
to蜗牛快跑:

也用读写内存固定地址的写法测试过外部RAM单元的读写,结果是:
如果单个测试一个单元,结果正常.
如果用for循环去遍历,结果也会把单元内容写成地址号.

呵,我的机子修改帖子的功能是灰色的,不能用,改不了,再发一个.
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

19
 
你把你单独测一个单元和for循环,以及编译后,单独测一个单元和for循环这段对应的汇编代码贴出来看一下。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

20
 
我遇到了同样的问题,烧一块芯片试试就行了,仿真好像不对
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表