网站登录模板如何分析百度指数
目录
- 1.adc设备基类
 - 2.adc设备基类的子类
 - 3.初始化/构造流程
 - 3.1设备驱动层
 - 3.2 设备驱动框架层
 - 3.3 设备io管理层
 
- 4.总结
 - 5.使用
 
1.adc设备基类
此层处于设备驱动框架层。也是抽象类。
在/ components / drivers / include / drivers 下的adc.h定义了如下adc设备基类
 struct rt_adc_device
 {
 struct rt_device parent;
 const struct rt_adc_ops *ops;
 };
adc设备基类的方法定义如下
 struct rt_adc_ops
 {
 rt_err_t (*enabled)(struct rt_adc_device *device, rt_int8_t channel, rt_bool_t enabled);
 rt_err_t (*convert)(struct rt_adc_device *device, rt_int8_t channel, rt_uint32_t *value);
 rt_uint8_t (*get_resolution)(struct rt_adc_device *device);
 rt_int16_t (*get_vref) (struct rt_adc_device *device);
 };
抽象出来adc设备的共性成为adc设备基类的方法。
 共性:adc使能开关,转换开关,分辨率,参考电压值。
2.adc设备基类的子类
各个看adc设备基类的子类已经是在bsp的驱动层来实现了,例如
 / bsp / stm32 / libraries / HAL_Drivers / drivers 下的drv_adc.c定义的stm32 adc类,这些都是可以实例化的终类。其他芯片厂家如此这般一样。
3.初始化/构造流程
以stm32为例,从设备驱动层、设备驱动框架层到设备io管理层从下到上的构造/初始化流程如下
3.1设备驱动层
此层是bsp层,可以实例化的终类地。
c文件:
 / bsp / stm32 / libraries / HAL_Drivers / drivers 下的drv_adc.c。
定义了stm32的adc类
 struct stm32_adc
 {
 ADC_HandleTypeDef ADC_Handler;
 struct rt_adc_device stm32_adc_device;
 };
 总感觉不舒服,和rtt设备io框架类继承机制不一致,应该改成这样
 struct stm32_adc
 {
 struct rt_adc_device stm32_adc_device;
 ADC_HandleTypeDef ADC_Handler;
 };
 这就是舒服许多了。
实例化了stm32的adc设备:
 static struct stm32_adc stm32_adc_obj[sizeof(adc_config) / sizeof(adc_config[0])];
重写了adc设备基类的方法:
 static const struct rt_adc_ops stm_adc_ops =
 {
 .enabled = stm32_adc_enabled,
 .convert = stm32_adc_get_value,
 .get_resolution = stm32_adc_get_resolution,
 .get_vref = stm32_adc_get_vref,
 };
stm32_adc_init中开启stm32的adc设备的初始化:
 调用/ components / drivers / misc /adc.c的rt_hw_adc_register函数来初始化adc设备基类对象: rt_hw_adc_register(&stm32_adc_obj[i].stm32_adc_device, name_buf, &stm_adc_ops, &stm32_adc_obj[i].ADC_Handler)
 注意把重写的adc设备基类方法传递进去了。
3.2 设备驱动框架层
rt_hw_adc_register是adc设备驱动框架层的入口,开启adc设备基类的构造/初始化流程。
 其主要是重写设备基类对象的方法,如下
/ components / drivers / misc 下的adc.c实现了设备驱动框架层接口。
 重写adc设备基类的父类设备基类的方法如下
 #ifdef RT_USING_DEVICE_OPS
 device->parent.ops = &adc_ops;
 #else
 device->parent.init = RT_NULL;
 device->parent.open = RT_NULL;
 device->parent.close = RT_NULL;
 device->parent.read = _adc_read;
 device->parent.write = RT_NULL;
 device->parent.control = _adc_control;
 #endif
 同时,重写adc设备基类的方法。
 device->ops = ops;
并最终调用设备基类的初始化/构造函数rt_device_register。
3.3 设备io管理层
rt_device_register是io管理层的入口。从框架章节可以知道所有设备类都继承自设备基类rt_device,自然都要实现设备基类rt_device的约束方法,上面已经重写。
 在/ components / drivers / core 下的device.c中实现了rt_device_register,由它将pin设备放到容器里管理。
4.总结
整个设备对象的构造/初始化流程其实是对具体设备对象也就是结构体进行初始化赋值,按照先调用子类构造/初始化函数,再调用父类的构造/初始化函数方式——其实也是子类构造/初始化函数调用父类构造/初始化函数的流程,来完成设备对象的初始化/构造。最终放到对象容器里来管理。
5.使用
文档
