正文内容
Vxworks嵌入式操作系统下网络设备驱动程序设计
来源:漫步者
作者:开心麻花
2025-09-19
1

Vxworks嵌入式操作系统下网络设备驱动程序设计(精选6篇)

Vxworks嵌入式操作系统下网络设备驱动程序设计 第1篇

作者Email: cai_yang@etang.com

摘 要:本文主要介绍在Vxworks操作系统下网络设备驱动程序设计、调试方法以及将其加入系统内核的配置方法。

Vxworks嵌入式操作系统下网络设备驱动程序设计 第2篇

摘要:结合嵌入式实时操作系统VxWorks实现风洞测控系统的实际应用,以其中的串口通信为例,讨论了在VxWorks下实现串口通信的关键技术,给出了基本原理、环境配置和程序示例。

关键词:VxWorks;实时操作系统;嵌入式操作系统;串行通信

[Abstract] Combining with the application of wind tunnel measure and control system with embedded real-time operating system VxWorks , with the serial communication in it as an example ,the key techniques about realization of the serial communication in VxWorks are discussed. Communication mechanism, environment configure and corresponding program examples are provided.

[Key words] VxWorks;RTOS;embedded operating system; Serial Communication

1前言

目前市场上比较著名的实时操作系统有:VxWorks、PSOS、Nucleus、QNX、VRTX、Windows CE、Palm 0S、Lynx0S等。 其中,VxWorks是一个具有微内核、可裁剪的高性能强实时操作系统,在实时操作系统市场上处于领先地位。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、弹道制导、飞机导航等。在美国的 F-16战斗机、B-2 隐形轰炸机和爱国者导弹上,甚至火星探测器上都使用了VxWorks实时操作系统。在嵌入式实时操作系统中使用串口通信,不仅可扩展嵌入式设备通信能力,而且可扩大其应用范围。

2 VxWorks简介

VxWorks是由wRS(wind River Systems,Inc.)公司开发的一套具有微内核、高性能、可伸缩的实时操作系统,支持广泛的网络通信协议,并能够根据用户的需求进行组合,其开放式的结构和对工业标准的支持使开发者只需做最少的工作即可设计出有效的适合于不同用户要求的系统。除了性能出众的操作系统之外,wRS公司还提供了优秀的实时操作系统开发工具Tornado。Tornado由三个高度集成的部分组成:Tornado工具,一整套强有力的交叉开发工具;VxWorks运行系统,是运行在目标机上的高性能、可裁剪的实时操作系统;连接目标机和宿主机的通信选项,加以太网、串行线路、在线仿真等。Tornado能够支持Windows、Unix等流行的工作平台和PowerPC、X86、ARM等几乎所有的目标处理器,所提供的.工具可用于所有目标机,并具有两种调试模式(系统模式和任务模式)。除了基本的功能和开发工具外,Tornado还具有先进的系列网络产品,极大地扩展了Tornado的网络特性,并增强了嵌人式微处理器的网络特性。[1]

3 串口通信基本原理

串口在嵌入式系统当中是一类重要的数据通信接口,其本质功能是作为CPU和串行设备间的编码转换器。当数据从CPU经过串行端口发送出去时,字节数据转换为串行的位;在接收数据时,串行的位被转换为字节数据。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。

串口通信的优点是开发简单,在传输数据量不大、要求速度不高而传输距离较大的通信场合得到广泛应用。

在VxWorks中,将I/O系统设计成为任何类型的设备提供一个简单、统一、独立于设备的接口,任何对于串口的操作都可以视为对一个文件的操作,而不必了解串口设备或程序驱动实现的细节。在串口通信软件的设计中,当串口初始化完成后,在使用之前利用open打开相应串口,然后进行配置。

VxWorks提供终端和伪终端设备驱动。Tty驱动针对实终端;pty针对仿真终端的程序。Tty设备有两种操作模式:raw模式和line模式。在raw模式下,每个刚从设备输入的字符对读者都是有效的;在line模式下所有输入字符被存储,直到NEWLINE字符输入。设备选项字使用带FIOSETOPTIONS 功能的ioctl()程序来设置。[2]

配置完成后,依据串口打开时的读写标志,调用函数write()、read()对串口进行只读操作、只写操作或同时进行读写操作。

为提高数据接收的实时性,可采用中断方式,利用VxWorks提供的select函数的事件触发机制,将读串口的任务阻塞使其一直等待数据,当有数据来到的时候该任务会立刻自动响应,提高系统的实时性。

4环境配置

在本实时应用系统中采用486机作为目标机,串口通信时目标机VxWorks系统启动盘的制作步骤:

(1) 修改通用配置文件Tornadotargetconfigpc486config.h。在config.h文件中加入以下宏定义:

#define INCLUDE_WDB

#define INCLUDE_WDB_TTY_TEST

#undef WDB_COMM_TYPE

#define WDB_COMM_TYPE WDB_COMM_SERIAL /*定义通信方式为串口联结*/

#define WDB_TTY_CHANNEL 1 /*通道号*/

#define WDB_TTY_BAUD 9600 /*串口速率,可设置至38400*/

#define WDB_TTY_DEV_NAME “tyCo/1”

#define CONSOLE_TTY 0

#define DEFAULT_BOOT_LINE “fd=0,0(0,0)hostname:/fd0/vxWorks h=主机

ip e=目标机ip u=主机上的登录用户名”

(2) 在Tornado集成环境中执行菜单命令Project > Make PC486 > Common Targets > clean删除以前生成的文件,执行菜单命令Project > Make PC486 > Boot Rom Targets > bootrom_uncmp编译链接生成bootrom_uncmp ;再选择VxWorks Target,编译生成vxworks;

(3) 拷贝Tornadotargetconfigpc486bootrom_uncmp至Tornadohostbin下

(4) 重命名文件bootrom_uncmp为bootrom;

(5) 准备一张已格式化的空盘插入软驱;

(6) 在目录Tornadohostbin下执行命令 mkboot a: bootrom;

(7)拷贝Tornadotargetconfigpc486VxWorks至软盘;

(8) 将系统制作盘插入目标机软驱,加电启动目标机即载入VxWorkst系统。[3]

5程序示例

5.1 在程序中加入下列头文件

#include

#include “strLib.h”

#include

#include

#include

#include

#include

#include

#include “types/vxTypesOld.h”

5.2 打开串口

int open_com1(void) //打开串口1函数

{ int sfd;//串口设备文件描述符

sfd =open(”/tyCo/0”,0_RDWR,0);//打开串口并返回串口设备文件描述符

if(sfd ==ERROR) //如果不能打开串口1则打印出错信息

Vxworks嵌入式操作系统下网络设备驱动程序设计 第3篇

嵌入式系统被广泛运用到消费、汽车、电子、微控制、无线通信、数码产品、网络设备、安全系统等领域。越来越多的公司、研究单位、大专院校、以及个人开始进行嵌入式系统的研究,嵌入式系统设计将是未来相当长一段时间内研究的热点。

1 Linux设备驱动程序概述

嵌入式Linux以其可应用于多种硬件平台、内核高效稳定、源码开放、软件丰富、网络通信和文件管理机制完善等优良特性,成为嵌入式系统领域中的一个研究热点。嵌入式Linux系统中,内核提供保护机制,用户空间的进程一般不能直接访问硬件。进行嵌入式系统的开发,很大的工作量是为各种设备编写驱动程序,除非系统不使用操作系统。Linux设备驱动程序在Linux内核源代码中占有很大比例,从2.0、2.2到2.4版本的内核,源代码的长度日益增加,其实主要是设备驱动程序在增加。

设备驱动程序在Linux内核中占有极其重要的位置,它是内核用于完成对物理设备的控制操作的功能模块。除了CPU、内存以及其他很少的几个部分之外,所有的设备控制操作都必须由与被控设备相关的代码,也就是驱动程序来完成。内核必须包括与系统中的每个外部设备对应的驱动程序。否则设备就无法在Linux下正常工作。这就是驱动程序开发成为Linux内核开发的主要工作的原因。从内核源码的代码分布可以看出,设备驱动源码至少占据了一半的内核源码量,更能说明设备驱动程序对操作系统的意义和价值。

2 嵌入式Linux设备驱动程序开发

2.1 设备驱动程序工作原理

在Linux操作系统下有3类主要的设备文件类型:块设备、字符设备和网络设备。这种分类方法可以将控制不同输入/输出设备的驱动程序与其它操作系统软件分离开来。字符设备与块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般紧接着发生。块设备则不然,它利用一块系统内存作缓冲区,若用户进程对设备的请求能满足用户的要求,就返回请求的数据;否则,就调用请求函数来进行实际的I/O操作。网络设备可以通过BSD套接口访问数据。所有嵌入式Linux设备驱动程序都有一些共性,是编写所有类型的驱动程序都通用的,操作系统提供给驱动程序的支持也大致相同。这些特性包括:

(1)读/写

几乎所有设备都有输入和输出。每个驱动程序都要负责本设备的读/写操作,操作系统的其它部分不需要知道对设备的具体读/写操作是怎样进行的,这些都由驱动程序屏蔽掉了。操作系统定义好一些读/写接口,由驱动程序完成具体的功能。在驱动程序初始化时,需要把具有这种接口的读/写函数注册到操作系统。

(2)中断

中断在现代计算机结构中有重要的地位,操作系统必须提供驱动程序响应中断的能力。一般是把一个中断处理程序注册到系统中,操作系统在硬件中断发生后,调用驱动程序的处理程序。Linux支持中断的共享,即多个设备共享一个中断。

(3)时钟

在实现驱动程序时,很多地方会用到时钟,例如某些协议里的超时处理,没有中断机制的硬件的轮询等。操作系统应为驱动程序提供定时机制,一般是在预定的时间过了以后,回调注册的时钟函数。

嵌入式Linux系统驱动程序开发与普通Linux没有太多区别。嵌入式设备由于硬件种类非常丰富,在缺省的内核发布版中不可能包括所有驱动程序。可以在硬件生产厂家或者Intemet上寻找驱动程序,如果找不到,可以根据一个相近硬件的驱动程序来改写。实现一个嵌入式Linux设备驱动的大致流程如下:(1)定义主、次设备号,也可以动态获取;(2)实现驱动初始化和清除函数,如果驱动程序采用模块方式,则要实现模块初始化和清除函数;(3)设计所要实现的文件操作,定义file_operations结构;(4)实现所需的文件操作调用,如read、write等;(5)实现中断服务函数,并用request irq向内核注册;(6)将驱动编译到内核或编译成模块,用insmod命令加载;(7)生成设备节点文件。

与普通文件相比,设备文件的操作要复杂得多,不可能简单地通过read、write和llseek等来实现。所有其它类型的操作都可以通过VFS的ioctl调用来执行,为此,只需要在驱动程序中实现ioctl函数,并在其中添加相应的case即可。通过cmd区分操作,通过arg传递参数和结果。

2.2 设备驱动程序的开发流程

2.2.1 设备驱动接口

字符设备驱动接口中关键的file_operations结构:的定义如下:

2.2.2 注册和注销模块

2.2.2. 1 设备注册模块

2.2.2. 2 设备注销模块

2.2.3 基本入口点设备函数的具体实现

2.2.3. 1 设备读取模块

2.2.3. 2 设备写入模块

2.2.4 module_init和module_exit宏

3 设备驱动程序编译到内核的过程

把驱动程序编译进内核的步骤如下:

(1)把IOdriver.c复制到Linux-2.4.20-8/drivers/cha下,并修改该目录下的config.in文件,config.in是每个模块的配置脚本,在这个文件当中定义配置那些模块、怎样配置等,因此当添加了IO的配置后,会在内核配置时出现这个模块的配置选项。

(2)修改当前目录下的Makefile,在每个模块的Makefile中包括该模块所包含的子模块,在char device中,要包括IO设备,就要告诉Makefile编译IOdriver.c并包含编译出的IOdriver.c文件,这样最后内核做链接时,才会链接进这个模块。

(3)重新配置内核,选中IO模块执行命令mak menuconfig,进入内核配置菜单。

(4)重新编译内核,并更新嵌入式目标系统的内核。

(5)创建设备文件,重新启动嵌入式目标系统的Linux,进入目录/proc,查看devices文件,在devices文件列出了当前系统所有的字符设备和块设备,包括设备号和设备名称,在Character devices的最后移行的设备是:254 IOdriver,这说明IOdriver设备已经正确地加载到了内核。

(6)添加设备文件节点,执行如下命令,添加设备文件节点,在此创建的设备名称用于在应用程序中访问对应的设备。如果为字符设备,设备号类型用c表示,块设备则用b表示;主设备号就是/proc/devices中的IOdrive的设备号,由于该类设备只有一个,因此次设备号为0,如果还有该类型的其他设备,则一次为1、2、3等。

4 结束语

设备驱动程序是操作系统内核和机器硬件之间的接口。内核利用驱动程序的接口完成对设备的初始化和释放,在系统内核和硬件之间传送数据,并时刻检测和处理设备出现的错误。它是操作系统最基本的组成部分,因此熟悉驱动的编写是很重要的。

参考文献

[1]宋宝华.Linux设备驱动开发详解[M].北京:人民邮电出版社,2008.

[2]赵炯.Linux内核完全剖析--基于0.12内核[M].上海:机械工业出版社,2009.

[3]魏永明.Linux设备驱动程序[M].北京:中国电力出版社,2006.

[4]吴迪.嵌入式系统原理、设计与应用[M].北京:机械工业出版社,2004.

Vxworks嵌入式操作系统下网络设备驱动程序设计 第4篇

Vxworks嵌入式操作系统下网络设备驱动程序设计 第5篇

摘要:目前的嵌入式系统多使用FLASH作为主存,因此,如何有效管理FLASH上的数据非常重要。文章以MX29LV160BT芯片为例,讨论了在VxWorks操作系统下NorFlash上建立TFFS文件系统的一般步骤,从而为FLASH上的数据管理提供了理想的选择方式,同时也为开发者和用户升级程序提供了方便。

关键词:VxWorksFlashMTDTFFS文件系统

嵌入式系统正随着Internet的发展而在各个领域得到广泛的应用,作为一个优秀的操作系统,VxWorks实现了比其他实时操作系统更好的有效性、商用性、可裁减性以及互操作性,广泛应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。

如今越来越多的嵌入式操作系统中,通常都使用FLASH作为主存介质。许多开发者和用户为了方便以后升级用户程序,通常在FLASH上建立TFFS文件系统,建立文件系统后,我们就可以象在windows操作系统下对硬盘操作一样,进行数据的拷贝、删除以及文件的建立等操作。

NOR和NAND是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NORflash技术,彻底改变了原先有EPROM和EEPROM一统天下的局面。NOR的特点是芯片内执行XIPexecuteInPlace,这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,因此在嵌入式系统得到广泛的应用。

一、TFFS文件系统结构简介

Tornado的TrueFFS是和VxWorks兼容的一种M-SystemsFlite实现方式,版本为2.0。它为种类繁多的flash存储设备提供了统一的块设备接口,并且具有可重入、线程安全的特点,支持大多数流行的CPU构架。有了Tornado的TrueFFS,应用程序对flash存储设备的读写就好象它们对拥有MS-DOS文件系统的磁碟设备的操作一样。

如图1所示,TrueFFS由核心层(corelayer)和三个功能层,翻译层(translationlayer),MTD层(MTDlayer),socket层(socketlayer)组成。

核心层(Corelayer):核心层主要起相互连接其他几层的功能。同时它也可以进行碎片回收、定时器和其他系统资源的维护。通常WindRiver公司将这部分内容以二进制文件提供。

翻译层主要实现TrueFFS和dosFs之间的高级交互功能。它也包含了控制flash映射到块、wear-leveling、碎片回收和数据完整性所需的智能化处理功能。目前有三种不同的翻译层模块可供选择。选择哪一种层要看你所用的flash介质是采用NOR-based,还是NAND-based,或者SSFDC-based技术而定。

Socket层则是提供TrueFFS和板卡硬件(如flash卡)的接口服务。其名字来源于用户可以插入flash卡的物理插槽。用来向系统注册socket设备,检测设备拔插,硬件写保护等。后面将详细讲解它的.功能。

MTD层(MemoryTechnologyDrivers)功能主要是实现对具体的flash进行读、写、擦、ID识别等驱动,并设置与flash密切相关的一些参数。TrueFFS已经包含了支持Intel,AMD以及samsung部分flash芯片的MTD层驱动。新的芯片需要新的MTD支持,你可以使用一个标准的接口来加入这些驱动。

以上四部分,我们通常要的工作就是后两层。

当在VxWorks下配置TrueFFS时,你必须为每一层至少包含一个软件模块。后面我们将详细讨论。

二、MX29LV160BT芯片上建立TrueFFS文件系统

1、配置相关文件

在此,我以NorFlashMX29LV160BT为例,开发工具为Tornado2.2forPPC。要在VxWorks映像中包含TrueFFS文件系统,首先必须在config.h文件中定义INCLUDE_TFFS。这使得VxWorks的初始化代码调用tffsDrv来创建管理TrueFFS所需的结构和全局变量,并为所有挂接了的flash设备注册socket组件驱动。在链接的时候,通过解析与tffsDrv()相关联的符号(symbols)可以将TrueFFS所必需的软件模块链接到VxWorks映象中。

为了支持TrueFFS,每一个BSP目录下都必须包含一个sysTffs.c文件。它将TrueFFS所有的层(翻译层,socket层和MTD层)链接到一起并和VxWorks绑定。因此,我必须编辑这个文件并决定哪一种MTD和翻译层模块应该包含到TrueFFS中。即:

#defineINCLUDE_MTD_MX29LV/*MX29LV160BTMTDdriver*/

#defineINCLUDE_TL_FTL/*FTLtranslationlayer*/

#defineFLASH_BASE_ADRS0x2a10000/*Flashmemorybaseaddr

ess*/

#undefFLASH_SIZE

#defineFLASH_SIZE0x001f0000/*Flashmemorysize,2M(parameterblock)*/

其他无关的MTDdriver包含头都#undef掉,同时定义Flash在系统中的基地址和大小。另外,还必须编辑sysLib.c中的sysPhysMemDesc[]数组,将Flash基地址和大小加入到MMU中,以供将来访问Flash,否则访问Flash会失败。如果BSP目录下没有sysTffs.c文件,那么我们可以从其他BSP目录下拷贝一个即可,然后做上述修改,其他的内容基本可以不用修改。

接下来需要修改tffsConfig.c文件,为了方便管理,通常我们将src/drv/tffs/目录下该文件拷贝到我们BSP目录下,然后再做出修改。在MTDidentifyRoutinemtdTable[]表中加入如下语句:

#ifdefINCLUDE_MTD_MX29LV

mx29lvMTDIdentify,

#endif/*INCLUDE_MTD_MX29LV*/

并在该文件开头声明。

#ifdefINCLUDE_MTD_MX29LV

FLStatusmx29lvMTDIdentify(FLFlashvol);

#endif/*INCLUDE_MTD_MX29LV*/

最后就是将我们的flash相关MTD驱动加入到makefile中。即:

MACH_EXTRA=mx29lvMtd.o

为了方便我们调试MTD驱动,应该在重新编译VxWorks映象前将诸如格式化flash、创建TrueFFS块设备、绑定此块设备到dosFs所必要的功能包含到VxWorks映像中。比如如下定义:

#defineINCLUDE_TFFS

#ifdefINCLUDE_TFFS

#defineINCLUDE_TFFS_DOSFS

#defineINCLUDE_TFFS_SHOW

#defineINCLUDE_DOSFS/*dosFsfilesystem*/

#defineINCLUDE_SHOW_ROUTINES/*showroutinesforsystemfacilities*/

#defineINCLUDE_TL_FTL

#defineINCLUDE_IO_SYSTEM

#defineINCLUDE_DISK_UTIL

#endif/*INCLUDE_DOSFS*/

2、MTD驱动简介

做了上述配置后,进入VxWorks操作系统后,我们在shell上利用tffsShow工具来显示flash的信息。TffsShow函数最终会调用MTD驱动中的mx29lvMtdIdentiy()函数,在mx29lvMtdIdentiy()函数主要是通过读取MX29LV160BT芯片的设备和厂商ID来识别它,然后对FLFlash结构成员进行初始化,最主要的几个参数是:

type

Flash内存的JEDECID号。

erasableBlockSize

Flash内存的擦除块大小(字节)。设置这个值时应考虑到interleaving。因此,通常通过如下方法来设置它的大小。

Vol.erasableBlockSize=MX29LV_MTD_SECTOR_SIZE*vol.interleaving;

对于MX29LV160BT,MX29LV_MTD_SECTOR_SIZE为64K字节。

chipSize

使用来构建TrueFFS文件系统的flash实际大小(字节)。

noOfChips

使用来构建TrueFFS文件系统的flash实际片数。

interleaving

Flash内存交叉因子(interleavingfactor)。即扩展数据总线的设备数。比如,一个32位数据总线上,我们可以使用4片8位或2片16位的设备。

map

指向flash内存映射(map)函数。该函数将flash映射到内存区。

read

指向flash内存的读函数。在MTD驱动识别函数中,这个成员函数已经被初始化为缺省的读函数。通常情况下,我们不需要再初始化它,否则还需要修改很多相关的函数。

write

指向flash内存的写函数。这个成员必须初始化,这是我们要做的一个重要工作。

erase

指向flash内存的擦除函数。这个成员必须初始化,这也是我们要做的一个重要工作。

针对FLFlash结构成员,我们所关心的两个函数就是写和擦除函数。在mx29lvMtdIdentiy()函数中必须有如下定义:

vol.write=mx29lvWrite;

vol.erase=mx29lvErase;

在mx29lvWrite()函数中主要是实现将数据写到flash中。首先需要对扇区进行解锁,然后写入写命令,之后才能进行数据的写入。最后需要判断数据是否写完。为了确保操作成功,我们应该在写完每个数据后进行数据的比较,比较正确后方能进行下一个数据的操作。

在mx29lvErase()函数中主要是实现f

lash扇区的擦除。如今的flash一般都是按照扇区进行擦除操作的。在擦除操作之前也应该首先对扇区进行解锁,然后写擦除建立和扇区擦除命令。擦除成功后,flash中的内容应该是0xffff。所以为了确保成功,我们还是应该在擦除后进行比较,比较正确后方能进入下一个扇区的擦除操作,否则返回擦除错误标志。

所以,对于MTD驱动的调试,基本上就是调试写和擦除两个函数。在调试过程中,我们可以在这两个函数相应位置加入打印语句来调试。为了能调试这两个函数,我们通过在shell上输入命令tffsDevFormat来格式化flash,tffsDevFormat最终会调用mx29lvErase和mx29lvWrite函数,如果成功就会返回0,否则返回-1。当然也可以调用tffsDevCreate函数来验证我们的写和擦除函数的正确性。图2说明了tffsDevCreate调用过程。

在shell上利用tffsShow来验证mx29lvMtdIdentiy。

ètffsShow

0:socket=RFA:type=0x2249,unitSize=0x10000,mediaSize=0x1f0000

value=49=0x31=“1”

说明已正确识别到MX29LV160BT设备,设备号为0x2249。

三、建立TFFS设备

1、挂接设备名

MTD驱动调试成功后,我们就可以给flash设备挂接上dos设备名,如下操作:

格式化:

ètffsDevFormat

value=1

èusrTffsConfig0,0,”/tffs0”

value=0

然后通过devs来查看挂接的设备名。

èdevs

drvname

0/null

1/tyCo/0

1/tyCo/1

5host:

6/pty/rlogin.S

7/pty/rlogin.M

3/tffs0/

8/vio

value=25=0x19

看到/tffs0/说明挂接设备已经成功,接下来就可以利用dosFs文件系统相关命令来操作flash了。如,ls、copy等。

2、从Flash中启动并下载VxWorks映像

要从flash中下载VxWorks映像,首先需要把VxWorks映像拷贝到flash中,在shell中的操作命令为copy“VxWorks”,”/tffs0/VxWorks”,然后修改config.h文件中引导行,如下:

#defineDEFAULT_BOOT_LINE

“tffs=0,0(0,0)host:/tffs0/VxWorksh=192.168.0.153e=192.168.0.154u=targetpw=targeto=cpm”

修改完后,重新编译生成bootrom_uncmp.bin,并把它烧写到flash中(注意:该flash与上面建立TFFS文件系统的flash不一样,它并没有建立文件系统)。然后重新启动,即可看到如下启动画面:

bootdevice:tffs=0,0

unitnumber:0

processornumber:0

hostname&

nbsp;:host

filename:/tffs0/VxWorks

inetonethernet(e):192.168.0.154

hostinet(h):192.168.0.153

user(u):target

ftppassword(pw):target

flags(f):0x0

other(o):cpm

AttachingtoTFFS...done.

Loading/tffs0/VxWorks...894304

Startingat0x10000...

DevelopmentSystem

VxWorksversion5.5.1

KERNEL:WINDversion2.6

CopyrightWindRiverSystems,Inc.,1984-

CPU:MotorolaADS-PowerPC860.Processor#0.

MemorySize:0x1000000.BSPversion1.2/5.

WDBCommType:WDB_COMM_END

WDB:Ready.

到此,说明引导成功。flash整个TFFS文件系统就已经建立成功。

四、结论

VxWorks操作系统中支持TFFS文件系统,我们将VxWorks映像作为文件放到flash上,这就有利于开发者和用户更新应用程序而不需要影响bootrom,直接更新VxWorks映像或者将应用程序直接copy到flash中,然后装载到RAM中运行。

参考文献

Vxworks嵌入式操作系统下网络设备驱动程序设计 第6篇

Linux为是一个成熟而稳定的操作系统。将Linux植入嵌入式设备具有众多的优点,包括可剪裁和容易移植等,所以Linux操作系统在嵌入式领域获得了广泛的应用。嵌入式Linux一直是嵌入式领域的研究热点,与PC架构不同,嵌入式系统的硬件具有多样性和差异性,嵌入式系统的开发需要对特定系统进行硬件设计,同时还要针对这些硬件来编写驱动程序。Linux内核就是通过驱动程序来同外围设备打交道的,系统设计人员必须为每个设备编写驱动程序,否则设备无法在操作系统下正常工作。设备驱动程序设计的基本概念与模型

设备驱动程序是操作系统内核与机器硬件之间的接口,它为应用程序屏蔽了硬件的细节,在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作,设计驱动程序是内核的一部分,可以实现以下功能:

对设备初始化和释放;

把数据从内核传送到硬件,以及从硬件读取数据;

读取应用程序传送给设备文件的数据,以及回送应用程序请求的数据;

检测和处理设备出现的错误。

前面已经提到驱动程序的作用,而编写驱动程序就是构造一系列可供应用程序调动的函数(包括open、release、read、write、llseek、ioctl等)。在用户自己的驱动程序中,首先要根据驱动程序的功能,实现file_operations结构中的函数,不需要的函数接口可以直接在file_operations结构中初始化为NULL;file_operations变量会在驱动程序初始化时注册到系统内部。当操作系统对设备操作时,会调用驱动程序注册的file_operations结构中的函数指针。

以下是嵌入式linux2.4设备驱动程序的最简模型。

具体实现前面定义的函数时,需注意下面几点:

1)在test_init函数中要通过调用register_chrdev()函数来向内核注册字符设备驱动程序。如果是块设备,则还需调用mmmap()进行地址空间的映射,再调用register_blkdev()函数来向内核注册块设备驱动程序,在Linux系统中,对中断的处理是属于系统核心部分,因而如果设备与系统之间以中断方式进行数据交换,则必须把该设备的驱动程序作为系统核心的一部分,也就是说设备驱动程序要通过调用request_irq()函数来申请中断,通过free_irq()函数来释放中断(在test_cleanup中实现)。

2)open()函数和release()函数的具体实现有着一定的对应性,在open()函数中主要是执行打开设备时的一些初始化代码,如果该驱动程序需要管理多个设备,那么还要获取从设备号,根据从设备号来判断需要操作的设备,其中,从设备号可通过调用函数MINOR(inode->i_rdev)来获得,然后再调用宏MOD_INC_USE_COUNT来使得驱动程序使用计数器加1,而在release()函数中则要进行相反的处理。即调用宏MOD_DEC_USE_COUNT来减小驱动程序使用计数器。

3)归根到底,驱动函数的实现就是调用内核所支持的函数(包括内核提供的API和用户自己定义的寄存器操作函数)来完成对设备的操作,虽然嵌入式系统设备的种类众多,不同设备操作的具体实现方法不可能相同,但是Linux操作系统提供了一系列特殊API,为开发内核驱动程序带来了很大的方便,调用这些API时需要注意的是:通常情况下,应用程序是通过内核接口访问驱动程序的(这是驱动程序的主要使用方式),因此驱动程序需要与应用程序交换数据,但是操作系统内核和驱动程序在内核空间中运行,而用户程序在用户空间中运行,用户程序不能访问内核空间,操作系统内核和驱动程序也不能使用指针或memcpy()等常规的C库函与用户空间传输数据,造成这种状况的主要原因是linux操作系统使用了虚拟内存机制,使用了虚拟内存机制后,用户空间的内存可能被换出,当内核使用用户空间指针时,对应的页面可能已经不在内存中了,因此在使用调用函数时要注意:设备驱动程序在申请和释放内存时不是调用malloc()和free(),而调用kmalloc()和kfree();用于内核空间与用户空间进行数据拷贝的函数主要有access_ok()(检查某内存空间是否有权访问),copy_to_user()和put_usr()(内核函数向用户空间传输数据),copy_from_user()和get_user()(用户空间向内核空间传输数据);关于内核空间与I/O空间的数据交换,不同体系结构的处理器对I/O的处理方式也不同,x86系列处理器中,I/O与内存完成不同,它是分开编址的,访问它要使用专用的指令;而对ARM体系结构的处理器来说,则是不区分I/O和内存,统一编址的,可以使用同样的指令访问,在驱动程序中可以使用一系列函数来访问I/O口,如outb()、outw()、outl()inb()、inw()、inl()、outsb()、outsw()、outsl()、insb()、insw()和insl()等。

Linux2.6与2.4内核驱动程序的区别

为了彻底防止对正在被使用的内核模块进行错误操作,linux2.6内核在加载和导出内核模块方面都较2.4内核有所改进,避免了用户执行将导致系统崩溃的操作(例如强制删除模块等)。同时,当驱动程序需要在多个文件中包含 头文件时,不必定义宏来检查内核的版本。与2.4内核相比,2.6内核在可扩展性、吞吐率等方面有较大提升,其新特性主要包括:使用了新的调度器算法;内核抢占功能显著地降低了用户交互式应用程序;多媒体应用程序等类似应用程序的延迟;改进了线程模型以及对NPTL的支持,显著改善了虚拟内存在一定成程度负载下的性能;能够支持更多的文件系统;引进了内存池技术;支持更多的系统设备,在2.4内核中有约束大型系统的限制,其支持的每一类设备的最大数量为256,而2.6内核则彻底打破了这些限制,可以支持4095种主要的设备类型,且每个单独的类型又可以支持超过一百万个的子设备;支持反向映射机制(reverse mapping),内存管理器为每一个物理页建立一个链表,包含指向当前映射页中每个进程的页表条目的指针。该链表叫PTE链,它极大的提高了找到那些映射某个页的进程的速度。

Linux操作系统的设备驱动程序是在内核空间运行的程序,其中涉及很多内核的操作,随着Linux内核版本的升级,驱动程序的开发必然也要作出相应的修改,总之,在linux2.6内核上编写设备驱动程序时具体要注意以下几个方面:

1)Linux2.6内核驱动程序必须由MODULE_LICENSE(“Dual BSD/GPL”)语句来定义许可证,而不能再用2.4内核的MODULE_LICENSE(“GPL”)。否则,在编译时会出现警告提示。

2)Linux2.6内核驱动程序可以用int try_module_get(&module)来加载模块,用module_put()函数来卸载模块,而以前2.4内核使用的宏MOD_INC_USE_COUNT和MOD_DEC_USE_COUNT则可不用。

3)前面给出的字符型设备驱动程序模型中结构体file_operations的定义要采用下面的形式。这是因为在Linux内核中对结构体的定义形式发生了变化,不再支持原来的定义形式。

4)就字符型设备而言,test_open()函数中向内核注册设备的调用函数register_chrdev()可以升级为int register_chrdev_region(dev_t from,unsigned count,char * name),如果要动态申请主设备号可调用函数int alloc_chrdev_region(dev_t * dev,unsigned baseminor,unsigned count,char * name)来完成;原来的注册函数还可以用,只是不能注册设备号大于256的设备,同理,对于块设备和网络设备的注册函数也有着相对应的代替函数。

5)在声明驱动程序是否要导出符号表方面有着很大的变化。当驱动程序模块装入内核后,它所导出的任何符号都会变成公共符合表的一部分,在/proc/ksyms中可以看到这些新增加的符号。通常情况之下,模块只需实现自己的功能,不必导出任何符号,然而,如果有其他模块需要使用模块导出的符号时,就必须导出符号,只有显示的导出符号才能被其他模块使用,Linux2.6内核中默认不导出所有的符号,不必使用EXPORT_NO_SYMBOLS宏来定义;而在2.4内核中恰恰相反,它默认导出所有的符号,除非使用EXPORT_NO_SYMBOLS,因此在上面给出的范例中可以省略去该定义语句。

6)Linx内核统一了很多设备类型,同时也支持更大的系统和更多的设备,原来Linux2.4内核中的变量kdev_t已经被废除不可用,取而代之的是dev_t。它拓展到了32位,其中包括12位主设备号和20位次设备号。调用函数为unsigned int iminor(struct inode * inode)和unsigned int imajor(struct inode * inode),而不再用Linux2.4版本中的int MAJOR(kdev_t dev)和int MINOR(kdev_t dev)。

所有的内存分配函数不再包含在头文件 中,而是包含在 中,而原来的 已经不存在。所以当在驱动程序中要用到函数kmalloc()或kfree()等内存分配函数时,就必须要定义头文件 而不是。同时,前面提到的申请内存和释放内存函数的具体参数也有了一定的改变,包括:分配标志GFP_BUFFER被取消,取而代之的是GFP_NOIO和GFP_NOFS;新增了_GFP_REPEAT、_GFP_NOFAIL和_GFP_NORETRY分配标志等,使得内存操作更加方便。

8)因为内核中有些地方的内存分配是不允许失败的,所以为了确保这种情况下得成功分配,linux2.6版本内核中开发了一种称为“内存池”的抽象。内存池其实相当于后备的高速缓存,以便在紧急状态下使用。要使用内存池的处理函数时,必须包含头文件。内存池处理函数主要有以下几个:mempool_t *mempool_create()、void*mempool_alloc()、void mempool_free()、int mempool_resize();

另外值得一提的是:2.6内核为了区别以.o为扩展名的常规对象文件,将内核模块的扩展名改为.ko,所以驱动程序最后是被编译为ko后缀的可加载模块,在应用程序中加载驱动程序模块时要注意。结语

相关文章
创新公共服务范文

创新公共服务范文

创新公共服务范文(精选12篇)创新公共服务 第1篇科学技术是第一生产力,科技公共服务平台对国家或区域的技术创新具有巨大的推动作用。科技...

3
2025-10-24
匆匆中学生读后有感

匆匆中学生读后有感

匆匆中学生读后有感(精选9篇)匆匆中学生读后有感 第1篇匆匆读后感500字_读《匆匆》有感当细细地品读完一本名著后,大家心中一定有不少感...

1
2025-10-24
草莓教学范文

草莓教学范文

草莓教学范文(精选17篇)草莓教学 第1篇“风儿轻轻吹,彩蝶翩翩飞,有位小姑娘上山摘草莓,一串串哟红草莓,好像……”优美的歌词,动听...

3
2025-10-24
仓储类课程范文

仓储类课程范文

仓储类课程范文(精选7篇)仓储类课程 第1篇物流产业是复合型产业,发达的物流能加速传统运输、仓储和零售等行业向现代物流服务领域延伸。...

1
2025-10-24
创造性批评:解说与解读

创造性批评:解说与解读

创造性批评:解说与解读(精选8篇)创造性批评:解说与解读 第1篇创造性批评:解说与解读作为诗性文化重要组成部分的审美批评,同文学艺术实践...

1
2025-10-24
初二地理试卷分析

初二地理试卷分析

初二地理试卷分析(精选6篇)初二地理试卷分析 第1篇莲山 课件 w ww.5 YK J.COM 4 初二地理试卷分析二、试题所体现的新课程理念和...

2
2025-10-24
常州市河海中学文明班小结

常州市河海中学文明班小结

常州市河海中学文明班小结(精选2篇)常州市河海中学文明班小结 第1篇常州市河海中学2008~2009学年第一学期 八(1)班创 文 明 班 ...

2
2025-10-24
财务负责人身份证明

财务负责人身份证明

财务负责人身份证明(精选14篇)财务负责人身份证明 第1篇财务负责人身份证明及签字样本兹证明为我公司财务负责人。特此证明。身份证复印...

1
2025-10-24
付费阅读
确认删除?
回到顶部