czs软件程序员手册文档格式.docx
- 文档编号:17228760
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:28
- 大小:437.13KB
czs软件程序员手册文档格式.docx
《czs软件程序员手册文档格式.docx》由会员分享,可在线阅读,更多相关《czs软件程序员手册文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
BootRom启动了文件系统和网络,方便了调试映像的加载,可以通过文件系统或网络加载调试映像,使开发工作更为方便和快捷。
当开发工作结束后,系统到现场运行时,这种启动方式也方便了现场的程序升级,只需要替换VxWorks映像文件和目标模块文件,或添加、删除一些目标模块文件,修改一下启动配置文件就可以了。
当目标机上电或复位,系统都从BootRom开始运行。
在启动过程中,主机通过Console与目标机交流。
BootRom先在console上显示启动信息(banner),然后延时等待7s(缺省值),如果这期间用户没有敲按键干预,BootRom就立即自动按照设定方式加载VxWorks映像;
若用户干预则进入命令行处理状态,等待执行相关用户命令,直到用户命令再次加载执行VxWorks。
3板级支持包BSP
BSP(BoardSupportPacket,板级支持包):
介于底层硬件和上层软件之间的底层软件开发包,它主要功能为屏蔽硬件,提供操作系统的驱动及硬件驱动,具体功能包括:
单板硬件初始化,主要是CPU的初始化,为整个软件系统提供底层硬件支持;
为操作系统提供设备驱动程序和系统中断服务程序;
定制操作系统的功能,为软件系统提供一个实时多任务的运行环境;
初始化操作系统,为操作系统的正常运行做好准备。
BSP在VxWorks系统中的地位见图。
每个BSP包括一个ROM启动(BootRom)或其他启动机制,前文中的BootRom即是由BSP代码和VxWorks库代码生成。
要注意BSP和驱动程序是两个不同的概念,BSP是与一定的硬件环境有关,不同的硬件环境的BSP不同,而驱动程序可以从一种硬件环境可以移到另一种硬件环境,BSP提供各种硬件驱动程序的结合。
调通BSP后,将自己开发的BSP在Tornado环境下生成bootrom.bin文件,然后烧到BOOTROM里,这样在系统每次上电启动时,BootRom能够加载操作系统,然后把对CPU的控制权交给操作系统,从而执行用户开发的应用程序。
图3VxWorks体系结构中的BSP[15]
BSP文件结构
对应不同的硬件环境,有不同的BSP,BSP是和具体目标系统相关的,但是
它的基本结构还是相通的。
BSP文件在/target/config/all和/target/config/bspname文件夹里。
其中,all文件夹里的文件是所有BSP的通用文件,bspname文件夹的文件是用户自己定制的BSP文件。
公共目录all下主要有如下几个文件:
bootConfig.c:
是所有BootRom的主要初始化与控制文件。
BootConfig.c是usrConfig.c的一个子集,所以BootRom只能提供完整VxWorks映像中的部分功能。
BootRom不使用MMU库(SPARC除外)。
在集成环境下修改工程相关的配置信息不会影响BootRom,只有直接修改config.h,configAll.h,bootConfig.c和bootInit.c文件才会影响到启动映像。
bootInit.c:
定义了romStart()函数,用于BootRom的第二阶段初始化。
首先把text和data段从BOOTROM拷到SDRAM中,然后对启动映像进行解压。
usrConfig.c:
包含VxWorksImage的主要初始化代码。
使用命令行编译时才会用到此文件。
BSP的工作目录位于target/config/bspname,其中bspname是板级支持包的名字,如PcPentium(目标系统是基于pentium的系统),wrSbc8260(目标系统是基于MPC8260的系统)。
本模块以系统结构较为类似的wrSbc8260文件夹为基础进行修改,开发出自己的BSP。
在这个目录下面主要包括以下文件:
Makefile:
为特定目标系统生成ROM引导与VxWorks系统映像,该文件定义了系统规则,生成的引导映像的文件格式等。
sysALib.s:
它是用汇编语言编写的目标系统相关的模块,包含有系统基本的端口读写函数、CPU检测函数和系统GDT访问函数。
sysLib.c:
该文件包含目标系统相关的库函数,提供特定目标系统的可编程芯片驱动程序,如串行通信、定时器、中断控制器、网卡驱动等;
该文件提供了内存映射结构,用户可以编辑该结构完成特殊设备的安装。
sysSerial.c:
目标板上串口初始化程序,主要是COM1、COM2的初始化。
config.h:
硬件配置参数头文件。
bspname.h:
目标板参数配置头文件,该文件详细描述的目标系统的所有配置资源,如:
端口地址、中断号等。
romInit.s:
用汇编语言编写的初始化代码源程序,它是ROM引导VxWorks和基于ROM版本的VxWorks的入口,该程序初始化系统寄存器,由实地址模式切换到平面保护模式。
bootrom:
从ROM引导VxWorks的引导目标模块,此引导映像不属于BSP,它是基于BSP在tornado开发环境中生成的。
当建立宿主机/目标机开发调试环境时,可由宿主机通过串行线或网络将VxWorks系统映像加载到目标机。
此外,在BSP中还可以有键盘驱动(对应我们系统中的210xkbd.c)、虚拟控制台驱动程序(对应我们系统中的ppcConsole.c、ppc13506Lcd.c)、时钟驱动和中断管理等驱动程序以及与这些文件相关的头文件。
BSP的启动顺序
系统启动时,CPU首先执行BootRom映像。
BootRom映像的起始代码是romInit(),位于BSP文件夹中的romInit.s文件。
BootRom对于硬件的初始化顺序,大致可按表进行:
表BootRom启动顺序
函数
函数功能
所在文件
1.romInit()
2.romStart()
3.usrInit()
4.usrKernelInit()
5.kernelInit()
6.usrRoot()
7.Applicationroutine
(a)禁止中断;
(b)保存启动类型;
(c)硬件初始化;
(d)调用romStart();
(a)将数据段从ROM拷贝到RAM,清内存;
(b)将代码段从ROM拷贝到RAM,有必要的话解压缩;
(c)调用usrInit();
初始化程序
如果相应的配置文件被定义,对应函数被调用
初始化并启动内核
初始化I/O系统,驱动器,创建设备
应用程序代码
romInit.s
bootInit.c
bootConfig.c
usrKernel.c
kernelLib.c
Applicationsourcefile
加载VxWorks映像后,VxWorks的启动顺序如表所示。
BSP的主要修改说明
文档有个BSP对比文件夹,可以对比原文件夹wrSbc8260和新的BSP文件夹的区别。
/target/config目录包含的文件用来配置和生成一个专用VxWorks系统,它包含与目标系统相关的模块(如wrSbc8260的BSP子目录)和独立于目标系统的用户可修改的公共执行模块(子目录all),系统配置就是在/config/all目录包含的文件中完成的。
配置的头文件有\target\config\all\configAll.h和\target\config\wrSbc8260\config.h,configAll.h是系统默认的配置,config.h是开发者的配置,有最终决定作用。
先将\target\config目录下的子目录wrSbc8260复制并重新命名为scut8260。
1相比wrSbc8260,scut8260删去了sysLed.c、sysLed.h、sysVware.c、sysVware.h、sysPpcAVware.s五个文件,增加了amd29LvMtd.c、byteNvRam.c、tffsConfig.c三个文件。
删除几个文件后必须相应修改一些宏定义,去除相关模块的包含定义才能编译通过。
增加的amd29LvMtd.c、tffsConfig.c用于TFFS文件系统,byteNvRam.c用于读写BOOTROM最后一个扇区以保存启动行和以太网地址等信息。
相关的宏定义的改变具体见BSP文件夹中的源程序。
2将wrSbc8260.h文件重命名为scut8260.h后再进行修改。
3保持原来的文件名但内容作了改变的文件有:
romInit.s,makefile,config.h,configNet.h,sysMotFccEnd.c,sysLib.c,sysNet.c,sysNet.h,sysTffs.c,eeprom.c,sysMotSccEnd.c十一个文件。
sysMotFccEnd.c
由于wrsbc8260用的网口是FCC2,我们用了FCC3,修改的地方一是将宏定义MOT_FCC_NUM由0x02改为0x03,二是sysFccEnetEnable和sysFccEnetDisable函数中的管脚配置。
sysNet.c,sysNet.h和sysMotSccEnd.c
修改是为能够设置十兆网口的物理地址。
configNet.h
配置END驱动,下面讲网络驱动部分有详细说明。
eeprom.c
改为Am29lv040B的底层操作驱动,增加读写,擦除等命令。
sysTffs.c
主要是宏定义的修改
还要注意我们将tffsConfig.c文件拷到BSP文件夹下,要使用当前目录下的该文件,需要将#include"
tffs/tffsConfig.c"
改为#include"
tffsConfig.c"
比较重要的函数是sysTffsFormat
4BSP中需要修改的文件最主要的是:
romInit.s,config.h,Makefile,sysLib.c
和CPU密切相关并且用汇编编写,主要看8260数据手册和PowerPC汇编手册。
Makefile文件的修改
Makefile文件用于为特定目标系统生成ROM引导的VxWorks映像,该文件定义了系统的编译规则,生成引导映像的文件格式。
修改主要包括:
去除一些无用模块引用,修改各种宏定义等,其中特别要注意的是某些宏定义需要和config.h一致。
具体修改如下。
TARGET_DIR=scut8260我们的BSP目录名称为scut8260
VENDOR=WindRiver
BOARD=SCUT8260Evaluation
RELEASE+=bootrom.bin输出的文件类型
ROM_SIZE=00070000#用于存储bootrom.bin的空间大小
RAM_LOW_ADRS=00100000#RAMtext/dataaddress
RAM_HIGH_ADRS=01F00000#RAMtext/dataaddress
MACH_EXTRA=m8260SccEnd.objamd29LvMtd.o增加TFFS文件系统的MTD驱动模块
config.h文件的修改
config.h是要修改的最关键的配置文件,其中的配置与实际主板密切相关。
此文件中包含着系统引导时所需要的一些最基本配置,还包含对scut8260.h、congfigAll.h等配置的重定义或者去除定义。
针对与目标板相关的头文件,可根据目标系统的特殊要求,编辑或者修改该文件的配置参数。
主要修改任务是设置启动行、内存地址和大小、屏蔽一些组件等。
详见源文件。
1首先重新定义了一些内存的地址和大小信息。
2原来wrsbc8260的复位配置字的获取方式不同,只定义了复位配置字的地址而并没有定义内容,这里增加了复位配置字内容的定义
/*复位配置字相关的宏定义*/
#defineHRCW_BYTE_00x04
#defineHRCW_BYTE_10x00/*IMMR[0-14]=0x0000_0000*/
#defineHRCW_BYTE_20x01
#defineHRCW_BYTE_30x46/*MODCK_H=0110*/
3设置启动行,指定启动设备,这里设置为FCC
4要将#include"
wrSbc8260.h"
scut8260.h"
sysLib.c文件的修改
1注意数组sysPhysMemDesc[]的内容,该数组涉及到MMU的管理。
开MMU的时候,当系统需要增加新的访问空间时,需要在这里定义该空间的地址、大小、访问方式等项。
否则当程序读写该部分空间时,会有错误提示。
比如如果没有定义nvram的空间
2我们将byteNvRam.c文件拷到BSP文件夹下,需要将#include"
mem/byteNvRam.c"
byteNvRam.c"
,这样包含的源文件是在当前目录下而不是在src/drv/mem目录下。
3将系统频率获取函数强制设置为BUS/CPM/CORE分别为66/166/266MHz
4部分驱动说明
1串口驱动
VxWorks的I/O系统被设计来为任何类型的设备提供一个简单、统一、独立于设备的接口。
这些设备主要包括字符设备(如串口)、块设备(如FLASH,硬盘)、虚拟设备(如管道)、管理与控制设备及其网络设备等。
在VxWorks中应用程序是通过打开一个有名文件来实现对I/O设备的存取,一个I/O设备对应一个文件描述符。
因此一个文件可能有两种情况:
磁盘文件,或者I/O设备。
例如:
“usr/myfile”是一个磁盘文件,而“/tyCo/0”则对应串口1,是个物理设备。
在VxWorks中,它们虽然指的是完全不同的物理设备,但都被称作文件。
设备是通过称作驱动程序的程序模块进行操作的,一个驱动程序处理所有同类型的设备,这些设备可能只是参数不同,例如I/O地址,中断号等。
串口属于字符设备,字符设备模块结构图如图所示。
图字符设备模块结构图
字符设备的初始化过程如下:
(1)调用iosInit()初始化I/O系统;
(2)调用xxDrv()初始化设备驱动程序;
(3)调用xxDevCreate()创建设备(可能有若干个)。
xxDrv()函数是设备驱动程序的初始化函数,参数是7个函数指针。
I/O系统用一个drivertable保存驱动程序的信息,表的每个记录即该驱动程序的7个函数指针,如表所示。
表驱动程序列表
其中空指针表示驱动无该项操作,表项的索引就是驱动程序号(drivernumber)。
xxDevCreate()函数创建设备并在设备表中添加设备,设备列表和驱动表的关系如图所示。
图设备列表和驱动列表的调用关系
字符设备利用fd、dev、drv三个表对设备进行操作,如图所示。
图设备打开过程
VxWorks的串行设备的驱动不同于一般的设备的驱动。
一般的设备都是在系统初启的时候调用xxDrv()来安装驱动列表。
然后,调用xxDevCreate()来将该设备xx_DEV加入到设备列表中。
在应用层用设备的时候,直接通过文件描述符->
设备列表->
驱动列表的顺序调用相应的驱动函数即可。
他们的层次关系是:
应用->
I/O系统->
驱动。
层次关系很明确。
然而串行设备的层次关系就不是这样子的。
基于系统I/O的统一界面的考虑,VxWorks的串行设备分成了如图所示的几层。
图串行设备模型
从图中可以看出串行设备的驱动xxDrv并不是直接和I/Osystem交互的。
中间存在一个ttyDrv(包括tyLib)。
实际上,在divertable中安装的不是xxDrv的函数而是ttyDrv/tyLib提供的函数。
ttyDrv(包括tyLib),可以称之为一个虚拟的设备驱动。
因为他只是介于I/O系统与底层的具体设备的驱动之间,为系统提供的统一的串行设备的界面。
ttyDrv给系统提供的是一些通用的管理函数(缓冲管理,互斥等)。
所以,ttyDrv往往就可以管理多个设备。
在I/O系统方面,虚拟设备ttyDrv作为一个字符型设备存在,它将自身的入口点函数挂在I/O系统上,创建设备描述符并将其加入到设备列表中。
当用户有I/O请求包到达I/O系统中时,I/O系统会调用ttyDrv相应的函数响应请求。
同时,ttyDrv管理了缓冲区的互斥和任务的同步操作。
另一方面,ttyDrv负责与实际的设备驱动程序交换信息。
通过设备驱动程序提供的回调函数及必要的数据结构,ttyDrv将系统的I/O请求作相应的处理后,传递给设备驱动程序由设备驱动程序完成实际的I/O操作。
其调用关系如图所示。
图串行驱动程序调用关系
从图中可以看出,应用层往往调用通用库ioLib中的函数read、write、ioCtrl等。
这些函数从输入的fd中找到相应的设备描述符,然后找到了drivertable,调用drivertable中的函数。
而drivertable中的函数则在ttyDrv/tyLib(tyWrite、tyRead等)中。
再由ttyDrv/tyLib和真正的设备驱动(xxDrv)打交道。
第二层和底层的通讯是通过回调函数(callback)来实现。
具体的说就是:
ttyDrv提供两个函数负责输出时候底层驱动可以从buffer中得到数据,输入时候底层驱动可以将接受到的字符填入到buffer中,以便用户层通过tyWrite、tyRead读出到用户的buffer中。
底层驱动xxDrv用tyITx()来从输出环形缓冲中读数据,用tyIRx()来将设备读到的字符写入到输入环形缓冲中。
系统串行设备初始化顺序如图所示
图串行设备初始化顺序
对串口的操作步骤如图3-15所示。
图VxWorks中串口操作步骤
VxWorks初始化串口驱动程序和添加串口是在usrRoot()中完成的。
系统根据指定的串口个数依次将它们初始化,调用ttyDrv()安装串口驱动程序,调用ttyDevCreate()将指定的串口设备添加系统中。
当串口的初始化完成后,可以在需要使用前利用open()打开相应的串口,open()函数返回的文件句柄就是设备的标志,依据串口打开时的读写标志,可以对串口进行只读操作、只写操作,或者同时进行读写操作。
串口的写操作是一个比较简单的过程,将数据用write()写到串口设备标志文件即可。
而串口的读操作相对复杂些,数据的读取有查询方式和中断方式两种。
查询方式依据事先设定的时间间隔定时读取端口,不论端口是否有数据,操作都要进行。
查询方式不能完全适应实时系统及时响应的要求,因此在实时操作系统中使用的较少。
而中断方式(或者类型中断的机制)使用的较多。
2网络驱动程序
VxWoks操作系统具有强大的网络功能。
VxWorks包含了以太网(IEEE802.3)或通过串口线(SLIP)连接的网络驱动的支持,使得网络开发变得易于进行和方便移植。
图3-16列出了VxWorks的网络组件结构。
图VxWorks网络组件结构
VxWorks采用了两种形式的网络驱动:
BSD驱动和END驱动。
BSD驱动支持通用的BSD4.4网络,特点是硬件接口与网络协议紧紧结合在一起,网络协议直接调用驱动。
END(增强的网络驱动接口程序)是VxWorks独有的,它通过MUX模块管理END设备,实现与上层间的数据帧交换。
在本系统的网络设备驱动中,选用END驱动作为以太网驱动方式。
VxWorks支持的网络驱动接口称为MUX。
在MUX方式下,驱动程序和上层协议之间不直接交互,MUX将协议层与硬件驱动分开,如图3-17所示。
MUX支持诸如多播(Multicasting)、轮询模式的以太网(Polled-modeEthernet)和零拷贝(Zero-copy)等特征。
图MUX与协议层和驱动的接口关系
MUX层的优点是:
1将协议层与硬件驱动分开,有利于协议与驱动的管理,尤其是对多协议与多驱动的情况下,这是因为他们有了统一的接口。
2协议不再需要了解底层硬件,有利于协议的开发。
3新增一种协议和新增一种硬件驱动时,不需要改动其他协议和驱动。
网络协议包含了四个函数:
StackShutdownRtn()
StackErrorRtn()
StackRcvRtn()
StackRestartRcn()
MUX与协议的接口就是这四个函数,如果要写能用于MUX的协议时,必须提供这四个函数。
驱动则包含了较多的函数,要写驱动程序,则要理解和提供MUX与底层驱动之间的驱动函数。
图示意了三者的调用关系。
图MUX上下层接口
驱动程序与MUX层函数(net_funcs)的连接是在EndLoad里的END_OBJ_INIT()实现的。
以太网驱动的加载过程如下:
a)初始化硬件接口;
b)初始化网络任务工作队列;
c)产生tNetTask任务以便处理网络任务工作队列中的子任务;
d)调用muxDevLoad()加载网络驱动;
e)调用muxdevStart()开启驱动;
f)设置网络参数,加载协议栈。
在调用muxDevLoad()加载网络驱动的时候,会调用驱动程序中的函数endLoad()。
endLoad()生成描述驱动程序的数据结构END_OBJ。
在函数endL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- czs 软件 程序员 手册