Board logo

标题: 关于分页重叠问题 [打印本页]

作者: ky3453079    时间: 2007-4-27 13:33     标题: 关于分页重叠问题

芯片采用MC129S512A。
对外部的RAM进行扩展,外部RAM分页地址从0x8000-0xBFFF到0x1F8000-0x1FBFFF,内部ROM从0x208000-0x20BFFF到0x3D8000-0x3DBFFF,对外部RAM的任意页读写都可以,但是惟独0x8000-0xBFFF这页进行写的时候,写完数据但是退出分页程序数据又被0x208000-0x20BFFF页的数据所覆盖。不知道是怎么回事?
初始化程序如下:
MODE = 0xE3;
PEAR = 0x0C;
EBICTL= 0x01;
MISC = 0x07;
PTT_PTT2 = 0; //使能SRAM
作者: strongchen    时间: 2007-4-27 14:43

对0x8000-0xBFFF这页写的时候,PPAGE寄存器的值为多少?你可以做一个简单的project贴出来看看。
作者: ky3453079    时间: 2007-4-27 15:38

http://bbs.chinaecnet.com/uploadImages/SRAM_test.rar
作者: ky3453079    时间: 2007-4-27 15:41

是在memory窗口下看到变化后,又会被覆盖,如果赋给另外一个参数又是正确的值。
还有个问题想问一下,我把全局的变量定义在一个头文件里,里面有定义到外部RAM也有定义到内部RAM,那我在其他文件里面调用这个头文件里面的参数的时候,要不要再对这些参数进行段定义?
作者: strongchen    时间: 2007-4-27 15:55

看到了你的project。能不能描述一下你的具体调试过程。程序在哪里写0x8000-0xBFFF这页,在哪里退出,在哪里又发现数据被覆盖?
作者: ky3453079    时间: 2007-4-27 16:06

goption = 0x12345678;这句执行的时候就开始向0x8001写4个字节数据,跳到分页执行程序那边,在页的切换过程中看到数据写进去了,可是退出分页程序的时候,memory窗口下的0x8001这页的上的数据变成跟0x208000那页的数据一样了
作者: strongchen    时间: 2007-4-27 16:25

首先,你可以参考下图的提示,设置编译器中PPAGE的设置:
[upload=image/pjpeg]uploadImages/PPAGE_Setting.jpg[/upload]
作者: strongchen    时间: 2007-4-27 16:28

其次,关于扩展地址及其指针的使用,可以参考这两个帖子:

http://bbs.eccn.com/dispbbs.asp?boardID=3&RootID=104072&ID=104072

http://bbs.eccn.com/dispbbs.asp?boardID=3&RootID=104163&ID=104163

[此贴子已经被strongchen于2007-4-27 16:28:56编辑过]


作者: ky3453079    时间: 2007-4-27 16:32

那个地方设成RUNTIME不行么?
作者: strongchen    时间: 2007-4-27 16:36

就是要设成RUMTIME!不过你的问题还是在于对16位地址与分页地址的使用上。请参考我提供的那2个帖子。
作者: ky3453079    时间: 2007-4-27 16:54

那两个帖子我看过了,对于不是0x008000-0x00BFFF这页的情况,都是可以的
就是对这页进行写数据的时候,数据是有写到外部去了,可是在memory窗口下看这页的内容却是0x208000那页的数据内容了

[此贴子已经被作者于2007-4-27 16:54:31编辑过]


作者: strongchen    时间: 2007-4-28 09:53

你把这一句
ulong goption@0x8001;
改成
ulong goption;
试试。
作者: ky3453079    时间: 2007-4-28 10:42

图片传不上去
改完还是一样
作者: strongchen    时间: 2007-4-28 10:46

不会吧,我试过的,应该不一样了。
作者: ky3453079    时间: 2007-4-28 10:48

图片上传不上去,你把邮箱给我,我把调试时抓的3张图发给你看下,
作者: strongchen    时间: 2007-4-28 10:59

如果你不改这一句的话,执行goption = 0x12345678;指令时,其实它是试图往0x208001里写的;改过之后,它就往0x008001里写了。但是,你的问题还在,就是p = &goption这一句:p只是一个16位的地址。在这里执行*p = 0x11;时,PPAGE的值为当前的0x20,而不会自动改成0x00。结果是往ROM里写数据,当然不对。
作者: strongchen    时间: 2007-4-28 11:00

我的邮箱:
strongchen_free@yahoo.com.cn
作者: ky3453079    时间: 2007-4-28 11:04

p = &goption这句只是测试用的,是跟后面的那个长调用指针做个对比的,
真正的赋值语句在goption = 0x12345678,当执行这句的时候,就开始向0x8000写数据
作者: ky3453079    时间: 2007-4-28 11:08

[upload=image/pjpeg]uploadImages/DEBUG_1.jpg[/upload][upload=image/pjpeg]uploadImages/DEBUG_2.jpg[/upload][upload=image/pjpeg]uploadImages/DEBUG_3.jpg[/upload]
作者: strongchen    时间: 2007-4-28 11:30

对呀,现在这没错。问题是你读RAM的值时,也应该看到类似的操作,PPAGE的值变为0x00才行。此时Memory窗口的值要与PPAGE联系起来看。
作者: ky3453079    时间: 2007-4-28 11:55

哦,那我这边还有个问题:一个工程里面有很多个文件,在主程序定义的全局变量,按照需求把他们定义到外部去,那在其他文件调用到这些全局变量的时候,是不是也要在各个文件的开头申明一下这些外部全局变量分别在哪个段里面。
作者: strongchen    时间: 2007-4-28 14:11

应该不用了。
作者: ky3453079    时间: 2007-4-28 14:29

好象要申明,如果没申明的话,要把外部的全局变量赋给内部的全局变量,就会出错。他没有跳到分页程序那边。
作者: strongchen    时间: 2007-4-28 15:02

你是对的,在声明外部变量的同时,也要声明它是PPAGE控制的外部变量。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0