RTT内核对象——设备
RT-Thread有多种内核对象,其中设备device就是其中一种。
内核继承关系图如下:
![](https://img-blog.csdnimg.cn/img_convert/d05a8692cf7c7494ab9cb9a60b8d88dd.png)
设备继承关系图如下:
![](https://img-blog.csdnimg.cn/img_convert/65f663f85febd79f0898fa13578c6047.png)
I/O 设备模型框架
![](https://img-blog.csdnimg.cn/img_convert/5194feae5c0934116d39587ca490b309.png)
应用程序通过 I/O 设备管理接口获得正确的设备驱动,然后通过这个设备驱动与底层 I/O 硬件设备进行数据(或控制)交互。
I/O 设备管理层
:实现了对设备驱动程序的封装。设备驱动程序的升级、更替不会对上层应用产生影响, 从而降低了代码的耦合性、复杂性,提高了系统的可靠性。
设备驱动框架层
:对同类硬件设备驱动的抽象, 将不同厂家的同类硬件设备驱动中相同的部分抽取出来。
设备驱动层
:是一组驱使硬件设备工作的程序,实现访问硬件设备的功能。这一层是与硬件有关的,不同的芯片的同种外设驱动是不同的,STM32的GPIO驱动与NXP的GPIO驱动是不同的。这一层负责创建与注册I/O设备,对于操作逻辑简单的设备,可以不经过设备驱动框架层。
设备的两种注册方式
1、 对于操作逻辑简单的设备,可以不经过设备驱动框架层,直接将设备注册到 I/O 设备管理器中:
![](https://img-blog.csdnimg.cn/img_convert/873955bdf51db06932cff2cfc5c4639f.png)
2、 对于另一些设备,如看门狗等,则会将创建的设备实例先注册到对应的设备驱动框架中,再由设备驱动框架向 I/O 设备管理器进行注册 :
![](https://img-blog.csdnimg.cn/img_convert/f61d63db28796a2f902b7ea742318159.png)
I/O 设备模型框架补充图
![](https://img-blog.csdnimg.cn/img_convert/cb6d57178ae677c25f6605187373b977.png)
IO设备模型
![](https://img-blog.csdnimg.cn/img_convert/93ae1a3a033a0e9f9c748b978d6ccfd2.png)
访问IO设备
应用程序通过 I/O 设备管理接口来访问硬件设备,当设备驱动实现后,应用程序就可以访问该硬件。I/O 设备管理接口与 I/O 设备的操作方法的映射关系下图所示:
![](https://img-blog.csdnimg.cn/img_convert/51a750542bdface3d25087974c35ffeb.png)
设备对象的管理
RT-Thread中有那么多种内核对象,它是怎么管理这些内核对象呢?其使用对象容器
来管理这些对象。这个对象容器给每一类内核对象分配一个链表,每当创建一个对象实体,这个对象实体就被链接到对应的链表上,如:
![](https://img-blog.csdnimg.cn/img_convert/66f0f1332ef0d0719ba8695ad5dd4468.png)
这个对象容器对应到代码中是一个struct rt_object_information
类型的结构体数组rt_object_container[RT_Object_Info_Unknown]
。
初始化对象列表节点头里面的next
和prev
两个节点指针分别指向自身,如:
![](https://img-blog.csdnimg.cn/img_convert/089fa3ebf212bac626134cd50135101a.png)
若创建两个线程对象,则对象容器里变为:
![](https://img-blog.csdnimg.cn/img_convert/1607dc85e306fa7633b82f3dfca74230.png)
rt-thread中内核对象的组织形式如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/3e33d8850b6541349fe44538b5180020.png#pic_center)
参考资料:
RT-Thread 文档中心
【RT-Thread笔记】IO设备模型及PIN设备