前段事情比较多,没有推动进度,后续好好规划时间,多写点~
阅读第一部分学习感悟:在学习新知识前,还是要先好好的了解基础概念
记得初次接触RTT的时候,就是看的野火内核的书,内核讲的简单易懂,了解了线程、信号量、任务、事件以及处理机制;
通过相关例程很快就能把RTT仿真运行起来,使用打印出来的日志去观察现象。
但在应用的时候,如注册个传感器等等,便开始一头雾水。虽然有官方文档指导,但是在网上看都是一扫而过,很难静下心细看细想;
拿到设备驱动开发指南纸质书,配合着官方文档手册:I/O设备模型 (rt-thread.org),跟着打卡进度,驱动自己学习,对设备和驱动有了新的理解和认识;
虽然书上有很多地方和官方指导手册一致,但看下来后,看到的关注点就是不一样,也许这就是论坛与纸质书结合的魅力吧!
内核的一对象~设备device
归纳整理封装继承派生,使用统一设备框架去管理;框架分为3层去对接,分别是I/O设备管理层、设备驱动框架层、设备驱动层:
RTThread把外部同类事物进行了抽象,看成IO设备去对待;化繁为简,其实都是IO口的高低变化;构成I/O设备管理层;
把各设备相同部分抽取出来,不同部分留出接口;构成设备驱动框架层;
为驱使硬件设备工作,而构建设备驱动层,用以创建和注册I/O设备;操作逻辑简单的设备,可直不经过设备驱动框架层,直接注册到 I/O 设备管理接口来访问硬件,
内核继承:
设备继承:
操作逻辑简单的设备,从上至下,按箭头流向依次执行:
创建设备create->注册设备register->查找设备find->打开设备open->读取设备read->关闭设备close
另一些设备,如硬件看门狗等,先创建设备实例,接着注册到设备驱动框架中,再由设备驱动框架向 I/O 设备管理器进行注册。
RTstudio生成标准版程序串口应用方式:
在components.c的rtthread_startup中调用rt_hw_board_init();
在drv_common.c中弱声明RT_WEAK rt_hw_usart_init();
在drv_usart.c中进行硬件底层驱动和初始化配置
在rt_hw_usart_init();中进行底层驱动接口和驱动框架接口的对接
①、struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; //配置串口初始化参数
②、接着对每个串口依次进行接口对接、参数配置//
uart_obj.config = &uart_config;
uart_obj.serial.ops = &stm32_uart_ops;
uart_obj.serial.config = config;
③、进行设备的注册
result = rt_hw_serial_register(&uart_obj.serial, uart_obj.config->name,RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX | uart_obj.uart_dma_flag, NULL);