新闻中心

EEPW首页>嵌入式系统>设计应用> 实时单片机通讯网络中的内存管理

实时单片机通讯网络中的内存管理

作者: 时间:2009-05-13 来源:网络 收藏

2的分配
  那么,如何利用这张表进行分配呢?分配方法采用。用一个例子来说明这个问题。例如经过若干次分配和空闲区回收后,甲站点的主要情况如图3所示(卡上还有一批数据未传入宿主机)。

本文引用地址://m.amcfsurvey.com/article/173739.htm

在这种情况下,乙站点申请分配4块内存,则先把地址指针定位00EDH处(第15项的标志栏处),由于该项的标志为free但大小不够,故需向前查找.用该项的终止块号(15)减去该项的块数(1)得到数字14,故将地址指针定位到第14项处的标志栏处,虽块数大小够但该内存区为busy,故仍需往前找.此时用第14项处的终止块号(14)减去该项的块数(4)得到数字10,所以将地址指针定位到第10项的标志栏处。第10项的块数大于需分配的内存块数,故可以在此处分配.分配后的的主要情况如图4所示。

的汇编程序中,动态分配内存是调用allocate子程序来完成的.具体步骤是这样的:
  (1)先由入口参数寄存器R3和R2(存放需要申请的内存长度)折合成需分配的内存块数,并将其值传递给变量required_size。
  (2)从末(00ED H处)自后向前找.即先把地址指针定位在00EDH处(第15项的标志栏处),如果该项的标志不为free或该项的标志为free但该项的内存块数小于需分配的内存块数,则用该项第二栏的数字(终止块号)减去该项第三栏的数字(块数)作为下一次向前查找的表项号,并由此定位下一次向前查找的地址指针.就这样一直向前查找,直到找到不小于需分配的内存块数或已到内存表头.
  (3) 如找到不少于申请块数的空闲区,将空闲区的低端分配给该批数据使用,相应地修改内存表中的相关项,子程序返回分配成功标志;否则,子程序返回分配不成功标志。
3 内存的释放和合并
  虽然我们成功地制定了内存分配的算法和子程序,但是在内存中还要处理空闲区的释放和相邻空闲区的合并。free_and_join子程序就是用来完成这个任务的.当接收方(从机)接收完发送方(主机)发来的报文数据并将数据上传给宿主机后,就需要在free_and_join子程序中释放该报文数据在本机中所占的内存(free),并且需要检测该被释放的内存与其相邻的空闲内存是否可以合并。如能,合并之.这样,该机如接收其它主机发来的长的报文数据时,可以有足够大的连续的空闲内存来分配;同时,也保证了内存操作的完备性.算法是这样实现的:
  (1)内存表中被释放项的标志改为free。
  (2)由于表项中的第二栏为终止块号而非起始块号,且在内存表中向前查找是沿着内存表的地址减小的方向进行的,故需先寻找上相邻,再寻找下相邻.
  (3) 判断上相邻表项是否free;如果是,合并之。
  用被释放项的终止块号r_block_end (R2)减去该项的块数r_block_num (R3),并将其值传给R4,再调用block_to_address子程序来向前找上相邻.如果该项处的标志为free,则是上相邻.取出上相邻表项处的块数,加到本表项(被释放项)的块数R3上,并写入本表项;并将上相邻表项处的标志置为03H(异于busy和free即可)。
  (4) 判断下相邻表项是否free;如果是,合并之。
  把地址指针定位00ED H处(内存表尾),从内存表尾向前找.取出地址指针处的表项的终止块号并存入R5,再取出该表项的块数并存入R4.直到R5减去R4的结果等于被释放项的终止块号为止.若此时地址指针处的表项的标志为free,则该表项是被释放项的下相邻.在下相邻表项处,将该项的块数加上被释放项的块数并存入;在被释放项处将标志置为03H(异于busy和free即可).
  举一个例子能更好地表明这种的释放和合并算法.例如将被释放的内存区在内存表中是第6块和第7块.其上相邻处内存区为第3,4,5块,且其标志为free;其下相邻处内存区为第8,9,10块,且其标志为free;合并的过程如图5所示。

总之,与固定分区法相比,法在报文接收前不建立分区.分区的建立是在报文接收的过程中进行的,且其大小可随报文长度动态改变,这就改变了法中的即使是小数据量也要占据大分区的浪费堵塞现象,从而提高了内存的利用率.另外,也提高了DCS系统通讯的短数据的平均传输速率,更适应DCS系统的性要求.


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭