vxWorks学习笔记
vxworks 串行设备驱动的编写笔记

VxWorks 串行设备驱动的编写一、概述vxWorks的串行设备的驱动不同于一般的设备的驱动。
一般的设备都是在系统初启的时候调用xxDrv()来安装diver table。
然后,调用xxDevCreate()来将该设备描述符xx_DEV加入到device table中。
在应用层用设备的时候,直接通过fd→device list→driver table的顺序调用相应的驱动函数即可。
他们的层次关系是:应用→I/O system ←→driver。
层次关系很明确。
然而串行设备的层次关系就不完全是这样子的。
基于许多因素的考虑,vxworks的串行设备的驱动分成了如下图所示的几层:图1 串行设备驱动代码的分层结构从图中可以看出:系统中的串行设备驱动总共有3层。
其中,usrConfig.c和ttyDrv(包括tyLib)提供了一些对串行设备的一些通用操作。
sysSerial.c中一些对不同开发板(系统)中串行设备有关的一些数据结构进行初始化。
所以,称之为Implementation specific code。
最后,的xxDrv.c当然是包括了一些具体设备相关的驱动/操作。
(比如读写数据,设置等)说道这里我们来回过头来看看,包含了串行设备的系统的总体的一个模型:图2.系统的模型从上图看出串行设备的驱动xxDrv并不是直接和I/O system交互的。
中间存在一个ttyDrv(包括tyLib)。
实际上,在diver table中安装的不是xxDrv的函数而是ttyDrv/tyLib提供的函数。
另外,Target Agent可以和xxDrv交换,方便系统的调试。
TtyDrv(包括tyLib):可以称之为一个虚拟的设备驱动。
因为他只是介于I/O与底层的具体设备的driver之间,为系统提供的统一的串行设备的界面。
另外,还可以调用具体硬件的管理驱动。
总之,ttyDrv给系统提供的是一些通用的管理函数(缓冲管理,互斥等)。
VxWorks 字符设备驱动开发学习

VxWorks 字符设备驱动开发学习1. 驱动程序要完成的任务a)驱动的初始化(安装)程序:将驱动安装到I/O系统中,连接中断,完成必要的硬件初始化。
函数通常命名为xxDrv()。
这里我以本次开发的PC104扩展板卡SDC(自整角机—数字转换)为例,命名为sdcDrv().向驱动列表注册驱动b)设备创建程序:向I/O系统添加设备,该设备的驱动已经安装到I/O系统中,即此步骤必须在驱动程序已经注册到驱动列表中,xxDrv()已经执行,在这里是sdcDrv()。
函数通常命名为:xxDevCreat(),在这里我们命名为sdcDevCreat().c)连接到设备中断的中断服务程序。
假如设备可以工作在中断工作模式时,要连接到中断服务程序。
此处我们的板卡暂时未支持此种模式。
2.概念定义和数据结构●I/O 系统I/O系统是操作系统的一个层次,它向应用软件提供硬件无关的标准接口,以提高应用层软件的可移植性。
提供七个标准函数如下:creat() 、remove()、open()、close()、read()、write()、ioctl() ●驱动列表驱动列表保存了每个驱动函数的地址,通过这个表,I/O请求就被转发到具体的驱动函数。
驱动表的结构如下所示,定义在iosLib.h中。
3.驱动安装的流程1. 首先执行sdcDrv(),在其中调用iosDrvInstall(xxCreat,NULL,xxOpen,xxClose,xxRead,xxWrite,xxIoctl)函数,ST ATUS sdcDrv(){/*首先判断驱动程式是否已经安装*/if(sdcDrvNum>0)return(OK);/*在这里添加驱动程序初始化部分*//*将驱动程序添加到驱动列表中*/if((sdcDrvNum=iosDrvInstall(sdcCreat,NULL,sdcOpen,NULL,sdcRead,sdcWrite,sdcIoc tl))==ERROR){return(ERROR);}return(OK);}。
VxWorks_BSP移植笔记

Amine思创黄金开发板S3C44B0X VxWorks BSP 移植笔记版本 1.0修改历史目录1.介绍51.1目的51.2范围51.3定义和缩写51.4参考51.5声明52.开发环境描述52.1思创黄金开发板S3C44B0X 62.2Tornado 2.2 62.3ARM SDT v2.51 62.4Flash Programmer 63.设计目标74.关键主题74.1异常处理74.1.1问题分析74.1.2解决方法1(eking) 94.1.3解决方法2(d3000) 104.1.4解决方法3 114.1.5其他124.2CPU寄存器124.3仿真和写Flash程序的差别124.4时钟134.5串口驱动134.5.1修改134.5.2FIFO 144.5.3连接Console和target server 144.6缓存[Cache] 154.6.1修改154.6.2测试174.7网络驱动184.7.1修改184.7.2寄存器测试194.7.3网络初始化分离194.8TFFS驱动204.8.1Socket 204.8.2MTD 204.8.3格式化204.8.4加载214.9目标机FTP服务启动214.10boot Shell命令扩展224.11简单VxWorks应用235.详细开发过程245.1建立开发环境245.2选择近似BSP模板245.3让最简bootRom运行起来255.4丰富bootRom功能296.操作说明296.1bootRom启动296.2加载VxWorks 306.2.1TFFS自动加载316.2.2TFFS手动加载316.2.3网络自动加载316.2.4网络手动加载326.3VxWorks 启动337.TIPs 358.TODOs 359.?s 3510.附件3510.1代码目录3610.2映象目录3610.3其他36S3C44B0X VxWorks BSP 移植笔记1. 介绍1.1 目的主要从几个关键主题描述S3C44B0X VxWorks BSP定制工作,对整个过程作了详细描述。
(完整)VxWorks驱动开发笔记

(完整)VxWorks驱动开发笔记VxWorks驱动开发笔记普通应⽤软件的开发,客户都会提出很明确的需求如功能、⽤户界⾯、外部接⼝以及开发周期经费等等要求,这些要求⼀般都相对直观且容易理解。
但是对于驱动程序的开发开说,开发周期以及经费这些需求往往都⽐较容易理解,可是对于功能、⽤户界⾯以及外部接⼝等需求就很难描述了,因为这需要对底层操作系统的理解,否则就⽆法提出适宜的需求来,⽽对底层操作系统的理解才是驱动程序开发之所以困难的主要原因。
1.1 驱动程序的结构驱动程序有两⼤基本特征:⼀是它实现了对硬件设备的访问(最根本⽬的),⼆是它实现了⼀系列与硬件设备⽆关的的访问接⼝。
通过这些接⼝,上层软件在控制此类硬件设备时⽆需对硬件进⾏详细的了解就可以进⾏访问,此外,当硬件设备更换时,只需要修改设备驱动的硬件相关的部分,⽽上层软件⽆需做任何更改。
这两个基本特征也正好决定了驱动程序的主体结构。
如图1.1所⽰,图中的阴影部分为设备驱动程序。
图1.1 驱动程序的结构1.2 驱动程序的⼯作流程不同设备在操作系统中完成的⼯作是不同的,但是就是⼯作流程来说,⼤致可以分为两个阶段。
第⼀个阶段是初始化阶段,在初始化阶段,驱动程序主要完成硬件以及设备驱动相关数据结构的初始化。
第⼆个阶段是硬件的访问阶段,根据设备⼯作模式的不同,可以分为中断模式和轮询模式,⽆论何种模式都可以通过与硬件设备⽆关的通⽤接⼝进⾏硬件设备的访问。
2.1 串⼝驱动原理串⼝因为调试简单在许多数据量不⼤的场合依然较为流⾏,可以借助串⼝对⽬标机中操作系统的运⾏情况进⾏监控等等。
下图为Tornado开发软件通过串⼝对⽬标机上运⾏的VxWorks操作系统进⾏监控的结构原理图。
图2.1 Tornado通过串⼝对vxWorks操作系统进⾏监控设备的驱动程序分为与硬件相关部分和硬件⽆关部分,⽽硬件相关部分则负责具体的硬件实现,硬件⽆关部分实现了⼀系列通⽤的数据接⼝,其中硬件⽆关部分实现是create、remove、open、close、read、write、ioctl等7个通⽤的函数接⼝。
VxWorks笔记

VxWorks操作系统1、V xworks基本概念1.1 Bootrombootrom 是指on-chip bootrom,在CPU芯片内部,内嵌有小的boot程序(bootloader),类似于PC机主板上的BIOS的存储区域1.2 VxWorks 系统编程中任务级与中断级的通讯如何实现?中断是由硬件触发,软件的作用只是将中断服务例程(ISP)与中断事件连接起来.1.使能中断,函数intEnable().2.用intConnect()登记中断号,和相应的中断例程ISR.这样一旦有中断发生,系统自动跳转到相应位置执行ISR.汇编语言在VxWorks系统编程的使用:汇编语言主要出现在BSP文件roInit.s,sysAlib.s等,这些汇编指令是系统初始化硬件用的,硬件系统Power up时硬件特别是内存没有初始化,C函数库没有装入内存,系统此时不支持C 语言程序,只支持它自己的32位汇编指令,所以只能用汇编指令来初始化硬件,为后续的操作系统包括C语言支持做准备.在OS正常运行后,就可以用C了.2、Vxworks操作系统组成2.1实时内核(wind):多任务调度(采用基于优先级抢占方式,同时支持同优先级任务间的分时间片调度)任务间的同步进程间通信机制中断处理定时器和内存管理机制2.2 I/O 系统VxWorks 提供了一个快速灵活的与ANSI C 兼容的I/O 系统,包括UNIX 标准的Basic I/O(creat(), remove(), open(),close(), read(), write(), and ioctl().),Buffer I/O (fopen(), fclose(), fread(), fwrite(), getc(), putc()) 以及POSIX 标准的异步I/O。
VxWorks 包括以下驱动程序:网络驱动、管道驱动、RAM盘驱动、SCSI驱动、键盘驱动、显示驱动、磁盘驱动、并口驱动等2.3 文件系统支持四种文件系统:dosFs,rt11Fs,rawFs 和tapeFs 。
Works操作系统学习笔记

VxWorks 操作系统学习笔记1. VxWorks 任务任务:在执行时每个程序都被称之为任务。
VxWorks操作系统中,任务可以直接地或者以共享方式访问大多数系统资源,为了维护各自的线程,每个任务必须保持有足够的上下文环境。
(1) 任务状态:就绪(READY):该状态时任务仅等待CPU的状态,不等待其他任何资源。
阻塞(PEND):任务由于一些资源不可用而被阻塞时的状态。
睡眠(DELAY):出于睡眠的任务状态。
挂起(SUSPEND):该状态时任务不执行,主要用于调试用。
挂起仅仅约束任务的执行,并不约束状态的转换,因此pended-suspended状态时任务可以解锁,delayed-suspended状态时任务可以唤醒。
DELAY+S:既处于睡眠又处于挂起的任务状态。
PEND+S:既处于阻塞又处于挂起的任务状态。
PEND+T:带有超时值处于阻塞的任务状态。
PEND+S+T:带有超时值处于阻塞,同时又处于挂起的任务状态。
state+I:任务处于state且带有一个继承优先级。
------------------------------------------------------------------------| ready | ——> | pended | semTake () / msgQReceive () || ready | ——> | delayed | taskDelay () || ready | ——> | suspended | taskSuspend () || pended | ——> | ready | semGive () / msgQSend () || pended | ——> | suspended | taskSuspend () || delayed | ——> | ready | expired delay || delayed | ——> | suspended | taskSuspend () || suspended | ——> | ready | taskResume () / taskActivate () || suspended | ——> | pended | taskResume () || suspended | ——> | delayed | taskResume() |------------------------------------------------------------------------(2) Wind任务调度在Wind内核中,默认算法是基于优先级的抢占式调度算法,也可以使用轮转调度算法。
小硕vxworks网络驱动开发笔记

目录第1章操作系统基本概念 (4)1.1实时操作系统和分时操作系统的区别 (4)1.2嵌入式操作系统VxWorks简介 (4)1.3 VxWorks的特点 (5)1.3.1可靠性 (5)1.3.2实时性 (5)1.3.3 可裁减性 (6)1.3.4对一个实时内核的要求 (6)1.4 VxWorks的整体构架 (7)第2章vxWorks驱动开发预备 (7)2.1 VxWorks映像 (8)2.2 BSP主要文件目录的组成及作用: (11)2.3系统启动顺序 (14)2.4 Vxworks驱动概要 (17)第3章vxWorks 网络驱动开发 (22)3.1驱动类别 (22)3.2 Vxworks 下网络驱动开发 (25)3.3 VxWorks网络驱动配置及分析 (62)第4章VxWorks系统中常见问题 (67)1 / 71前言在通信,电子领域,目前主流的嵌入式操作系统为linux 和vxworks。
Linux多用于消费电子产品,像大家熟悉的andriod,原始系统就是linux,也就是说andriod也是一种linux系统。
还有大家熟悉的MP3,也是使用linux 操作系统的。
Linux因为价格便宜(开源的,不需要付licence),稳定性好占据了一定的市场份额。
Vxworks是风河系统1983开发的一款嵌入式实时操作系统,多用于通信,导航,航天等领域。
因为这些领域对实时性要求非常高,比如现在LTE 系统就是使用vxworks系统,因为是采用TDD模式,而这种模式,显然对实时性要求非常高。
也就注定了vxwroks 在这些领域的特有优势。
选择linux还是vxworks看自己的专业方向,还有自己的兴趣所有。
每个领域只要研究透彻,都是很有前途的。
既然两者都是主流的嵌入式操作系统,其还是有很多相似性。
小编也初步接触过linux,发现具备一定的linux基础对日后深入学习vxworks很有好处,很多思想都是相似的。
vxworks内核笔记

*
* Process delay list. Make tasks at the end of their delay, ready.
* Perform round robin scheduling if selected.
FAST WDOG *wdId;/* pointer to a watchdog */
FUNCPTRwdRtn;/* watch dog routine to invoke */
intwdArg;/* watch dog argument to pass with wdRtn */
intstatus;/* status return by Q_REMOVE */
/* set up system timer */
sysClkConnect ((FUNCPTR) usrClock, 0);/* connect clock interrupt routine */
sysClkRateSet (SYS_CLK_RATE);/* set system clock rate */
sysClkEnable ();
}
/*******************************************************************************
** sysClkConnect - connect a routine to the system clock interrupt
taskRtnValueSet (pTcb, OK);
break;
}
case ERROR:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
vxWorks学习笔记vxWorks学习笔记2006-07-20 11:141.VxWorks开发方式:交叉开发,即将开发分为主机(host)和目标机(target)两部分。
类似于dos下C语言程序的开发。
合并开发的优点:简单缺点:资源消耗量大,CPU支持,非标准体系的支持host (Tornado) target(vxWork) 小程序模块vxWorks实际采用开发模式Tornado提供:编辑,编译,调试,性能分析工具,是vxWorks 的开发工具vxWorks:面向对象可以剪裁的实际运行操作系统2.vxWorks启动方式Rom方式(vxWork_rom)vxWorks直接烧入romRom引导方式(bootrom+vxWorks)其中bootrom烧入rom,vxWorks可以通过从串口,网口,硬盘,flash等下载!这里的bootrom不是开发环境中的bootable,在开发环境里bootable指的是vxWorks,downloadable指application3.调试attach用来在多任务调试时将调试对象绑定到某个任务任务级调试(attach taskName)单个任务的调试不会影响到其他任务的运行,主要用来调用户的应用程序。
全局断点:在调另一任务或本任务时,系统运行本任务断点,则停下。
各任务要配合使用。
任务断点:调本任务时,系统运行到本任务断点,则停下。
如果没有attach到本任务,不起作用。
一次性断点:跑到一次之后自动删除。
系统级调试(attach system)把所有task和系统core、中断看成一个整体,可用于调试系统和中断。
对中断调试,如果不是系统级调试,无论是那种断点都不起作用!wdbAgent不在调试范围内,当任务级调试时工作在中断方式,系统级调试工作在轮询方式。
!可是使用命令行方式的调试,参看crossWind教程。
4.调度优先级调度(无条件)时间片:同优先级,如果时间片没有打开,任务采取先到先运行,运行完毕在交出cpu,如果打开,则轮流使用cpu。
!死循环使比它优先级低的任务都不能运行。
5.任务间通讯信号量,全局变量,管道,signal,message queue,socket信号量:分互斥、同步(二进制)、计数三种。
其中互斥用于资源管理,禁止多任务同时共享内存。
它的优势是:速度快;同一任务如果已经take到,再次take还会成功。
!全局变量一定要有信号量保护。
Message queue:封装了全局变量和信号量,优势是:快;有很多操作项(send多recv少:消息可以排队,用priority_urgent 选项加到队列头。
send少recv多:取的时候支持fifo和优先级,即有消息到达时给高优先级任务还是先被recv阻塞的任务)signal:紧急通信机制,仅次于中断,依赖于系统调度,不依赖时间片(中断依赖于硬件时间),因此signal又称为软中断。
!exeption:内部中断,属于硬中断(例如除法出错)。
它与signal的关系如下图:taskA taskB 软中断处理signal taskC taskB User’s tasks exception signal 软中断处理Exception中断处理历程1.查TCB(task control block),得到正在执行的任务信息2.如果注册了这个signal,则挂起任务3.打印exception号,pc 指针,reg值4.如果注册了这个signal,给任务发signal 6.内存分配在config.h中由宏定义指定。
user_reserved mem (保存热启动时的一些参数) System Memory pool Wdb poll vxWorks Memory的最终布局LOCAL_MEM_LOCAL_ADRSRAM_LOW_ADRSFREE_RAM_ADRS WDB_POOL_SIZE sysMemTop() sysPhyMemTop() Bootrom {romInit() romStart()}Bootrom {usrInit() usrRoot()} VxWorks ROM RAMROM_SIZEROM_BASE_SIZEROM_TEXT_ADRSRAM_HIG H_ADRSRAM_LOW_ADRS启动时的ROM和RAM布局!bootrom中的内存驱动在config/scr/drv/mem下,直接include *.c就可以使用其中的函数。
对于flash必须在config.h中加上类型的定义,换flash芯片在flash***.h中修改控制字等宏定义。
7.中断中断分三层含义:中断引脚号(或从中断控制器得到)(interrupt level)***_LEVEL中断号(interrupt number)INT_VEC_GET(***_LEVEL)中断向量(对x86是中断号*4)(interrupt vector)INUM_TO_IVEC(INT_VEC_GET(***_LEVEL)!中断处理程序和中断向量必须connect再enable后才能被激活,对x86使用sysIntEnablePIC(),对MIPS,ARM,PPC 等使用intEnable()。
!中断中不能含有会使中断阻塞的函数接口。
(例如printf就不行,使用logMsg)8.TimervxWorks使用3个timer,分别用于系统时钟,辅助时钟和时标。
Timer0:用于系统时钟(system clock),可用sysClkRateSet()改变速率,默认值时60次/秒。
!vxWorks下的watchdog基于timer0,因为是在interrupt尺度,使用必须谨慎,否则会降低系统效率。
Timer1:用于辅助时钟(auxiliary clock),在bsp.h中定义了最大速率,最小速率和实际速率初始值。
可用sysAuxClkRateSet()改变速度。
用sysAuxClkConnect()定义辅助时钟的定时任务。
Timer2:用于时标(timestamp)。
从系统开始运行时就一直递增,可以用来获得系统运行时间,在windview工具中被使用。
用户程序也可以通过sysTimestamp()得到运行时间。
9.*.o,*.out,vxWorks一个板子跑起来之后可以有多个*.o和*.out(类似于window 下的应用程序)和有且仅有一个的vxWorks(类似于window 操作系统),但这些*.o和*.out的编译必须和vxWorks基于同一种cpu。
!bootrom在启动时被部分复制到ram里在运行,这一部分将下载vxWorks到ram,然后跳转到vxWorks入口处运行,然后vxWorks将这一部分的bootrom重新划分到系统池。
10.符号表(symbol table)符号表就是一个数组,定义了函数和全局变量跟他们的地址的对应关系,默认情况下符号表放在主机上,如果定义了standalone symbol table,则目标机上也有一份符号表,一般与target shell绑定使用。
11.一些配置pci的配置默认使用自动配置,如果要手工配置,必须定义pci configuration键盘和显示器的驱动归入串口部分,默认输入输出是显示器和键盘,可以重定向到串口。
12.使用watchdog产生周期性调用例程主程序:watchdog(func,param,tick)被watchdog调用的程序:func(param){watchdog(func,param,tick);……}13.任务切换速度:us量级,Cache关闭时上升到10us量级。
例如对于x86,233Mhz,cache打开,中断响应典型值3.5us。
其中c function挂接0.7us,中断推出+task重调度2.5us14.tornado文件结构用户主要需要目录:tornado/host:tcl控制语句、主机上运行的exetornado/docs:帮助文件,其中的books.html提供总览tornado/target:头文件,库文件,bsp修改bsp主要修改target目录下的文件,bsp的修改影响到bootrom和vxworks两部分,下面介绍的是使用工程方法建立的bootrom和vxWorks.15.bootrom的启动顺序和源码位置函数:romInit ?? romStart ?? usrRoot ?? CMDLoop文件:其中bootInit.c和bootConfig.c会用到sysLib.c中的一些函数,这些函数使一些通用接口,它们调用scr/config(简称S/C)下的usr***.c和scr/drv/(简称DD)下的一些程序。
DD下面的就是device driver,它们的链接方式有两种:被bootConfig.c和sysLib.c等直接#include目录下自带makefile,用cmd命令在目录下键入make,函数进入系统库usr***.c:配合宏使用的链结方式,直接#include!如果修改含有makefile文件的目录下的*.c文件,必须重新make,否则系统库没有更新。
!特殊修改推荐将文件拷到bsp目录下,加入工程或者#include!如果设备供应商只提供*a或*.o而不提供源码,那么在makefile中加入LIB_EXTRA=**.a或MACH_EXTRA=**.o。
*.o是无条件链接,而*.a库是有条件链接,只有在用到了库中的函数接口时,才会被链接。
16.vxWorks启动顺序和源码位置函数:sysInit ?? usrInit ?? usrRoot ?? usrAppInit文件:prjConfig.c引用usr***.c,目录是target/config/comps/src(简称C/S,!不是bootrom调用的同名函数)图形界面下的初始配置来自bsp的config.h和makefile,在工程建立的时候系统会自动完成此工作,编译使系统会根据图形界面下的配置自动生成prjparam.h和prjComps.h来保存选中的组件和配置参数。
此后配置的改动将通过prjConfig.c和这两个.h文件反映,再修改config.h不会对vxWorks的生成起作用。
对上面三个文件的手工修改也会被系统自动覆盖。
系统同时还在usrProj下自动生成makefile,同样不能通过对文件的直接修改达到更新目的。
17.vxWorks的数据分类Text 常数Data 函数体外部被初始化了的变量(包括只能在本文件内使用的LOCAL型变量)Bss 函数体外部没有被初始化的变量,拷贝vxWorks使不需要被拷贝,系统划出一定空间后统一置为零。