kongjie07 发表于 2010-10-16 18:23:50

求助!keil c中idata数据清零的问题

程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uintunsigned int
sbit led=P2^0;

void main()
{       
        uchar i;
         uchar idata test_a={1,2,3,4,5,6,7,8,9,0};
        uchar idata * data p=0;
        for(i=0;i<128;i++)
        {
                *p=0;
                p++;
        }



    led=0;

}
发现0x00和0x07怎么也清不了,请大侠们指点指点,谢谢!
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_590318R4FQWJ.JPG
(原文件名:idata clear.JPG)

flywater 发表于 2010-10-16 22:38:32

你对内存区还不太了解,当你使用第1组寄存器时,data区的00~07其实就是R0~R7,你的:p++编译后其实就是 inc R0(地址00),
for(i=0;i<128;i++) 其实也是INC R7(地址07)直到80H,其实它是也被清过零,只是你又把它加上去了。

Little_White 发表于 2010-10-17 15:24:14

回复【1楼】flywater落叶
-----------------------------------------------------------------------

没看大明白。R0-R7 在什么时候清零,又是在什么时候加上的???

kongjie07 发表于 2010-10-17 19:34:51

回复【1楼】flywater 落叶
-----------------------------------------------------------------------
我清的是Idata类型的数据,跟data类型没什么关系吧?我知道间接寻址内128字节的寄存器是要用到R0和R1,可那是data类型的啊,我查看的是idata类型的数据。

rainyss 发表于 2010-10-17 21:47:41

uchar idata test_a={1,2,3,4,5,6,7,8,9,0};
uchar idata * data p=0;
for(i=0;i<128;i++)
{
*p=0;
p++;
}

修改:

uchar idata test_a={1,2,3,4,5,6,7,8,9,0};
unsigned char idata * p = 0;//uchar idata * data p=0;
for(i=0;i<128;i++)
{
*p=0;
p++;
}


头几个清不了很正常

rainyss 发表于 2010-10-17 21:50:03

回复【3楼】kongjie07 路人甲
回复【1楼】flywater 落叶
-----------------------------------------------------------------------
我清的是idata类型的数据,跟data类型没什么关系吧?我知道间接寻址内128字节的寄存器是要用到r0和r1,可那是data类型的啊,我查看的是idata类型的数据。
-----------------------------------------------------------------------

低128字的data和idata是重叠的

gycsy 发表于 2010-10-17 23:26:23

呵呵,挺有意思. 这个程序永远无法结束吧?

i 变量会被反复清0, for 永远出不来.

而idata内存访问一定要用到Ri作为地址指针.

flywater 发表于 2010-10-18 00:08:51

回复【2楼】Little White
-----------------------------------------------------------------------

看一下汇编代码你就清楚了,此时汇编代码用R0和R7用作了你的循环记数器,你清到07时就已把R0和R7清过了,只是你的程序中INC R0和INC R7又把它加到了87和80H

flywater 发表于 2010-10-18 00:09:46

回复【3楼】kongjie07 路人甲
回复【1楼】flywater 落叶
-----------------------------------------------------------------------
我清的是idata类型的数据,跟data类型没什么关系吧?我知道间接寻址内128字节的寄存器是要用到r0和r1,可那是data类型的啊,我查看的是idata类型的数据。
-----------------------------------------------------------------------

建议好好看看教科书!

kongjie07 发表于 2010-10-18 09:35:52

找到原因了,虽然我把数组定义成idata类型的,把指针也定义成指向idata类型的,但是由于data类型的RAM基本没用到,所以KEIL C直接把数组存到data类型的RAM里去了,指针指到哪去了,我也不明白了,大侠们帮忙啊。还有就是在低128字节的RAM有剩余是,如何直接吧数据存储到高128字节的RAM区?

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_590696HZ2SXW.JPG
(原文件名:编译结果.JPG)

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_590697ANGGEJ.JPG
(原文件名:data 0.JPG)

kongjie07 发表于 2010-10-26 18:46:28

回复【8楼】flywater 落叶
-----------------------------------------------------------------------

回复【9楼】kongjie07 路人甲
-----------------------------------------------------------------------

我一直以为idata存储类型的数据只包含片内高128字节的RAM,现在懂了,对8052来说它包括256字节的片内RAM,清空它可以用STARTUP.A51,把idatalen改成100H,xdatalen也改成100H(我用的是stc89c52rc)就行了。

csq463276932 发表于 2014-7-15 18:00:43

    idATa: 固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同。idATa是用类似C中的指针方式访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idATa做指针式的访问效果很好)
页: [1]
查看完整版本: 求助!keil c中idata数据清零的问题