0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于pSoSystem操作系统实现通用网络代码框架的设计

电子设计 来源:厦门大学学报:自然科学 作者:陈海华,胡林,杨 2021-05-27 10:40 次阅读

作者:陈海华,胡林,杨晨晖

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();/*安装中断服务程序,最重要

的就是网络数据接收中断*/

InitDescps()/*将收发寄存器链成队列*/

lanInit();/*初始化网卡的各个寄存器*/

}

代码3

网卡数据包收发代码框架的设计与分析

设计通用网卡驱动模型,显然,数据包的收发是最为重要的与具体硬件有关的操作,如何去除具体硬件的相关性,而抽象出独立于各种硬件的一般的收发代码,则显得非常重要。下面,将就网卡收发过程的一般步骤进行分析。

(1)网卡数据包的发送过程其具体步骤如下所示

a)应用程序为了发送数据,调用相应的套接字;

b)套接字的调用引发pNA+的系统调用,pNA+层则调用NiLan函数将上层的数据传给NI层;NiLan的具体实现参看代码2,这里,主要解释一下其传入的参数;function:功能号,NiLan将根据不同的功能号调用合适的NI层的函数;p:NI层的入口点,即上层和下层交换数据的地方,发送数据时,由这个入口点将相应的数据由pNA+层传入NI层,同样,接收数据时,也是由这个入口点将NI层收到的数据上传给pNA+层。

c)NI层收到pNA+层传入的数据之后,则将待发送数据组装成数据帧,以便接下来移

入网卡的发送寄存器发送出去,其相应的实现代码如下所示:

staticvoidni-send(char*hwa-ptr,char*pkbpt

r,USHORTtype)

{

tx-hdr=InitMblk();/3初始化三元组,一个三元组里存放一个数据帧*/

FillFrameHead();/*填充帧头*/

TxFillDesc();/*调用TxFillDesc()填充相

应的寄存器以把数据发送出去*/

}

代码4

(2)网卡数据包的接收过程

网卡接收数据的过程不同于发送数据的过程,发送数据时,有一个独立的发送数据的函数,而在网卡的接收数据的过程中,并不存在这样一个独立的函数,网卡数据的接收是通过中断服务程序来完成的,其具体步骤如下:

a)网卡产生接收数据的中断;

b)中断导致ni-isr()中断服务程序的调用,而在ni-isr()中,调用真正的中断响应程序

ni-poll(),ni-poll()则根据不同的中断事件,调用具体的中断服务程序;

static voidni-isr(void)

{

ienter();

AppModel-run-on-sstack((Pointer)nipoll, Null);

ireturn();

}

static voidni-poll(void)

{

for(;;)

{

if(接收数据中断)RxBufRcv();

if(发送数据中断)TxFillDesc();

if(其它中断)。..。..

}

}

代码5

c)对于接收数据的中断而言,在ni-poll()函数里调用的中断响应函数就是RxBufRev(),这个函数是真正负责网卡数据接收的地方,其工作原理就是读取网卡相应的接收寄存器,并通知pNA+层将数据取走;

staticvoidRxBufRcv(void)

{

for(;;)

{

good=CheckFrame()/*判断接收的数据包是否出错*/

if(good==TRUE)/*如果数据包没有出错,则将它交给pNA+层*/

{

/*建立三元组,并通知pNA+层*/

msgBlk=NiFuncs.esballoc((void3)&pktAddr-》type,dataLen,0,&frtn);

Announce(type,msgBlk,dataLen,IfNum);

}

}

}

代码6

d)通过RxBufRec()函数将数据从网卡中收下后,它最后还要再调用Announce()函数

通知pNA+模块将数据取走。至此,一个数据包的接收过程全部完成;注:Announce是一个回调函数,即在pNA+模块中定义的,由NI层调用的函数;

驱动程序的安装

在pSOS中,一般的驱动程序安装是通过修改drv-conf.c(pSoSystem操作系统里的一个系统配置文件)中的InstallDriver来完成。而网络驱动程序在pSoSystem里有作专门的处理,它是通过调用drvconf.c中的SetUpNi函数来实现的,而SetUpNi则会调用pSoSystem所提供的InstallDriver来最后完成网络驱动程序的安装。当然,最后还需要重新编译pSoSystem的内核,从而将我们的驱动程序模块加载到pSoSystem系统模块中。具体实现可以参看前面的代码1.

结束语

本文只给出了通用网络驱动模型的最重要部分的设计与分析,至于其它一些细节函数,限于篇幅,本文未做详述。有兴趣的读者,可以进一步参看文末所附的参考文献。最后,希望本文能对有心开发类似应用的工程威廉希尔官方网站 人员有所帮助。

责任编辑:gt

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19265

    浏览量

    229673
  • 嵌入式
    +关注

    关注

    5082

    文章

    19111

    浏览量

    304847
  • 操作系统
    +关注

    关注

    37

    文章

    6808

    浏览量

    123291
收藏 人收藏

    评论

    相关推荐

    一个判断操作系统的VBScript脚本代码

    西门子触摸屏基于不同的Windows操作系统,有的是标准的Windows系统,有的是嵌入式操作系统Windows CE。这两种系统对于VBScript脚本的支持不同,因此在使用脚本编程
    发表于 09-21 14:56 595次阅读

    嵌入式操作系统通用硬件抽象层设计

    层API能够在下层硬件平台上实现,那么操作系统和应用程序的代码就可以移植。图1 引入HAL后的嵌入式系统结构这样,原先嵌入式系统的3层结构逐
    发表于 12-07 10:30

    嵌入式操作系统怎么实现网络加载?

    在复杂的应用系统中通常都需要嵌入式操作系统的支持,这样嵌入式操作系统镜像文件的尺寸往往就会变得比较大。可以选择通过网络将嵌入式操作系统加载到
    发表于 03-18 08:20

    如何实现嵌入式操作系统网络加载?

    如何实现嵌入式操作系统网络加载?
    发表于 04-28 06:42

    Firefly通过网络远程挂载操作系统设计实现

    威廉希尔官方网站 方案是通过NFS(Network File System)网络文件系统从而实现了远程挂载操作系统。例如:用户可把系统文件集中放置在NFS
    发表于 04-07 16:08

    很小的ARM操作系统代码

    很小的ARM操作系统代码
    发表于 12-26 00:21 48次下载
    很小的ARM<b class='flag-5'>操作系统</b>源<b class='flag-5'>代码</b>

    简述几种实时多任务操作系统

    从整体上介绍VxWorks、pSOSystem、Hopen OS、Pencil、CMX、PTXC 几种实时操作系统(RTOS)及其特点, 有助于RTOS 选型。
    发表于 05-13 15:44 17次下载

    计算机网络网络操作系统

    理解网络操作系统的功能与作用,了解常用网络操作系统如WINDOWS操作系统、LINUX 操作系统
    发表于 08-05 17:50 3次下载

    操作系统网络计算机的启动研究

    介绍了一种基于集成的方法将多个单操作系统NC 的启动程序代码整合成一个多操作系统NC 启动环境的方法。文中着重介绍了单操作系统NC 的启动原理及多
    发表于 09-02 11:21 13次下载

    嵌入式操作系统通用硬件抽象层设计

    摘要 基于嵌入式操作系统硬件抽象层理论,设计一种用于嵌入式操作系统内核开发的通用硬件抽象层平台。通用硬件抽象层能够为嵌入式操作系统内核的设计
    发表于 03-29 15:16 1196次阅读
    嵌入式<b class='flag-5'>操作系统</b>的<b class='flag-5'>通用</b>硬件抽象层设计

    网络操作系统

    网络操作系统           
    发表于 12-17 11:50 727次阅读

    什么是网络操作系统(NOS)

    什么是网络操作系统(NOS) 网络操作系统(NOS)是网络的心脏和灵魂,是向网络计算机提供服务
    发表于 04-03 15:07 2925次阅读

    嵌入式实时操作系统pSOSystem系统

    This manual is part of a documentation set that describes pSOSystem, the modular, high-performance
    发表于 05-09 15:55 28次下载

    嵌入式操作系统网络加载实现

      在复杂的应用系统中通常都需要嵌入式操作系统的支持,这样嵌入式操作系统镜像文件的尺寸往往就会变得比较大。可以选择通过网络将嵌入式操作系统
    发表于 08-25 14:02 1264次阅读
    嵌入式<b class='flag-5'>操作系统</b>的<b class='flag-5'>网络</b>加载<b class='flag-5'>实现</b>

    一个简单实用的MCU程序框架(非操作系统,简单调度任务) - 总体介绍

    。实际上,在我的使用过程中发现,应用这类实时操作系统的场景其实非常小,更多的应用无需操作系统,要做的只有简单的几个事情。 在无操作系统的程序上,如果没有一个框架
    发表于 12-08 14:06 6次下载
    一个简单实用的MCU程序<b class='flag-5'>框架</b>(非<b class='flag-5'>操作系统</b>,简单调度任务) - 总体介绍