EPA通信协议栈设计中的关键技术研究
关键词:EPA;嵌入式实时系统;内存管理;定时队列;
[Abstract] In the design of EPA stack, memory management and timer queue is the key aspects which impact the performance of stack. According to the characteristic of EPA networks under embedded systems, the method of classified chain memory management and simple increment timer queue models are issued. Which provides a resolve method for enhancing the stabilization and real-time performance of EPA stack。
[Key words] EPA, Embedded real time system, Memory management, Timer queue
1. 前言
在国家863计划的连续滚动支持下,重庆邮电大学作为核心单位参与制定了国家标准DD《用于工业测量与控制系统的EPA(Ethernet for plant automation)系统结构和通信标准》(简称“EPA标准”)。 由于工业现场设备的特殊要求,在EPA网络上运行的协议栈必须稳定高效,这就需要我们不断去探索好的优化和实现方法。本文在分析了EPA网络特点的基础上,对EPA通信协议栈实现中的内存,时钟管理等关键技术进行了研究,并提出了相应的实现方案。
2. EPA网络
随着互联网技术的发展与普及推广,Ethernet技术也得到了迅速的发展,Ethernet传输速率的提高和交换技术的发展,给解决Ethernet通信的非确定性问题带来了希望,并使Ethernet全面应用于工业控制领域成为可能。目前EPA做为工业以太网技术的解决方案之一,它主要有以下几个方面的特点:
2.1 通信确定性与实时性
以太网由于采用CSMA/CD(载波侦听多路访问/冲突检测)介质访问控制机制,因此具有通信“不确定性”的特点,并成为其应用于工业数据通信网络的主要障碍。EPA是应用于工业现场设备间通信的开放网络技术,采用分段化系统结构和确定性通信调度控制策略,能够适应工业现场特殊需要,解决了以太网通信的不确定性的问题,满足了系统的实时性要求。
2.2 稳定性与可靠性
Ethernet进入工业控制领域的另一个主要问题是,它所用的接插件、集线器、交换机和电缆等均是为商用领域设计的,而未针对较恶劣的工业现场环境来设计(如冗余直流电源输入、高温、低温、防尘等),故商用网络产品不能应用在有较高可靠性要求的恶劣工业现场环境中。而EPA做为应用于工业现场的网络标准,稳定性与可靠性也是其必需的特点。
3. EPA协议中的内存管理
嵌入式系统软件设计中采取的内存管理方案有两种DD静态分配和动态分配。一般来说,嵌入式系统总是两种方案的组合,纯粹的静态分配一般只使用在不计成本来保证严格实时性的场合,而且静态分配容易使系统失去灵活性。考虑到EPA协议栈主要应用于工业网络设备中,所以我们在EPA协议栈设计中主要采用动态内存管理方式。动态内存管理机制在嵌入式软件设计是难点,也是直接关系到整个系统性能的关键。
在EPA协议栈设计中,针对网络部分和非网络部分的内存需求,我们把整个系统内存分成报文缓冲区和通用缓冲区两个不同的区域。先从系统申请固定大小的静态内存做为报文缓冲区和通用缓冲区,在每块内存区上定义自身的内存分配和回收算法,通过这种设计,能够确保网络系统不使用系统全部可用内存,应用程序也不会使用网络已用内存,从而实现了内存区域隔离,也防止了协议栈耗尽所有系统内存,提高了系统的稳定性和可靠性。
3.1报文缓冲区
EPA协议中用户数据从本地嵌入式设备传输到远程设备的过程中,要经过各层协议,对消息的封装,去封装和拷贝操作几乎是不可避免的。而通常所采用的用一段连续的内存区来存储,传递数据的做法会有缺陷:例如当从上层向下层传递数据时,下层协议需要对数据进行封装,而上层在申请内存时不会考虑到下层的需要。这样就会导致下层协议处理时需要重新申请内存并进行内存拷贝,从而影响程序的效率。另外随着数据的逐层处理,其内容可能有所增删,而连续内存很难处理这样动态的数据增删。因此,必须要有一种能适应数据动态增删,而在逻辑上又呈现连续性的数据结构,以满足各层之间的数据传递,而不是进行内存拷贝。因此在EPA协议栈设计中采取的报文内存管理方案必须满足以下要求:(1)适合存放不同长度的数据。(2)方便地操作变长缓存。(3)尽量减少为完成这些操作所做的数据拷贝。
综合考虑系统效率和EPA网络报文的特点,在EPA协议栈设计中,我们设计的每个缓冲块的长度固定,大小以满足EPA网络中的大多数报文的长度为标准,这里我们设置每个缓冲块的长度为128字节,大于这个长度的报文,就用多个缓冲块形成的缓冲链来满足。
EPA_BUFFER类型的缓冲区是报文缓冲区,该结构包括两个指针,两个长度域,其中next 域指针指向下一个EPA_BUFFER的缓冲块,pdata域指向EPA_BUFFER中的数据起始位,tot_len域包括整个数据链的数据长度,len域包含该缓冲块中的数据长度。EPA_BUFFER整个结构的大小取决域所使用的处理器体系结构中一个指针的大小及可能的最小alignment的大小。在带有32位指针和4个字节alignment的体系结构,整个的大小为16字节。一个EPA_BUFFER链,如图1所示:
图1. EPA_BUFFER链结构
缓冲区的操作函数:
void buf_init( void );
epa_buf_t * buf_alloc( void );
epa_buf_t * buf_new(u16_t tot_len);
void buf_delete(epa_buf_t *buffer);
epa_buf_t * buf_adjust(epa_buf_t *buffer, s16_t flen, s16_t blen);
void buf_read(epa_buf_t *buffer, u8_t *pdata, u16_t *len);
void buf_write(epa_buf_t *buffer, u8_t *pdata, u16_t *len);
对报文缓冲区使用这种设计方法,能够实现从中断发送,到协议处理,用户接收等整个过程中,数据只需要一次拷贝,减少了对数据空间需求(不用频繁地进行数据硬复制),从而提高了EPA协议处理地实时性。
3.2通用缓冲区
在EPA协议栈设计中,通用缓冲区管理的实现很简单,它分配和回收邻近的内存区域并且调整已分配的内存块。它使用系统中全部内存的特定区域, EPA_MEM类型的缓冲区是通用缓冲区,主要满足协议栈中与报文无关的内存需求。
在EPA_RAM内部,内存管理通过将一种小的结构放置在每一个被分配的内存块的顶端上来追踪分配的内存,这个结构(图2)设置两个指针指向内存中下一个和前一个分配块,还有一个used标志用来指示这个内存块是否已经被分配。使用最先适用的原则,通过搜索一个未使用的内存块来分配内存。当一个内存块被释放时,used标志被设为0,为了防止碎片,检测下一个和上一个内存块的used标志,如果它们还没有被使用,几个块合并成一个大的未使用的块。
图2 EPA_RAM结构
4. EPA协议中的时钟管理
在EPA协议栈设计中,定时器的有效管理尤为重要,特别是在确定性调度实现方面,能不能对定时器进行合理的管理往往成为提高整个协议栈实时性能的瓶颈。对定时器的组织和管理最简单的方式是采取先进先出(FIFO)方式的链表单队列,这种组织管理方式会有一下两个问题:定时队列太长,找到所有到点定时器的时间开销难以接受;当定时器中断发生时要对所有的定时器的时长域进行减法操作,该部分时间性开销也很大。另外,工业现场的嵌入式设备中,外设资源相对有限,为了使该协议栈能够广泛的应用于多种硬件平台,我们使用一个硬件定时器为基准时钟,然后在其基础上设计了简单递增时钟队列,以满足EPA系统对确定性调度以及时间同步的要求。
在系统中,为每个任务分配申请一个简单相对递增时钟队列,队列中的定时节点按照定时时长排列有序,时长短的靠前,如图3所示,定时节点1的时长为5 ticks, 定时节点2的时长为2ticks, 定时节点3的时长为4ticks, 在队列中,定时节点的时长值改为相对前一定时节点时长的差值,即相对时长。当时钟中断发生时,只需对队头的时长域进行减1操作,所有的到点定时节点也均集中于队列的前面。每个队列中又可以有多个时钟节点。逻辑时钟队列中,每个定时节点的数据结构如下所示:
typedef void (* timer_fun)(void *arg);
struct timer_node{
struct timer_node *next; /* 指向下一个定时节点 */
u32 time; /* 定时时间 */
timer_fun hander; /* 定时时间到后执行的函数 */
void *arg; /* 定时时间到后执行函数的参数 */
}
一个时钟队列如下图所示:
图 3 EPA时钟队列
逻辑时钟队列的处理函数有:
void time_queue_init( void );
u8_t time_task_add(u32_t msec, time_fun hander, void *arg);
u8_t time_task_delete(time_fun hander, void *arg);
在EPA协议栈设计中,利用此种定时队列,能够使用一个基准定时器就可以简单,有效的实现确定性调度和时间同步所需的定时功能。
5.结论
本协议栈设计采用标准C进行开发,并在ARM平台上结合UCOS-II进行了测试,测试结果表明:采用分类链式内存管理和相对递增时钟队列的内存和时钟管理方法的EPA通信协议栈通信过程稳定,速度快。
参考文献:
[1] EPA国家标准起草工作组.用于工业测量与控制系统的EPA系统结构与通信规范[S]. 北京:中国标准出版社.2005.
[2 ] Qing LiandCarolyn Yao,嵌入式系统的实时概念[M],北京:航空航天出版社,2004.
[3]晨风. 嵌入式实时多任务软件开发基础[M]. 北京:清华大学出版社. 2004.09
[4] EAN J.LABROSSE,邵贝贝译. µC/OS-II DD源码公开的实时嵌入式操作系统. 中国电力出版社,2003.04
[5] 胡纲,王雷.远端内存交换的设计与实现[J].微计算机信息,2006,10-3:21-23
[6] Jams NobleCharles Weir .内存受限系统之软件开发[M].华中科技出版社,2003.03
[7] Andrew N.Sloss,沈建华译. ARM嵌入式系统开发-软件设计与优化. 北京航空航天大学出版社,2005.05。
评论