新闻中心

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

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

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

在AUTO 2000 DCS系统中,我们采用了.这是一种具有不确定控制站监控的主从式总线.大致的工作过程是:系统上电,各站点进行控制权争夺确立控制站和非控制站;控制站轮询各站点,被轮询的站点若有数据发送即成为主站,执行主机/从机的通讯;通讯结束后(无论成功与否)主站将控制权归还给控制站;控制站然后轮询下一个站点,周而复始。 
  为了提高通讯效率,采取了一系列相应的措施.例如,我们把站点集分为活动站点集和非活动站点集.这样,网中如有某站点出现故障,该站点被控制站询问时响应将超时,则该站点将从活动站点集转到非活动站点集中.这样,系统在下一次轮询时就不再轮询该站点.故障站点恢复正常后或有新的站点开机上线,控制站将在轮询周期结束后的测试周期中将它们加入到活动站点集中.事实上,控制站轮询的是活动站点,测试的是非活动站点.这无疑是一种提高网络效率的方法。
  另外还有一种更为重要的途径即为本文将要介绍的动态方法。DCS网络系统所要传输的数据一般有下述几种:较长的周期性数据,较短的随机上报数据及较短的命令/响应数据。对周期性数据,稍微的滞后甚至一两次丢失都是允许的;而对随机上报数据和命令/响应数据,则要求尽可能快地完成传输。在传统的静态分配方式下,甲网卡接收到乙网卡的数据后在上传至宿主机前宣布缓冲区满而不能接收其它站点的数据。这显然是对内存资源的一种浪费,同时也严重影响了网络的通讯效率。采用动态内存分配方式后,甲网卡每收到一批数据,只从自己有限的空闲内存中分配出合适的一块来存放该批数据,剩下的空闲内存仍可接收其它网卡的数据,并当宿主机有空时,将所有接收的数据一并上传至宿主机并清空内存。因此通讯效率大为提高。
1 结构
  为了对网卡上内存进行,设置了一张内存状况表(简称)来记录当前内存的使用情况。所谓内存,实际上即为内存的分配和回收,主要解决两个问题:
  (1) 对需要申请的内存长度,分配程序需从中寻找出合适的空闲区.分配给该批数据使用,并对内存表进行更新。
  (2) 进程或作业释放内存资源时,和相邻的空闲区进行链接合并,更新可用表。
  具体地,以某一基本容量(视系统通讯的数据量而定,在此为1K)对可用内存区域(如0400H ~ 3FFFH)进行划分和编号(1~15),每一个实际的已分配内存区和空闲内存区在内存表中占据一个表项位置,而每一表项结构为:

本文引用地址:http://www.eepw.com.cn/article/173739.htm

这样在某一时刻,可能有1~15个独立的内存区(空闲的或已分配的)。也就是说,可用内存表表项的最大数目为15。但在某一时刻,却可能只有1个区(如初始化后只有1个空闲内存区)。为了查找某时刻实际内存的分配情况,我们设计了逆向搜索链,该链由内存表项的后两栏组成,如图1所示。

该图中,第15表项的结束块号肯定为15,表示编号为15的内存区域(3C00H~3FFFH)肯定是某个已分配区域(或空闲区域)的一部分。但该区域究竟有多大,要看第15表项的第3栏(块数),设为5。这就表明其相邻的上一区域的结束块号为15减去5。然后查找内存表的第10表项 ,可知其大小为8。接下来查找第2表项,得到其分配块大小为2。从而可得该时刻内存中实际分配3个区,大小分别为5,8,2。至于内存表中的其它表项在该时刻是无用的。 运行初始化程序init_table后,内存表的结构如图2所示。

其中,00C0H~00C2H和00F0H的地址用来存放表头和表尾的标志,内存表的主要内容有15项,每一项3个栏目,每一个栏目占用一个实际内存单元.初始化后的0400H到3FFFH的15K内存均为空闲,故从终止块号15逆推15块,1~15块均为空闲块,即内存表中只有一个内存区.在内存表的结构图中反映为表中主要内容的第15项的标志位为free, 内存区的终止块号为15,块数为15,其它表项则是无用的。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭