small编译模式下定义变量
❶ 定义变量 占内存的多少
一个指针变量在内存中占两个字节(small模式编译)
一个指针变量在内存中占四个字节(32位机器上)
一般都是32位机器的,所以四个字节咯。
❷ 51单片机定义变量时默认是存储到哪里的
未显式声明的情况下,变量会根据Memory Model的设置,默认分配在指定的存储区。
Small模式:默认分配在data区
Compact模式:默认分配在pdata区
Large模式:默认分配在xdata区
新建工程默认都是Small模式,所以未显式声明存储区域的变量都会分配在data区的。所以才会容易出现data区挤爆、编译器跳着脚让你把变量分到idata区去……
❸ C语言指针变量怎么能表示任何内存地址.
你用的是16位的编译器吧.(比如TC之类的)
你还没学汇编(或者计算机原理之类)的吧.
80X86CPU在16位模式下,地址是靠两个16位的2进制数表示的.就是 段地址 和偏移量 ,它们组合成20位的实地址能寻址1M的空间(具体怎么组合,有兴趣了自己在网上看看).
你选择的编译模式是small(TC默认的,Model Small),只有一个数据段.所以段地址固定不变(在程序运行时等于一个常数.不需要表示),所以
char *p;
sizeof(p)==2 (这是个16位的偏移量)
如果你把编译模式改成large或者huge
这个时候 char *p;
sizeof(p)就是 4 了,它包含了段地址和偏移量.
或者不管在什么模式下,你直接声明一个char far *p;
可以断定sizeof(p) 是4
这也是char near *p 和char far *p 的不同.
char far* 是包含段地址和偏移量,
char near* 则只有偏移量.
small 模式下,默认char * 就是char near*
而large模式下, 默认char * 就是 char far*
(near和far编译器帮你加上的)
段地址和偏移量组合后只有20位,所以在实模式下直接寻址只有1M空间.(注意是【直接】能寻到的空间)
如果你接触过dos(真正的dos而不是winxp下面的cmd),你就会知道,在没有扩展内存和扩充内存的情况下,总共可利用的内存只有1M(不管你的内存条是多少M的),寻址能力不行.
最后导致用户可以用的内存只有600K左右.
如果有兴趣的话,自己找点这方面的知识看看
❹ 为什么Keil C中idata不能用,是不是要在哪里设置一下
的确是RAM不够了,因为你没有把堆栈计算进去,所以虽然看起来小于256,但实际已经溢出。
从编译结果来看,你有好几个函数有实体但没有调用,这样是很浪费RAM的,因为KEIL因此会为这些函数中的局部变量都做了保留,相当于变成了全局变量来保存,如果你不想删除这些函数,那就教你个办法,在程序初始化阶段:
i=0;
if(i)
{
...
不需要调用的函数;
...
}
这样就能把RAM省下来了。
记住,嵌入式编程时,任何一个RAM空间都是十分宝贵的,可不能像PC程序那样用啊。一些对性能要求不高的变量,或使用不频繁的变量最好定义到XDATA中去。
❺ 关于单片机内存问题,DATA和XDATA具体是怎么样的
选择small 模式你定义的变量默认为data模式,即变量存放与单片机的内部ram,而large模式下,定义的变量存放于外部ram。前者运算速度快于后者。