1 设备模型框架
它位于硬件和应用程序之间,共分成三层,从上到下分别是 I/O 设备管理层、设备驱动框架层、设备驱动层。
应用程序通过 I/O 设备管理接口获得正确的设备驱动,然后通过这个设备驱动与底层 I/O 硬件设备进行数据(或控制)交互
I/O 设备管理层实现了对设备驱动程序的封装。应用程序通过 I/O 设备层提供的标准接口访问底层设备,设备驱动程序的升级、更替不会对上层应用产生影响。这种方式使得设备的硬件操作相关的代码能够独立于应用程序而存在,双方只需关注各自的功能实现,从而降低了代码的耦合性、复杂性,提高了系统的可靠性。
设备驱动框架层是对同类硬件设备驱动的抽象,将不同厂家的同类硬件设备驱动中相同的部分抽取出来,将不同部分留出接口,由驱动程序实现。
设备驱动层是一组驱使硬件设备工作的程序,实现访问硬件设备的功能。它负责创建和注册 I/O 设备,对于操作逻辑简单的设备,可以不经过设备驱动框架层,直接将设备注册到 I/O 设备管理器中
2 设备模型
RT-Thread 中各类内核对象的派生和继承关系:
设备模型的派生关系:
3 设备结构
4 、序列示意图
不经过设备驱动框架层,直接将设备注册到 I/O 设备管理器的序列示意图:
将创建的设备实例先注册到对应的设备驱动框架中,再由设备驱动框架向 I/O 设备管理器进行注册的序列示意图:
5 、设备接口
5.1 设备注册操作
驱动层负责创建设备实例,并注册到 I/O 设备管理器中,也就是将设备对象插入对象容器的设备类型链表。
判断设备指针是否指向空地址
根据传递的设备名称在对象容器的设备链表中查找设备对象是否存在
将设备对象插入对象容器的设备类型链表
5.2 设备解除注册操作
判断设备指针是否为空
判断形参传递的设备对象是否为设备类型
判断设备对象是否为系统对象(即静态对象)
将设备驱动框架对象从对象容器和的设备链表中删除
5.1 设备查找
应用程序根据设备名称获取设备句柄,进而可以操作设备。
如果当前线程指针不为空,则进入临界区,否则继续往下执行
获取对象容器当中设备对象的链表头指针
如果链表指针不为空,则遍历链表,根据链表指针的实际地址计算出设备对象地址
取出设备对象的名称与形参传递过来的名称比对,如果名称一致则返回对象指针并退出(如果当前线程指针不为空需先退出临界区)
5.2 设备打开
判断设备指针是否为空
判断形参传递过来的设备对象是否为设备类型
若设备对象未初始化,先对其初始化
若为独立设备且已经打开,则返回
若设备打开函数指针指向非空,则调用设备打开函数
打开成功则标志设备已打开,并将引用计数器加1
5.3 设备读取
判断设备指针是否为空
判断形参传递过来的设备对象是否为设备类型
如果设备引用计数器为零,则直接返回
若设备读取函数指针不为空,则调用设备读取函数
5.4 设备写入
判断设备指针是否为空
判断形参传递过来的设备对象是否为设备类型
如果设备引用计数器为零,则直接返回
若设备写入函数指针不为空,则调用设备写入函数
5.5 设备控制
判断设备指针是否为空
判断形参传递过来的设备对象是否为设备类型
若设备控制函数指针不为空,则调用设备控制函数。
5.6 设备关闭
判断设备指针是否为空
判断形参传递过来的设备对象是否为设备类型
若设备引用计数器不为0则对其减1操作
若设备引用计数器仍不为0则返回
如果设备关闭函数指针不为空,则调用设备关闭函数。
标记设备已关闭。
5.7 注册接收完成回调函数
判断设备指针是否为空
判断形参传递过来的设备对象是否为设备类型
注册设备接收完成回调函数。
5.8 注册发送完成回调函数
判断设备指针是否为空
判断形参传递过来的设备对象是否为设备类型
注册设备发送完成回调函数。
原作者:Aladdin_KK
|