单片机编程中RAM中的GAP

[复制链接]
 楼主| 发表于 2012-2-12 21:42 | 显示全部楼层 |阅读模式
RAM中的GAP是什么原因形成的 他存在有什么不好  有什么优化办法
发表于 2012-2-12 21:56 | 显示全部楼层
GAP是啥?
发表于 2012-2-12 22:14 | 显示全部楼层
GAP是什么?

LZ嵌入式广告?
发表于 2012-2-13 08:06 | 显示全部楼层
简单来说,Gap就是因硬件平台的存储器分布限制与设计者的存储器分配不调和而产生的未利用空间。形象来比方就是一个杯子里装石块的总体积必定比装沙子的总体积要小。
例如对于51平台,设计者分配的DATA块总共占用到了70H、还有个IDATA块总共大小为50字节,于是在80H之前就会出现16字节未用Gap。因为连接器始终是针对一个存储块进行绝对定位的,如果前一个可用空间不足就会尝试下一个可用空间。
设计者应当对于51平台的这种限制性心中有数,在设计时即考虑到变量的合理空间分配。还有一种方法就是将程序划分为若干个模块,这样各个模块所生成的目标块也会相应缩小,有利于充分利用空间。
发表于 2012-2-13 08:27 | 显示全部楼层
可以看一下MAP文件,
将某些变量绝对定位来消除GAP
发表于 2012-2-13 12:58 | 显示全部楼层
4# ejack  
你好 可以留下个联系方式吗  进一步交流一下
tao180539 发表于 2012-2-13 09:15


你先别高兴太早,用的啥语言在写,上操作系统了没?
发表于 2012-2-13 12:58 | 显示全部楼层
4# ejack  
你好 可以留下个联系方式吗  进一步交流一下
tao180539 发表于 2012-2-13 09:15


你先别高兴太早,用的啥语言在写,上操作系统了没?
发表于 2012-2-15 07:50 | 显示全部楼层
LZ用的是51平台吗?
如果有什么进一步的问题不妨在这里问,大家可以共同探讨。
发表于 2012-2-15 09:22 | 显示全部楼层
哈哈.俺一般喜欢跑arm...内存大大的有
发表于 2012-2-15 09:44 | 显示全部楼层
扣资源的事会越来越少的。
发表于 2012-2-16 08:03 | 显示全部楼层
嗯?突然发现俺举的例子根本错了……
这个例子更直观
            TYPE    BASE      LENGTH    RELOCATION   SEGMENT NAME
            -----------------------------------------------------

            * * * * * * *   D A T A   M E M O R Y   * * * * * * *
            REG     0000H     0008H     ABSOLUTE     "REG BANK 0"
            DATA    0008H     0015H     UNIT         _DATA_GROUP_
            IDATA   001DH     0002H     UNIT         _IDATA_GROUP_
                    001FH     0001H                  *** GAP ***
            BIT     0020H.0   0001H.3   UNIT         ?BI?BLABLABLA
            BIT     0021H.3   0000H.1   UNIT         _BIT_GROUP_
                    0021H.4   0000H.4                *** GAP ***
            DATA    0022H     005DH     UNIT         ?DT?BLABLABLA
                    007FH     0001H                  *** GAP ***
            IDATA   0080H     000CH     ABSOLUTE     
            IDATA   008CH     0001H     UNIT         ?STACK
 楼主| 发表于 2012-2-16 16:13 | 显示全部楼层
9# ejack
是啊 C8051F120单片机 没跑操作系统
发表于 2012-2-17 12:42 | 显示全部楼层
这个问题我也困扰了好久
发表于 2012-2-17 12:57 | 显示全部楼层
有没有 什么办法确定变量 使用内存的地址呢
发表于 2012-2-17 13:01 | 显示全部楼层
4楼说的好像不对,data没用完idata接着使用不会在中间产生gap但是如果将局部变量定义为idata 必产生gap 原因 不知道
发表于 2012-2-17 19:21 | 显示全部楼层
本帖最后由 刘前辈 于 2012-2-17 19:25 编辑
data没用完idata接着使用不会在中间产生gap但是如果将局部变量定义为idata 必产生gap 原因 不知道


很简单,data 区是直接寻址,idata 区是间接寻址,一个整体数据块(对象)不可能采用2种寻址方式读写数据。例如你定义了一个全局数组变量 char arr[30]; 而前面data 已分配到了70H,则必然产生16字节GAP,连接器从80H分配起。



、、
发表于 2012-2-20 08:05 | 显示全部楼层
本帖最后由 ejack 于 2012-2-20 08:06 编辑

To 17楼:
“但是如果将局部变量定义为idata 必产生gap”。

不一定,请参见13楼例子。

To 18楼:
我4楼举的那个例子的确有问题。连接器是知道全256字节都可以间接寻址的,因此70H开始分配单个IDATA块是不会gap的。例如:
            TYPE    BASE      LENGTH    RELOCATION   SEGMENT NAME
            -----------------------------------------------------

            * * * * * * *   D A T A   M E M O R Y   * * * * * * *
            REG     0000H     0008H     ABSOLUTE     "REG BANK 0"
            IDATA   0008H     0009H     UNIT         _IDATA_GROUP_
                    0011H     000FH                  *** GAP ***
            DATA    0020H     0001H     BIT_ADDR     ?BA?BLABLABLA
            BIT     0021H.0   0005H.0   UNIT         ?BI?BLABLABLA
            BIT     0026H.0   0000H.2   UNIT         _BIT_GROUP_
                    0026H.2   0000H.6                *** GAP ***
            DATA    0027H     0036H     UNIT         ?DT?BLABLABLA
            DATA    005DH     0020H     UNIT         _DATA_GROUP_
            IDATA   007DH     003EH     UNIT         ?ID?BLABLABLA
            IDATA   00BBH     0001H     UNIT         ?STACK
其中idata型全局变量块就是分配到7DH开始的。
发表于 2012-2-20 08:28 | 显示全部楼层
将变量定义分配在多个模块中完成可以清除或减少
发表于 2012-2-20 10:51 | 显示全部楼层
内存碎片。
一些存在着不同的内存段的cpu中,静态编译时,某个段没有足够的剩余空间分配给较大的变量块而产生空隙;或是动态分配内存时,被分配的内存小于最小内存段而产生的空隙。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

321

主题

515

帖子

3

粉丝
快速回复 返回顶部 返回列表