keil C51中的data怎么设置成大一点的值?
keilC51中的data超过了110多就报错,data就超了;现在我的芯片有512字节的RAM,要怎么设置keil,才能使软件的data不报错?还请各位高手指点指点!补...
keil C51中的data超过了110多就报错,data就超了;
现在我的芯片有512字节的RAM,要怎么设置keil,才能使软件的data不报错?
还请各位高手指点指点!
补充:不要说更换芯片、设置成xdata、缩减代码之类的,我需要的是怎么设置成更大的RAM,谢谢!! 展开
现在我的芯片有512字节的RAM,要怎么设置keil,才能使软件的data不报错?
还请各位高手指点指点!
补充:不要说更换芯片、设置成xdata、缩减代码之类的,我需要的是怎么设置成更大的RAM,谢谢!! 展开
4个回答
展开全部
在keil里面选择正确的单片机型号,各种型号对应了特定的ram
比如:89c51的128 Bytes On-chip RAM。比如将那些不改变的变量定义为code,比如unsigned char code a;可以用外扩的数据存储器,定义XDATA来改变变量的存储地方,比如XDATA signed char a;设置options for the target里面的target,如图。
资源不够你可以减少没有用到的定义变量,或者是精简变量,能用char的就用char,
WARNING L15,大多是函数可重入性函数的问题,比如说主函数条调用某个函数abc();中断里面也调用了这个函数,而你定义的这个函数是不可重入得函数,就会L15警告。解决由两个方法,重新顶一个一样的函数,就是函数名字不一样,分别在主函数和中断里面各自调用函数,另一种就是在函数abc()加入reentrant 可重入性。reentrant abc ()这个方法会降低重入函数的执行速度
展开全部
楼主没有搞清楚 51的 结构.
楼上说的虽然大多是废话,,对你的项目可以没多少帮助
但是至少有一点是对的..设置成xdata可以解决你的问题.
虽然不是什么好办法.
51的 ram 分外三种.
内部直接寻址你的128byte 内部间接的128byte
还有就是外部 ram
你的51单片机有512byte
那么肯定是 内部 直接 间接各128
外加外部256字节
你把那些大一点的数据全部改成 xdata 声明就可以了.
当然如果你会控制ram大小的话..用idata 声明效率更好一点
例如 unsigned char yy;
写个成 unsigned char xdata yy;
(你看你自己的编译结果显示 data=137, xdata=0, code=4856
就应该猜测一下 xdata 干吗用的了
最后 建议楼主. 最好不用在keil c51里面使用printf函数(浪费啊)
回去.仔细看一遍51的结构..然后看看keil c51的区别于ansi c的东西
会对你有帮助
楼上说的虽然大多是废话,,对你的项目可以没多少帮助
但是至少有一点是对的..设置成xdata可以解决你的问题.
虽然不是什么好办法.
51的 ram 分外三种.
内部直接寻址你的128byte 内部间接的128byte
还有就是外部 ram
你的51单片机有512byte
那么肯定是 内部 直接 间接各128
外加外部256字节
你把那些大一点的数据全部改成 xdata 声明就可以了.
当然如果你会控制ram大小的话..用idata 声明效率更好一点
例如 unsigned char yy;
写个成 unsigned char xdata yy;
(你看你自己的编译结果显示 data=137, xdata=0, code=4856
就应该猜测一下 xdata 干吗用的了
最后 建议楼主. 最好不用在keil c51里面使用printf函数(浪费啊)
回去.仔细看一遍51的结构..然后看看keil c51的区别于ansi c的东西
会对你有帮助
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
以我的知识,keil不允许自己设置ram大小。都由芯片决定。
512字节的internal ram?我没见过。。。
因为512字节的ram寻址需要2个字节,而data一般只用一个字节寻址。
所以很难想象存在512的data空间。
甚至data区只有128字节,包括寄存器占用的。
因为另128字节地址作为sfr被访问。
所以超过128的internal ram都用idata方式来访问。
楼主仔细看看芯片手册?如果确定有512字节data,务必告诉我使用何种汇编语句直接访问data。
512字节的internal ram?我没见过。。。
因为512字节的ram寻址需要2个字节,而data一般只用一个字节寻址。
所以很难想象存在512的data空间。
甚至data区只有128字节,包括寄存器占用的。
因为另128字节地址作为sfr被访问。
所以超过128的internal ram都用idata方式来访问。
楼主仔细看看芯片手册?如果确定有512字节data,务必告诉我使用何种汇编语句直接访问data。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
data不是数据类型,是keil编译器的一个关键字,用来声明变量存储的位置的。
若一个变量声明为data,那么它就是存放在单片机低128byte的ram区的。
数据类型是char int long这些,本质上就是用来声明一个变量是占用多少字节的存储空间的。
举个例子,int a;int bdata a;int data a;
a这个变量都是整形,占用两个字节的存储空间,但通过加关键字“bdata”和“data”声明了之后,存放的位置会比较确定。
不加该关类键字的话,编译器有可能把它分配在bdata区或者data区。
若一个变量声明为data,那么它就是存放在单片机低128byte的ram区的。
数据类型是char int long这些,本质上就是用来声明一个变量是占用多少字节的存储空间的。
举个例子,int a;int bdata a;int data a;
a这个变量都是整形,占用两个字节的存储空间,但通过加关键字“bdata”和“data”声明了之后,存放的位置会比较确定。
不加该关类键字的话,编译器有可能把它分配在bdata区或者data区。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询