目录
- 1.输入捕捉设备基类
- 2.输入捕捉设备基类的子类
- 3.初始化/构造流程
- 3.1设备驱动层
- 3.2 设备驱动框架层
- 3.3 设备io管理层
- 4.总结
- 5.使用
1.输入捕捉设备基类
此层处于设备驱动框架层。也是抽象类。
在/ components / drivers / include / drivers 下的rt_inputcapture.h定义了如下脉冲编码器设备基类struct rt_inputcapture_device
{
struct rt_device parent;
const struct rt_inputcapture_ops *ops;
struct rt_ringbuffer *ringbuff;
rt_size_t watermark;
};
这里用到了rtt的ringbuffer。
输入捕捉设备基类的方法定义如下
struct rt_inputcapture_ops
{
rt_err_t (*init)(struct rt_inputcapture_device *inputcapture);
rt_err_t (*open)(struct rt_inputcapture_device *inputcapture);
rt_err_t (*close)(struct rt_inputcapture_device *inputcapture);
rt_err_t (*get_pulsewidth)(struct rt_inputcapture_device *inputcapture, rt_uint32_t *pulsewidth_us);
};
抽象出来共性成为输入捕捉设备基类的方法。
2.输入捕捉设备基类的子类
各个输入捕捉设备基类的子类,需要在驱动层(bsp)来实现,此类是实现类。
3.初始化/构造流程
暂无实例。
3.1设备驱动层
此层是bsp层,一般是可以实例化的实现类所在地。
c文件:
3.2 设备驱动框架层
rt_device_inputcapture_register是输入捕捉设备驱动框架层的入口,开启输入捕捉设备基类的构造/初始化流程。
/ components / drivers / misc 下的rt_inputcapture.c实现了设备驱动框架层接口。
重写的输入捕捉设备基类的父类——设备基类——的方法如下
#ifdef RT_USING_DEVICE_OPS
device->ops = &inputcapture_ops;
#else
device->init = rt_inputcapture_init;
device->open = rt_inputcapture_open;
device->close = rt_inputcapture_close;
device->read = rt_inputcapture_read;
device->write = RT_NULL;
device->control = rt_inputcapture_control;
#endif
并最终调用设备基类的初始化/构造函数rt_device_register。
3.3 设备io管理层
rt_device_register是io管理层的入口。从框架章节可以知道所有设备类都继承自设备基类rt_device,自然都要实现设备基类rt_device的约束方法,上面已经重写。
在/ components / drivers / core 下的device.c中实现了rt_device_register,由它将pin设备放到容器里管理。
4.总结
整个设备对象的构造/初始化流程其实是对具体设备对象也就是结构体进行初始化赋值,按照先调用子类构造/初始化函数,再调用父类的构造/初始化函数方式——其实也是子类构造/初始化函数调用父类构造/初始化函数的流程,来完成设备对象的初始化/构造。最终放到对象容器里来管理。