新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于BM3803MG与VxWorks的BSP的设计实现

基于BM3803MG与VxWorks的BSP的设计实现

作者: 时间:2016-02-22 来源:网络 收藏

  (2)数据包接收

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

  KSZ8851-16mll 软件驱动以中断方式接收数据包,当操作系统接收到中断时,会调用中断向量表的中断服务程序处理网卡中断(包括对错误的检查和状态的改变),中断服务程序把从网卡的接收缓存传输到系统缓存的所有费时工作都放在任务层里完成。KSZ8851-16mll接收包的具体流程如图3所示。

    

 

  (3)数据包发送

  上层应用程序调用KSZ8851-16mll的发送程序实现通过以太网控制器传送连续的数据块,如图4所示。数据包的发送主要是依靠KSZ8851-16mll中的发送数据缓存区,软件驱动将发送数据写入发送数据缓冲区。当网卡芯片检测到处理器发来的数据发送信号后,将写入发送缓冲区的数据包处理成Ethernet数据包的形式进行发送。如果以太网控制器传输数据时出现错误,用户可以决定重新发送该帧数据还是丢弃该帧数据。

    

 

  2.4 END网络驱动程序

  网络设备发送和接收数据包一般有中断和轮询两种方式,本文采用中断方式。

  2.4.1 END驱动程序中的基本数据结构

  END_0BJ:END_0BJ中定义所有网络相关的部分,提供一个独立于设备的数据结构,在这个数据结构中包含了设备名称、设备编号、设备描述以及设备指针等与设备相关的基本信息。这些信息只是提供设备的一个描述,不包含控制信息[5]。

  2.4.2 END驱动程序的函数实现

  在END驱动程序中,需要实现设备的加载、卸载、控制、发送和接收、设备启动和停止、轮询发送和接收等功能函数。下面给出几个重要功能函数的实现:

  (1)加载网络设备函数KS8851EndLoad():是KSZ8851-

  16mll驱动程序的初始化入口点。KS8851EndLoad()中执行几个必要操作:初始化END_OBJ结构、初始化网络缓冲内存、初始化MIB、设置网络准备好标志。

  (2)启动设备函数KS8851Start():其作用是使设备处于活动状态和注册中断服务程序。函数实现如下:

  STATUS KS8851Start(DRV_CTRL * pDrvCtrl)

  {

  /*驱动程序的中断服务程序和设备中断连接*/

  intConnect((VOIDFUNCPTR *)IVEC_EXTINT0,

  (VOIDFUNCPTR)ks8851EndInt, (int)pDrvCtrl);

  /*打开中断设备*/

  (* ks8851IntEnable) (INUM_TO_LVL(pDrvCtrl->ilevel));

  }

  其中,intConnect()函数实现注册驱动程序的中断服务程序,KS8851IntEnable是对CPU与网卡相连的中断进行使能。

  (3) 发送数据包函数KS8851EndSend():获得发送器的使用权、查询发送缓冲区、启动设备发送数据、统计MIB的错误数和释放已经发送的数据包 [6]。当要发送数据包时,上层应用程序将要发送的数据包写入协议层的缓冲区中交由协议层进行处理,经协议层处理的包含了协议层附加信息的数据包将被发送给MUX层的接口函数muxSend( ),再由KS8851EndSend()函数写入缓冲由网卡发送出去。

  (4)接收数据包函数 KS8851reveive( ):当接收一个数据包时会触发一个中断,网卡的中断服务程序(KS8851EndInt( ))将通过调用netJobAdd( )向任务队列注册一个网络任务,此网络任务为数据包接收函数(KS8851reveive( )),负责接收数据包。KS8851reveive( )由tNettask来调用。接收到的数据包由MUX的接口函数muxReveive调用协议层的接口函数stackRcvRtn传递到协议层,最终数据到达应用层的缓冲区中。应用层程序通过read( )函数对其读取。数据包经过物理层到达数据链路层,然后通过MUX 层到达网络层,再通过TCP/IP 协议层到达应用层,即完成了数据包接收的全过程[7]。

  3 向BSP中添加驱动程序

  已经编写好的网卡驱动程序加入BSP中需要以下几步:

  (1)修改sysLib.c:

  使能外部中断0,并设置中断触发方式为边沿触发。

  (2)在config.h中添加如下语句:

  #define INCLUDE_END

  #define INCLUDE_KS8851_END

  (3)在configNet.h中添加新的装载函数:

  END_TBL_ENTRY endDevTbl [] =

  {

  .....

  #ifdef INCLUDE_KS_8851_END

  {0,KS8851_LOAD_FUNC, KS8851_LOAD_STRING,

  KS8851_BUFF_LOAN,NULL, FALSE},

  #endif

  .....

  };

  通过以上步骤,驱动程序已经添加到BSP中,编译后生成所需要的带有KSZ8851-16mll驱动的_rom镜像文件,下载到开发板里,实现开发板与主机间的网络通信。

  4 基于ROM的镜像下载流程

  网卡的驱动程序完成之后,需对驱动程序进行测试,查出驱动程序潜在的缺陷以及验证驱动功能是否完善。测试环境如图5所示。

    

 

  本文使用专用烧写软件烧写_rom镜像的过程如下:(1)把生成VxWorks_rom镜像转换成存储器镜像 VxWorks_rom.bin;(2)运行的专用烧写软件,使用Flash映像生成功能,在VxWorks_rom的工程目录下,自动生成flash_content.bin、program_flash_in_ram.exe和program_flash_in_ram.bin。其中,flash_content.bin为待引导VxWorks_rom.bin的flash映像,program_flash_in_ram.exe为烧写flash_content.bin的烧写程序,program_flash_in_ram.bin为此烧写程序的RAM映像;(3)将 program_flash_in_ram.bin烧写到Flash中后,即完成了VxWorks_rom镜像下载到目标板的任务。

  BSP程序的开发与单纯的应用软件不同,BSP程序在开发过程中会遇到很多硬件的问题,如时序匹配和信号完整性问题等。因此,在开发BSP之前,需尽量熟悉嵌入式系统的硬件以及硬件的初始化、寄存器访问方式以及硬件的时序等,并完成相关的调试工作,为开发BSP打好基础[5]。

  本文实现了VxWorks下基于的KSZ8851以太网BSP,满足了空间应用项目的嵌入式控制系统的高可靠、实时数据处理的需求,为空间高可靠控制系统提供了一种解决方案。


上一页 1 2 下一页

关键词: BM3803MG VxWorks

评论


相关推荐

技术专区

关闭