|
I/O管理器
作者 Ray
RTEMS版权所有,转载请注明来源www.rtems.net,作者Ray
21.1: 介绍
输入/输出管理器为设备访问提供一种结构化方案。由输入/输出管理器提供的函数是:
rtems_io_initialize- 初始化一个驱动程序
rtems_io_register_name- 注册设备名称
rtems_io_lookup_name- 查找设备名称
rtems_io_open- 开启一个设备
rtems_io_close- 关闭设备
rtems_io_read- 从设备中读取读取
rtems_io_write- 向设备写入信息
rtems_io_control- 特别设备服务
21.2 背景知识
21.2.1 : 驱动程序表
每个使用RTEMS I/O管理器的应用都需要给出设备驱动表以及配置表格的地址。该表在初始化期间由 RTEMS
初始化,他包含每个驱动程序的功能函数入囗。每个驱动程序可能含有下列的入囗:
* Initialization
* Open
* Close
* Read
* Write
* Control
如果驱动程序不支援某个入口函数,那么该入口在配置表格中被设置为NULL。使用驱动功能函数时 ,如果函数正常返回,RTEMS将返回RTEMS_SUCCESSFUL。
和Linux一样,RTEMS可以通过I/O管理器动态加载驱动模块,这样可以减少系统运行内存开销。
confdefs.h中定义的CONFIGURE_MAXIMUM_DRIVERS配置了系统可以使用的驱动模块数目。
21.2.2 : 主设备号和从设备号
要使用I/O管理器就必须提供设备的主设备编号和从设备编号。这个规则和Linux/Unix中的规则是相同的。主设备号用于设备驱动表的索引,用于选择设备,从设备号是和具体设备相关,用于区别同一种类型的多个设备驱动(例如多个以太网芯片)。
数据类型rtems_device_major_number,和 rtems_device_minor_number分别用来操纵设备的主设备号和从设备号。
21.2.3 : 设备名称
I/O管理器提供了设备名称和设备驱动的映射关系。I/O管理器提供设备注册以及查找的函数。
21.2.4 : 驱动程序开发环境
应用程序开发者和驱动程序开发者都需要注意I/O管理器的下述特征:
驱动程序例程在调用者的上下文语境中运行。如果设备阻塞,对应的任务也阻塞。
驱动程序可以变更启动任务的模式,但是一定要记得将其还原。
可以从ISR调用驱动程序。
驱动程序可以调用其他RTEMS API,包括I/O管理器API,而且还可以进行调用远端节点的全局API。
通过I/O管理器只能访问本地的驱动程序。
虽然RTEMS输入/输出管理器为驱动程序提供了架构, 但是不对驱动的行为作出任何假设。
21.2.5 : 驱动的运行时注册
板支持软件包和应用程序开发者可以选择是将驱动程序静态链入设备驱动或者动态注册。
动态注册(运行时注册)有下面的好处:
在特定目标环境中BSP和内核库可能被多个应用所共用。这样应用程序可以基于共享库创建,由应用选择驱动加载,使驱动的名称统一,有助于管理。
在系统在总线上探测对应的驱动时,驱动类型可能会发生变化(例如usb接口上可能有多种设备)。
为动态总线(例如Compact PCI) 提供支持。
需要动态加载驱动模块。
21.2.6 : 驱动程序接口
当应用程序启动一个输入/输出管理器函数时,RTEMS判断哪一个驱动程序入囗必须被调用。这样,对RTEMS发出的系统调用就被定向到设备驱动中。下面是驱动程序的原型:
rtems_device_driver io_entry(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument_block
);
argument_block参赛的格式和内容与对应驱动程序有关。此外,为了程序的清晰并方便调试,驱动返回的错误代码应该避免与RTEMS系统的错误码相同。
21.2.7 : 驱动程序初始化
当RTEMS使用rtems_initialize_executive 函数初始化的时候,RTEMS将自动初始化所有的设备驱动程序。RTEMS
初始化驱动实际上是调用驱动表中每个驱动程序的初始化函数,并且向该函数传递下面的参数:
major : 驱动的主设备号.
minor :0
argument_block :指向配置表
驱动初始化的返回代码将会RTEMS忽略。如果驱动初始化没有成功,那么将会触发fatal_error_occurred 函数。
|