位置:51电子网 » 技术资料 » 通信网络

pSoSystem下的通用网络驱动模型设计与分析

发布时间:2008/5/29 0:00:00 访问次数:529

  摘要:在嵌入式平台上,由于大多数嵌入式操作系统都没有提供一个较为完整的驱动程序模型,从而使得驱动程序的开发较为复杂.而且每次开发的代码,其可重用性也很差.本文根据开发psos下网络驱动程序的实际经验,将独立于具体硬件的代码抽象出来,尝试提出了一种在psos下开发网络驱动程序的通用模型,以简化相应的开发工作和实现代码的最大重用.

  关键词:嵌入式;psosystem;网络驱动程序

psosystem操作系统简介

  psosystem是一种专门用以嵌入式处理器的高性能的、模块化的操作系统.基于开放操作系统标准,它提供了一种复杂的多任务运行环境.同时,它也提供了一系列的集成开发工具,这些开发工具可用于unix系统,也可用于windows系统.另外,由于psosystem是一种模块化的操作系统,所以,开发人员可以根据需要,选用不同的操作系统模块.这样,就使得我们没有必要把一个庞大的操作系统全部加载到嵌入式系统设备上.比如说,如果我们的应用系统不需要支持文件功能,则可以不用加载文件系统.这样,就可以大大缩减操作系统的尺寸.psosystem的整个系统结构如图1所示.

图1psos系统框图

psosystem网络设备驱动程序概述

  网络驱动在psosystem里有作专门的处理,它不是直接和psos+内核模块的i/osupervisor打交道,而是和pna+网络模块打交道.和i/o监管层一样,为了屏蔽具体硬件之间的差异,pna+也为网络驱动程序提供了一个中间层,称之为ni(networkinterface)层.在ni层,它为上层提供了一系列的标准网络接口函数(如网卡初始化,网络包发送等),这些接口函数是在网络驱动程序里实现,而由pna+模块里的其它网络层调用.要编写网络驱程,就是要具体实现这几个接口函数.图2是网络驱动程序在psosystem中的模型图.

图2网络驱动模型

通用网络驱动模型的设计

  通用网络驱动模型的整体设计思想,就是将独立于具体硬件的操作抽象出来,以形成一个通用的代码框架.具体来说,主要包括以下几个部分:
a) 底层驱动和上层应用的分离层次模型设计;
b) 由上述分离层次所得到的相应接口函数的设计;
c) 网卡数据包接收、发送的抽象代码框架的设计;
下面,本文将就上述3个方面的设计作一个较为全面的分析.

底层驱动和上层应用的分离层次模型设计

  显然,这一块的设计是整个驱动模型设计的首要部分.只有将底层驱动和上层应用有效地分离出来,才能保证代码的独立性与重用性,从而也使得驱动程序的开发者不用过多地关心上层应用,符合现代软件的设计思想.关于这一部分的设计,psosys2tem已经帮助我们完成,其所提供的网络驱动模型就是一个典型的软件分层设计实例.详情请看图2.

接口函数的设计

  一般来说,根据上述所设计的驱动程序分层模型,都会为上下两层的沟通提供一些标准的接口函数.显然,这些接口函数的实现,大部分是和底层硬件具体相关的,但其操作步骤却是大同小异的.因此,在我们的通用驱动模型框架里,就是要抽象出独立于具体硬件的一般操作,以形成一个通用的代码框架,在这里,我们一般就以伪c代码形式来给出各个接口函数的一般实现.

(1)nilan接口函数的设计与分析
  nilan是pna+层和网络驱动挂接的一个最为重要的接口函数.实际上,早在pna+模块的加载过程中,pna+就安装了此函数,其相应的伪c代码如下:
uchar *setupni(uchar *freememptr)
{installni((int(*)()) nilan, ipaddr,
bsp-lan1-mtu,bsp-lan1-hwalen,bsp-lan1-flags,sysvars.lan1subnetmask,0);
/*通过这个函数的调用,将nilan函数安装到了pna+模块中去了*/
freememptr=setuplanparams(bsp-lan1-pkb,freememptr);
/*在pna+模块里为网卡要用到的接收与发送等缓存分配空间*/
}
代码1

  通过这个函数,pna+层可以完成所有有关网络应用的调用.其具体做法就是:由pna+层传入不同的功能号,以达到调用相应具体功能函数的目的,其相应的伪c代码如下:
longnilan(ulongfunction, union nientry*p)
{
if(function= =ni-init)
{
return ni-init();
}else
{
/*根据功能号,调用相应的功能函数*/
switch(function)
caseni-send:调用ni-send();break;
case其它功能号:调用其它功能函数;break;
}
}
代码2

(2)ni-init函数的设计与分析

此函数主要是用来配置和初始化网卡的各种硬件和软件资源,具体功能如下所述:
a)初始化buffers,主要是将其链成链表,以方便操作;
b)初始化网卡相关的寄存器,最重要的就是收发寄存器的首址rxdesc和txdesc;
c)初始化收发寄存器,主要是将其链成队列,以方便内存的循环使用;
staticlongni-init(void)
{
initbuffers();/*初始化buffer,主要是将
其链成链表*/
installisr();/*安装

  摘要:在嵌入式平台上,由于大多数嵌入式操作系统都没有提供一个较为完整的驱动程序模型,从而使得驱动程序的开发较为复杂.而且每次开发的代码,其可重用性也很差.本文根据开发psos下网络驱动程序的实际经验,将独立于具体硬件的代码抽象出来,尝试提出了一种在psos下开发网络驱动程序的通用模型,以简化相应的开发工作和实现代码的最大重用.

  关键词:嵌入式;psosystem;网络驱动程序

psosystem操作系统简介

  psosystem是一种专门用以嵌入式处理器的高性能的、模块化的操作系统.基于开放操作系统标准,它提供了一种复杂的多任务运行环境.同时,它也提供了一系列的集成开发工具,这些开发工具可用于unix系统,也可用于windows系统.另外,由于psosystem是一种模块化的操作系统,所以,开发人员可以根据需要,选用不同的操作系统模块.这样,就使得我们没有必要把一个庞大的操作系统全部加载到嵌入式系统设备上.比如说,如果我们的应用系统不需要支持文件功能,则可以不用加载文件系统.这样,就可以大大缩减操作系统的尺寸.psosystem的整个系统结构如图1所示.

图1psos系统框图

psosystem网络设备驱动程序概述

  网络驱动在psosystem里有作专门的处理,它不是直接和psos+内核模块的i/osupervisor打交道,而是和pna+网络模块打交道.和i/o监管层一样,为了屏蔽具体硬件之间的差异,pna+也为网络驱动程序提供了一个中间层,称之为ni(networkinterface)层.在ni层,它为上层提供了一系列的标准网络接口函数(如网卡初始化,网络包发送等),这些接口函数是在网络驱动程序里实现,而由pna+模块里的其它网络层调用.要编写网络驱程,就是要具体实现这几个接口函数.图2是网络驱动程序在psosystem中的模型图.

图2网络驱动模型

通用网络驱动模型的设计

  通用网络驱动模型的整体设计思想,就是将独立于具体硬件的操作抽象出来,以形成一个通用的代码框架.具体来说,主要包括以下几个部分:
a) 底层驱动和上层应用的分离层次模型设计;
b) 由上述分离层次所得到的相应接口函数的设计;
c) 网卡数据包接收、发送的抽象代码框架的设计;
下面,本文将就上述3个方面的设计作一个较为全面的分析.

底层驱动和上层应用的分离层次模型设计

  显然,这一块的设计是整个驱动模型设计的首要部分.只有将底层驱动和上层应用有效地分离出来,才能保证代码的独立性与重用性,从而也使得驱动程序的开发者不用过多地关心上层应用,符合现代软件的设计思想.关于这一部分的设计,psosys2tem已经帮助我们完成,其所提供的网络驱动模型就是一个典型的软件分层设计实例.详情请看图2.

接口函数的设计

  一般来说,根据上述所设计的驱动程序分层模型,都会为上下两层的沟通提供一些标准的接口函数.显然,这些接口函数的实现,大部分是和底层硬件具体相关的,但其操作步骤却是大同小异的.因此,在我们的通用驱动模型框架里,就是要抽象出独立于具体硬件的一般操作,以形成一个通用的代码框架,在这里,我们一般就以伪c代码形式来给出各个接口函数的一般实现.

(1)nilan接口函数的设计与分析
  nilan是pna+层和网络驱动挂接的一个最为重要的接口函数.实际上,早在pna+模块的加载过程中,pna+就安装了此函数,其相应的伪c代码如下:
uchar *setupni(uchar *freememptr)
{installni((int(*)()) nilan, ipaddr,
bsp-lan1-mtu,bsp-lan1-hwalen,bsp-lan1-flags,sysvars.lan1subnetmask,0);
/*通过这个函数的调用,将nilan函数安装到了pna+模块中去了*/
freememptr=setuplanparams(bsp-lan1-pkb,freememptr);
/*在pna+模块里为网卡要用到的接收与发送等缓存分配空间*/
}
代码1

  通过这个函数,pna+层可以完成所有有关网络应用的调用.其具体做法就是:由pna+层传入不同的功能号,以达到调用相应具体功能函数的目的,其相应的伪c代码如下:
longnilan(ulongfunction, union nientry*p)
{
if(function= =ni-init)
{
return ni-init();
}else
{
/*根据功能号,调用相应的功能函数*/
switch(function)
caseni-send:调用ni-send();break;
case其它功能号:调用其它功能函数;break;
}
}
代码2

(2)ni-init函数的设计与分析

此函数主要是用来配置和初始化网卡的各种硬件和软件资源,具体功能如下所述:
a)初始化buffers,主要是将其链成链表,以方便操作;
b)初始化网卡相关的寄存器,最重要的就是收发寄存器的首址rxdesc和txdesc;
c)初始化收发寄存器,主要是将其链成队列,以方便内存的循环使用;
staticlongni-init(void)
{
initbuffers();/*初始化buffer,主要是将
其链成链表*/
installisr();/*安装
相关IC型号

热门点击

 

推荐技术资料

耳机的焊接
    整机电路简单,用洞洞板搭线比较方便。EM8621实际采... [详细]
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!