乐趣区

关于开源:RTThread-内核学习笔记-设备模型rtdevice的理解

RT-Thread 内核学习笔记 – 内核对象 rt_object

RT-Thread 内核学习笔记 – 内核对象治理

RT-Thread 内核学习笔记 – 内核对象操作 API

RT-Thread 内核学习笔记 – 内核对象初始化链表组织形式

RT-Thread 内核学习笔记 – 内核对象链表构造深刻了解

RT-Thread 内核学习笔记 – 设施模型 rt_device 的了解

RT-Thread 内核学习笔记 – 了解 defunct 僵尸线程
前言

最近在看内核源码,临时避开费脑力的任务调度、内存治理等较简单的实现办法,发现 rt_device 设施框架实现很简略。rt_device,设施治理的框架(模型),提供规范的设施操作接口 API,一些外设,能够形象成设施,进行对立的治理操作,如 LCD、Touch、Sensor 等。

rt_device 的构造

rt_device,是内核对象派生进去的,因而,有些操作,就是在操作内核对象。上几篇笔记钻研内核对象的治理,当初发现,看 device.c 文件,很容易能看懂。

device.png

rt_device_class_type.png
rt_device 的应用

RT-Thread 的 PIN、CAN、Serial、I2C、SPI、PM 等,都形象成一种设施模型。这些设施模型,派生于 rt_device 即可。

pin 设施模型:构造如下:

/ pin device and operations for RT-Thread /
struct rt_device_pin
{

struct rt_device parent; /* 派生于 rt_device */
const struct rt_pin_ops *ops; /* 设施特有的操作接口,还能够依据须要减少其余成员 */

};

所以用户能够派生本人想要的设施框架,减少特定设施的操作接口:ops,特定属性:构造体成员。须要把具体的设施,注册到内核容器上,这里调用 rt_device 的注册接口。

如:

/ 应用时,须要把设施名称、操作接口等,传入 /
int rt_device_pin_register(const char name, const struct rt_pin_ops ops, void *user_data)
{

_hw_pin.parent.type         = RT_Device_Class_Miscellaneous; /* 设施类型,为了辨别设施品种 */
_hw_pin.parent.rx_indicate  = RT_NULL; /* 接管回调,串口、CAN 个别会有 */
_hw_pin.parent.tx_complete  = RT_NULL; /* 发送回调,串口、CAN 个别会有 */

ifdef RT_USING_DEVICE_OPS

_hw_pin.parent.ops          = &pin_ops;

else

_hw_pin.parent.init         = RT_NULL; /* 以下规范的 rt_device 设施操作接口,依据须要实现 */
_hw_pin.parent.open         = RT_NULL;
_hw_pin.parent.close        = RT_NULL;
_hw_pin.parent.read         = _pin_read;
_hw_pin.parent.write        = _pin_write;
_hw_pin.parent.control      = _pin_control;

endif

_hw_pin.ops                 = ops;  /* 操作接口,设施的特有操作接口 */
_hw_pin.parent.user_data    = user_data; /* 不是必要的用户数据 */

/* register a character device */
rt_device_register(&_hw_pin.parent, name, RT_DEVICE_FLAG_RDWR);  /* 设施注册接口:注册为具体设施 */

return 0;

}

具体设施对接设施框架

/ 具体设施的 OPS 实现 /
const static struct rt_pin_ops _stm32_pin_ops =
{

stm32_pin_mode,
stm32_pin_write,
stm32_pin_read,
stm32_pin_attach_irq,
stm32_pin_dettach_irq,
stm32_pin_irq_enable,

};

/ 理论设施的注册办法 /
rt_device_pin_register(“pin”, &_stm32_pin_ops, RT_NULL);

设施注册后,能够通过:list_device 查看

其余

rt_device_read rt_device_write 等操作前,须要:rt_device_open
rt_device_open rt_device_close 操作最好成对呈现,起因是 rt_device 外部有援用计数,如你 open 两次,close 一次,计数为 1,没有真正的 close。个别通过 rt_device_find,通过设施名称,查找设施,获取设施的操作句柄,也就是设施构造体指针,从而能够进一步进行操作设施的操作接口 ops 或通过设施的规范操作接口操作设施。RT-Thread 的设施类型很多,能够派生各种设施模型(框架),从而能够注册挂载很多设施下来,能够不便的实现读写管制等操作,如管制硬件、传感器等。

总结

设施派生于内核对象:rt_object,相熟内核对象,有利于相熟 rt_device 的操作
持续钻研 RT-Thread 内核,一直学习,播种很多。
退出移动版