RT-Thread 内核学习笔记 - 内核对象rt_objecthtml
RT-Thread 内核学习笔记 - 内核对象操做API学习
RT-Thread 内核学习笔记 - 内核对象初始化链表组织方式url
RT-Thread 内核学习笔记 - 内核对象链表结构深刻理解spa
RT-Thread 内核学习笔记 - 设备模型rt_device的理解.net
RT-Thread 内核学习笔记 - 理解defunct僵尸线程线程
前言
- 最近在看内核源码,暂时避开费脑力的任务调度、内存管理等较复杂的实现方法,发现rt_device设备框架实现很简单。
- rt_device,设备管理的框架(模型),提供标准的设备操做接口API,一些外设,能够抽象成设备,进行统一的管理操做,如LCD、Touch、Sensor等。
rt_device的结构
- rt_device,是内核对象派生出来的,所以,有些操做,就是在操做内核对象。上几篇笔记研究内核对象的管理,如今发现,看device.c文件,很容易能看懂。
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的注册接口。
如:code
/* 使用时,须要把设备名称、操做接口等,传入 */ 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内核,不断学习,收获不少。