小硕vxworks网络驱动开发笔记.docx
《小硕vxworks网络驱动开发笔记.docx》由会员分享,可在线阅读,更多相关《小硕vxworks网络驱动开发笔记.docx(57页珍藏版)》请在冰豆网上搜索。
![小硕vxworks网络驱动开发笔记.docx](https://file1.bdocx.com/fileroot1/2023-2/1/ac06f6a7-f4a6-4aa9-947e-6ca91896fdfc/ac06f6a7-f4a6-4aa9-947e-6ca91896fdfc1.gif)
小硕vxworks网络驱动开发笔记
前言
在通信,电子领域,目前主流的嵌入式操作系统为linux和vxworks。
Linux多用于消费电子产品,像大家熟悉的andriod,原始系统就是linux,也就是说andriod也是一种linux系统。
还有大家熟悉的MP3,也是使用linux操作系统的。
Linux因为价格便宜(开源的,不需要付licence),稳定性好占据了一定的市场份额。
Vxworks是风河系统1983开发的一款嵌入式实时操作系统,多用于通信,导航,航天等领域。
因为这些领域对实时性要求非常高,比如现在LTE系统就是使用vxworks系统,因为是采用TDD模式,而这种模式,显然对实时性要求非常高。
也就注定了vxwroks在这些领域的特有优势。
选择linux还是vxworks看自己的专业方向,还有自己的兴趣所有。
每个领域只要研究透彻,都是很有前途的。
既然两者都是主流的嵌入式操作系统,其还是有很多相似性。
小编也初步接触过linux,发现具备一定的linux基础对日后深入学习vxworks很有好处,很多思想都是相似的。
另外,本人系小硕,目前的研究领域是vxworks驱动开发,主攻网络驱动开发。
在平常的日常学习中,结合各位网友提供的资料(自己在XX上收集的),还有workbench提供的document(自己翻译,特别是针对网络驱动部分),希望对广大嵌入式驱动开发者有所帮助。
声明:
此文档并不适合于vxworks初学者,因为这里,小编省去了很多vxworks下的基本知识,包括核中常用的进程,信号量等等支持。
也没有提及集成开发环境tornado/vworkbench.这里的探索重点是vxwroks底层的东西,包括启动过程,BSP开发等。
附录:
Vxworks的应用领域
嵌入式Vxworks系统的主要应用领域主要有以下几方面:
1.数据网络:
如:
以太网交换机、路由器、远程接入服务器等2.远程通讯:
如:
电信用的专用分组交换机和自动呼叫分配器,蜂窝系统等3.医疗设备:
如:
放射理疗设备4.消费电子:
如:
个人数字助理等5.交通运输:
如:
导航系统、高速火车控制系统等6.工业:
如:
机器人7.航空航天:
如:
卫星跟踪系统8.多媒体:
如:
电视会议设备9.计算机外围设备:
如:
X终端、I/O系统等总之,VxWorks的系统结构是一个相当小的微核的层次结构。
核仅提供多任务环境、进程间通信和同步功能。
这些功能模块足够支持VxWorks在较高层次所提供的丰富的性能的要求。
第1章操作系统基本概念
1.1实时操作系统和分时操作系统的区别
从操作系统能否满足实时性要求来区分,可把操作系统分成分时操作系统和实时操作系统。
分时操作系统按照相等的时间片调度进程轮流运行,分时操作系统由调度程序自动计算进程的优先级,而不是由用户控制进程的优先级。
这样的系统无法实时响应外部异步事件。
实时操作系统能够在限定的时间执行完所规定的功能,并能在限定的时间对外部的异步事件作出响应。
分时系统主要应用于科学计算和一般实时性要求不高的场合。
实时性系统主要应用于过程控制、数据采集、通信、多媒体信息处理等对时间敏感的场合。
1.2嵌入式操作系统VxWorks简介
VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。
良好的持续发展能力、高性能的核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。
它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。
在美国的F-16、FA-18战斗机、B-2隐形轰炸机和爱国者导弹上,甚至连1997年4月在火星表面登陆的火星探测器上也使用到了VxWorks。
ØVxWorks操作系统是一个嵌入式实时操作系统(RTOS)。
ØVxWorks与其它实时OS一样,基于以下两个重要机制:
Ø多任务环境及任务间通信。
Ø硬件中断处理。
ØVxWorks多任务核完成的功能是:
实时调度,任务间通信及互斥。
Ø其它功能则作为系统库围绕在核周围,它们可根据需要进行剪裁。
ØVxWorks与非实时系统的不同之处在于:
ØVxWorks的优先抢占机制基于调度,
ØVxWorks对外部事件的反应和处理快,
ØVxWorks容量小并且可配置(微核结构)
1.3VxWorks的特点
1.3.1可靠性
操作系统的用户希望在一个工作稳定,可以信赖的环境中工作,所以操作系统的可靠性是用户首先要考虑的问题。
而稳定、可靠一直是VxWorks的一个突出优点。
自从对中国的销售解禁以来,VxWorks以其良好的可靠性在中国赢得了越来越多的用户。
1.3.2实时性
实时性是指能够在限定时间执行完规定的功能并对外部的异步事件作出响应的能力。
实时性的强弱是以完成规定功能和作出响应时间的长短来衡量的。
VxWorks的实时性做得非常好,其系统本身的开销很小,进程调度、进程间通信、中断处理等系统公用程序精练而有效,它们造成的延迟很短。
VxWorks提供的多任务机制中对任务的控制采用了优先级抢占(PreemptivePriorityScheduling)和轮转调度(Round-RobinScheduling)机制,也充分保证了可靠的实时性,使同样的硬件配置能满足更强的实时性要求,为应用的开发留下更大的余地。
1.3.3可裁减性
用户在使用操作系统时,并不是操作系统中的每一个部件都要用到。
例如图形显示、文件系统以及一些设备驱动在某些嵌入系统中往往并不使用。
VxWorks由一个体积很小的核及一些可以根据需要进行定制的系统模块组成。
VxWorks核最小为8kB,即便加上其它必要模块,所占用的空间也很小,且不失其实时、多任务的系统特征。
由于它的高度灵活性,用户可以很容易地对这一操作系统进行定制或作适当开发,来满足自己的实际应用需要。
1.3.4对一个实时核的要求
一个实时操作系统核需满足许多特定的实时环境所提出的基本要求,这些包括:
多任务:
由于真实世界的事件的异步性,能够运行许多并发进程或任务是很重要的。
多任务提供了一个较好的对真实世界的匹配,因为它允许对应于许多外部事件的多线程执行。
系统核分配CPU给这些任务来获得并发性。
抢占调度:
真实世界的事件具有继承的优先级,在分配CPU的时候要注意到这些优先级。
基于优先级的抢占调度,任务都被指定了优先级,在能够执行的任务(没有被挂起或正在等待资源)中,优先级最高的任务被分配CPU资源。
换句话说,当一个高优先级的任务变为可执行态,它会立即抢占当前正在运行的较低优先级的任务。
任务间的通讯与同步:
在一个实时系统中,可能有许多任务作为一个应用的一部分执行。
系统必须提供这些任务间的快速且功能强大的通信机制。
核也要提供为了有效地共享不可抢占的资源或临界区所需的同步机制。
任务与中断之间的通信:
尽管真实世界的事件通常作为中断方式到来,但为了提供有效的排队、优先化和减少中断延时,我们通常希望在任务级处理相应的工作。
所以需要杂任务级和中断级之间存在通信。
1.4VxWorks的整体构架
VxWorks支持多种处理器,对硬件不做假设,可支持ARM.PPC,MPIS架构处理器。
第2章vxWorks驱动开发预备
BSP定义:
Boardsupportpacket,为各种目标板的硬件功能提供了统一的软件接口
它们包括:
Ø硬件初始化
Ø中断处理和产生
Ø硬件时钟和定时器管理
Ø存映射和分配
BSP还包括bootRom和其它启动机制,sysLib和sysALib库是VxWorks可移植的核心,BSP库是硬件与软件的接口,处理硬件的初始化、中断处理与产生、硬件时钟与定时管理、局部和总线存空间的映射、存大小定义,等等
2.1VxWorks映像
用户通过定制VxWorks组件和进行应用程序开发所生成映像
包括wind多任务微核,也包括BSP的引导代码
☐Vxworks映像的三部分组成
◆BSS段(BlockStartedbySymbol,未手动初始化的数据)
◆代码段
◆数据段
☐两大类
ØBootRom类型映像
ØVxWorks类型
BootRom类型映像
最小化、专用的VxWorks引导映像,实现最少的系统初始化用于启动装载VxWorks映像,功能类似于PC机的BIOS。
BootRom运行时建立起多任务环境usrRoot任务、网络任务(tNettask)、TFFS任务和FTP任务等。
运行地点可能在ROM/Flash中执行(例如ROM驻留型引导映像),也可能在RAM中执行。
在系统中其对应的编译规则文件是rules.bsp
BootRom类型分为三种
BootRom_res一直运行在rom中的映象,只把data段拷贝到ram里面。
BootRom_uncmp非压缩方式的映象,data段和text段都要拷贝到ram里面,并在ram里面运行。
BootRom
压缩方式的映象,生成的时候编译器会把除掉romlnit.s和bootInit.c之外的目标文件压缩并“汇编”成一个bootrom.Z.s,最后和romInit.o,bootInit.o,version.o进行,生成bootrom映像。
要全部拷贝到ram中,并必须要进行解压缩的工作。
而这些工作基本上都是在bootInit.c中进行的。
VxWorks类型映像
系统的主映像,是系统最终要运行的映像该映像在运行时至少有一部分(如:
数据段和BSS段)需要在RAM中运行。
在系统中其对应的编译规则文件是rules.vxWorks
Vxworks类型映像运行环境
RAM运行的压缩的
ROM运行的非压缩的
VxWorks类型四种映像
●VxWorks:
RAM运行的VxWorks映像不包含引导程序,需要独立的引导程序从本地存储器或者经由网络获取该映像,然后将其下载到RAM中的RAM_LOW_LADRS处运行
◆VxWorks_romROM自动RAM运行的VxWorks映像,不需要BootRom辅助
◆VxWorks_romResidentROM启动ROM运行的VxWorks映像,不需要BootRom辅助。
包含引导代码,在重启时清空RAM,引导代码只将data段拷贝到RAM中的RAM_LOW_ADRS处,系统的运行是在ROM中进行的,启动速度快,需要的RAM空间少,但是运行速度慢。
◆VxWorks_romCompressVxWorks_rom的压缩形式
VxWorks型vsBootROM型映像
对于没有自启动功能的VxWorks类型映像(如VxWorks型),映像运行前需一段程序将该映像拷贝到RAM中运行,BootRom类型映像完成VxWorks系统下载,完毕后BootRom的任务就结束了
二者在系统初始化的时候,所做的功能基本相同,BootRom类型映像调用bootConfig.c,而VxWorks类型映像调用usrConfig.c
映像方式
可被静态或动态
VxWorks在开发阶段可动态地下载目标文件,并与操作系统及其它目标文件动态。
以后是浮动的,只在装载时才与绝对物理地址相对应。
静态VxWorks成品阶段是采用静态的。
要对系统底层驱动清楚,也就是对CPU及相关的硬件有所了解.主要是32微处理器(上电启动过程,downloadimage的方式方法,读写ROM,地址空间分配,MMU,寄存器,中断定义,..).参照硬件资料,多读一些源码会有所帮助.
Tornado2开发调试环境协议框图
主机开发(HostDevelopmentSystem)
目标机(TargetSystem)
Tornado工具
WTX协议通信<==========>
Editor
Project
Shell
Debugger
Browser
Windview
TargetServer
|
TargetAgent
VxWorksTargetSimulator
WDB协议通信
<==========>
Application
VxWorksOS
VxWorksTarget(WDB)Agent
两个主要两个协议
WTX协议(WindRiverTooleXchange):
用于开发机部Tornado工具与TargetServer之间通信.
WDB协议(WindDeBug):
用于主机TargetServer与目标机之间的通信.
2.2BSP主要文件目录的组成及作用:
Install_direction/target/config/All:
这个目录下的文件是所有BSP文件共享的,不是特别需要不要更改里面的任何文件.
configAll.h:
缺省定义了所有VxWorks的设置.如果不用缺省的设置,可在BSP目录下的config.h文件中用#define或#undef方式来更改设置.
bootInit.c:
在romInit.s后,完成BootROM的第二步初始化.程序从romInit.s中的romInit()跳到这个文件中的romStart().来执行必要的解压和ROMimage的放置.
bootConfig.c:
完成BootROMimage的初始化和控制.
usrConfig.c:
VxWorksimage的初始化代码.
Install/target/config/comps/src:
涉及系统核心的components,主要由target/config/All中usrConfig.c中函数调用.
intasll/target/config/bspname:
包含系统或硬件相关的BSP文件.
Makefile
一些命令行控制images的生成,参见BSP设置部分及生成下载
README
BSP发布纪录,版本,总的文档
config.h
包括所有涉及CPU主板的设置及定义(includes,definations),参见BSP设置文件及生成下载
configNet.h
网络驱动的主要设置文件,主要对END驱动设置.
romInit.s
汇编语言文件,是VxWorksBootROM和ROMbasedimage的入口,参见系统启动部分
sysALib.s
汇编语言文件,程序员可以把自己的汇编函数放在这个文件里,在上层调用.VxWorksimage的入口点_sysInit在这个文件里,是在RAM中执行的第一个函数。
sysLib.c
包含一些系统相关的函数例程,提供了一个board-level的接口,VxWorks和应用程序可以以system-indepent的方式生成.这个文件还能包含目录target/config/comps/src的驱动.
sysScsi.c
可选文件用于Scsi设备设置和初始化.
sysSerial.c
可选文件用于所有的串口设置和初始化.
bootrom.hex
ASIC文件包含VxWorksBootROM代码
VxWorks
运行在目标机上,完整的,连结后的VxWorks二进制文件.
VxWorks.sym
完全的,连结后带有符号表的VxWorks二进制文件
VxWorks.st
完全的,连结后,standalone,带有符号表的VxWorks二进制文件
BSP用"make"来编译连接生成(Created),而不是用Tornado的工具.
BSP和应用程序都可以在"make"或"tornade"上开发(developed)。
BSP被设置包括以下驱动:
✧中断控制interruptcontroller
✧计时器timer(sys/aux)
✧串口UART(serial)
✧显示屏LCD
✧键盘Keyboard(opt)
✧触摸屏touch-screen(opt).
2.3系统启动顺序
VxWorksimage
分为在ROM中运行和在RAM中运行两种.两者启动顺序的区别在于sysInit()函数的调用.该函数在RAM运行的VxWorks中初始化RAM.
ROM中运行的VxWorks
VxWorks在ROM中运行,即写入ROM中的VxWorks是非压缩的,不需要解压,系统直接跳到ROM的首地址,运行VxWorks.注意:
ROM运行的VxWorks并不支持所有的主扳,应以主扳手册为准.
文件romInit.s中的romInit()---->文件bootInit.c中的romStart()-->文usrConfigusrInit()---->sysHwInit()--->usrKernelInit()--->KernelInit(usrRoot,...)。
Vxwroks在ROM中运行的优势
VxWorks在ROM中运行主要是为了节省RAM空间,以便应用程序有更大的空间运行.只把VxWorksimage的data段复制到RAM的LOCAL_LOW_ADRS,text部分留在ROM并在ROM中执行.。
ROM中运行的VxWorks缺点是运行速度慢.
RAM中运行的VxWorks
VxWorks在RAM中运行,即写入ROM中的Boot或VxWorksImage是压缩的,需要先解压copy所有的text和data到RAM的LOCAL_LOW_ADRS中,下面sysInit()主要是初始化RAM用的,系统直接跳到RAM的首地址,运行VxWorks
usrInit()前面不压缩,即romInit(),romStart()不能压缩.
启动过程
文件romInit.s中的romInit()---->文件bootInit.c中的romStart()---->sysaLib.s中的sysInit()---->文件usrConfig.c中的usrInit()----->sysHwInit()----->usrKernelInit()----->KernelInit(usrRoot,...)。
RAM运行的Boot或VxWorksimage的text段或data段会从ROM复制到RAM,在RAM中运行。
其中usrRoot()是VxWorks启动的第一个任务,由它来初始化driver,network等。
BootROMimage的启动过程
最少的系统初始化,主要用于启动装载VxWorksimage.一般有压缩和不压缩两种形式,如bootrom和boot_uncmp.与VxWorksimage的区别在于一个Bootrom调用bootConfig.c,而VxWorks调用usrConfig.c.
启动顺序
文件romInit.s中的romInit()---->文件bootInit.c中的romStart()---->文件bootConfig中的usrInit()----->sysHwInit()----->usrKernelInit()----->KernelInit(usrRoot,...)
其中/target/config/all/bootConfig.c是BootROM设置模块.用于通过网络加载VxWorksimage.
usrRoot()---->bootCmdLoop(void)命令行选择,或autobooting----->bootLoad(pLine,&entry)载模块到存(网络,TFFS,TSFS...)----->netifAttach()---->go(entry)----->(entry)()从入口开始执行,不返回.
系统启动中几个很重要的函数及其作用
romInit()-----powerup,disableinterrupt,putboottypeonthestack,clearscaches.
romStart()-----loadImageSegmentsintoRAM.
usrInit()-----Interruptlockout,saveimformationaboutboottype,handlealltheInitializationbeforethekernelisactuallystarted,thenstartsthekernelexecutiontocreateaninitialtaskusrRoot().Thistaskcompletesthestartup.
sysHwInit()-----Interruplocked,Initializeshardware,registers,activationkernel.KernelInit(usrRoot,...)-----Initializesandstartsthekernel.Definessystemmemorypartition.ActivatesatasktUsrRoottocompleteinitalization.Unlocksinierrupts.UsesusrInit()initatestack.
usrRoot()初始化存分区表(memorypartitionlibrary),初始化系统系统时钟(systemclock)。
初始化输入输出系统(I/Osystem)----可选Createdevices----可选
设置网络(Configurenetwork)--------可选
激活WDB目标通信(ActivateWDBagent)---------可选
调用程序(Activateapplication)
VxWorksImage在RAM中解压的位置
RAMLowAddress
RAMHighAddress
VxWorks运行的位置
Bootimage由ROM解压后Copy的位置,即bootRom区
RAMLowAddress,RAMHighAddress和有关定义在BSP,config.h,makefile文件中定义.可参见BSP配置文件及生成下载
VxWorks在ROM中的情况
ROM低高地址位
ROM低地址位
压缩的VxWorksImgage
没有压缩的romInit.s和romStart()在ROM的起始位置,系统powerup后,从这个起始位开始执行,即执行romInit(),起始位置由硬件定义,一般为0x00000000
注:
浅蓝色为整个VxWorksImage.
其中RAM_LOW_ADRS,RAM_HIGH_ADRS等一些地址在makefile和BSPconfig.h中定义.可参见BSP配置文件及生成下载
2.4Vxworks驱动概要
总线类型
PLB(processorlocalbus),VME,PCI,PCI-Express,RapidIO,Mii,Virtual,MF(multifunctiondevicebus),USB,IIC,SPI.
驱动可以提供的