Vxworks学习(三)_驱动
声明本学习记录为笔者的学习记录笔记,其中大量借鉴了多本已出版书籍与网络资料,并会在文章末尾注明出处,同时笔者无虚拟机镜像。
一直学习的都是嵌入式应用层软件开发,本次也是第一次尝试去理解如何编写驱动程序
一、 驱动程序
对于一个非块存取设备的驱动程序有7种基本IO操作函数: creat( )、 delete()、 open( )、close()、read( )、write()和 ioctl( )。虽然一些设备不具备操作的相应操作函数会被忽略掉,但总的来说这种类型的设备驱动程序包含上述7种操作函数。
1.1 驱动程序表和安装驱动程序
调用I/O系统内部函数==iosDrvInstall()==可以动态安装驱动程序。
二、驱动设备
2.1 设备列表和增加设备
iosDevAdd(dav0, "/xx0", drvnum);//添加设备
dosFsDevCreate();//设备初始化程序
iosDrvFind();//验证已存在设备
三、文件描述符
3.1 文件描述符表
文件通过调用open()函数(或creat()函数)打开。IO系统在设备列表中寻找与调用者指定的文件名(或一个初始字符串)相匹配的设备名,如果找到相匹配的设备名,IO系统会提取相应位置的设备头中所包含的驱动程序号并从相应驱动程序表中调用执行打开操作的程序。
打开文件
读取数据
select()函数
- 任务需要为等待一个设备进行IO操作设定最长时间限制。例如,可能会为一个UDP套接字接收信息包操作设定一个时限。
- 一个驱动程序同时支持多个设备,而运行的任务可能会同时等待这些设备。例如,可能会为不同优先级的数据传输操作建立多个管道。
- 任务等待某个设备的I/O 操作,同时该设备等待其他设备的IO操作。例如,一个服务器任务可能会使用管道和套接字。
高速缓冲存储区的一致性问题
高速缓冲存储区中数据必须与RAM存储区中的数据同步或一致。
驱动程序可以通过两种方法解决缓冲存储区的一致性问题:
- 分配安全预取缓冲存储区,即一些标记成不可预取的缓冲存储区;
- 当从设备中读出或写入数据时都刷新预取缓冲存储区并将其标记为无效。
对于静态缓冲存储区而言,分配安全预取缓冲存储区的方法是有效的,但这通常需要MMU单元。对于动态缓冲存储区,如果频繁地分配和释放非预取缓冲存储区,则会导致大量存储区被标记成非预取。使动态缓冲存储区保持数据一致性的方法是手工将非缓冲存储区标记为无效或者手工对非缓冲存储区进行刷新。
设备驱动程序在将地址内容传递给相应设备时,必须使用宏CACHE_DMA_VIRT_TO_PHYS讲虚拟地址转成物理地址,反之亦然