分层
从官方给的架构可以看出,官方是将IO设备的使用分成了三层。
IO设备管理层:也就是正常用户接触的一层,用户直接调用该层接口实现IO设备的操作。例如代码中的device.c文件
设备驱动框架层:这一层可以称为中间层了,因为对于大多数设备来说,无非就是init, open, close,read, write, control
等操作,所以这里将许多serial都抽象话,实现这几个功能,供上层IO设备管理层调用。
比如代码中的serial.c模块。
设备驱动层:这层就是具体的驱动设备了,这层需要具体到IO设备,进行相应的适配。这层需要实现的几个option有configure, control, putc, getc, dma_transmit
等操作方法。这些方法的实现都需要调用具体设备(如STM32,GD32)的HAL库实现。供给中间层调用。
这样设计的好处是什么尼?
- 适配BSP的时候,只需要修改设备驱动层就可以
- 对于应用层和中间层基本不需要改动
- 层次分明,调用关系明确,很好维护
实例 uart的使用
来看看uart的使用:
- 对于应用层来说,首先得注册设备,这样抽象出来的方法才能使用。在
hw_board_init
中调用了rt_hw_usart_init
,将驱动层的方法(也就是第三层)通过rt_hw_serial_register
传给serial
中间层,在rt_hw_serial_register
中又将serial
的方法通过rt_device_register
传给应用层。 - 应用层调用device接口的时候,device通过传入的方法再一层一层调用。
- 中断等维护在
drv_usart.c
中。