赣州做网站的公司哪家好,宿舍网页设计html模板,简述网站推广方式,深圳官方网站目录 1.dac设备基类2.dac设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 1.dac设备基类
此层处于设备驱动框架层。也是抽象类。
在/ components / drivers / include / drivers 下的dac.h定义了如下dac设备基类 struct rt_da… 目录 1.dac设备基类2.dac设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 1.dac设备基类
此层处于设备驱动框架层。也是抽象类。
在/ components / drivers / include / drivers 下的dac.h定义了如下dac设备基类 struct rt_dac_device { struct rt_device parent; const struct rt_dac_ops *ops; };
dac设备基类的方法定义如下 struct rt_dac_ops { rt_err_t (*disabled)(struct rt_dac_device *device, rt_uint32_t channel); rt_err_t (*enabled)(struct rt_dac_device *device, rt_uint32_t channel); rt_err_t (*convert)(struct rt_dac_device *device, rt_uint32_t channel, rt_uint32_t *value); rt_uint8_t (*get_resolution)(struct rt_dac_device *device); };
抽象出来dac设备的共性成为dac设备基类的方法。 共性:失能dac使能dac转换分辨率。
2.dac设备基类的子类
各个看dac设备基类的子类已经是在bsp的驱动层来实现了例如 / bsp / stm32 / libraries / HAL_Drivers / drivers 下的drv_dac.c定义的stm32 dac类这些都是可以实例化的终类。其他芯片厂家如此这般一样。
3.初始化/构造流程
以stm32为例从设备驱动层、设备驱动框架层到设备io管理层从下到上的构造/初始化流程如下
3.1设备驱动层
此层是bsp层可以实例化的终类地。
c文件: / bsp / stm32 / libraries / HAL_Drivers / drivers 下的drv_dac.c。
定义了stm32的dac类 struct stm32_dac { DAC_HandleTypeDef DAC_Handler; struct rt_dac_device stm32_dac_device; }; 总感觉不舒服和rtt设备io框架类继承机制不一致应该改成这样 struct stm32_dac { struct rt_dac_device stm32_dac_device; DAC_HandleTypeDef DAC_Handler; }; 这就是舒服许多了。
实例化了stm32的dac设备: static struct stm32_dac stm32_dac_obj[sizeof(dac_config) / sizeof(dac_config[0])];
重写了dac设备基类的方法: static const struct rt_dac_ops stm_dac_ops { .disabled stm32_dac_disabled, .enabled stm32_dac_enabled, .convert stm32_set_dac_value, .get_resolution stm32_dac_get_resolution, };
stm32_dac_init中开启stm32的dac设备的初始化: 调用/ components / drivers / misc /dac.c的rt_hw_dac_register函数来初始化adc设备基类对象: rt_hw_dac_register(stm32_dac_obj[i].stm32_dac_device, name_buf, stm_dac_ops, stm32_dac_obj[i].DAC_Handler) 注意把重写的dac设备基类方法传递进去了。
3.2 设备驱动框架层
rt_hw_dac_register是dac设备驱动框架层的入口开启dac设备基类的构造/初始化流程。 其主要是重写设备基类对象的方法如下
/ components / drivers / misc 下的dac.c实现了设备驱动框架层接口。 重写dac设备基类的父类设备基类的方法如下 #ifdef RT_USING_DEVICE_OPS device-parent.ops dac_ops; #else device-parent.init RT_NULL; device-parent.open RT_NULL; device-parent.close RT_NULL; device-parent.read RT_NULL; device-parent.write _dac_write; device-parent.control _dac_control; #endif
同时重写dac设备基类的方法。 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.使用
文档