按照我的理解,rt原本的构想是统一驱动接口,最终通过I/O驱动管理层的rt_device_read()等函数统一操作底层硬件,使驱动和应用分开。但是现在在学习和使用中发现这些函数只有rt_device_find()被使用到。
以iic为例,官方通过设备管理层-驱动框架层-设备驱动层写好了代码,如果要增加一个新的i2c设备比如aht10传感器,我从网上拉取的软件包是属于应用呢还是驱动呢,如果是驱动(按照网上的说法,设备和总线是分开的,那么aht10 就是设备),那么这个设备驱动继承i2c总线,但是最终出来的函数并非注册到rt-device,也没有适配rt_device_read()这样的统一接口。这样写的话,那么就完全起不到驱动与应用开发人员分开编写代码的初衷。
后来看到ds3231这个RTC软件包,觉得似乎这个软件包才是正确的想法,首先它继承于rtc设备类,然后像官方的写法一样,用自己的都是rt_ds3231_open()与rt_device_open()这些函数一一对应,有些控制的相关函数用输入rt_device_contrl()的cmd参数操作。
本人小白一枚,因为需要实习而公司在用rt系统所以最近在学习,学着学着就对该系统内核缠产生了兴趣,但是因为水平有限,源码很多看不太懂,现在的我感觉玩家包括官方似乎并没有按照原有的构想使用rt的驱动设备,这个只是我的想法,实际情况肯定不是这样,只是我理解不到位,所以才在此请教,希望大佬能指点一二。
可以看下这个设备框架,I2C的接口和RTC的接口并不是一样的,也是有区别的,不过用rt_device_read也是可以操作的。RTT把很多常用的外设统一了一下接口。有些特别的就需要rt_device_read等函数来统一。
当然软件包是每个作者自己维护的,所以有没有按照官方严格来做,其实很难有强制约束。
官方没有强求一定,必须,强行使用一些方式。RT-Thread是一个开源的社区,靠大家自发的方式,一些点上也只是一份参考,建议的方式。
所以从这个角度,RTT存在设备驱动框架,但一定就需要这样使用吗?也不是。如果有更好的方式也可以PR到RTT的upstream上,如果这样的方式和RTT的风格、原则一致也就可能被合并进来,推荐给更多人使用。
感谢您的回答,可不可以这样理解,完成对硬件的控制比如传感器的控制,按照rt的构想有三种规范方法,1.像官方实例一样直接在应用层用统一接口或者驱动框架层的函数操作硬件,这样写出来的就是应用程序。2.利用现有的驱动框架层的函数自己写一个设备的驱动,这样就要按照标准来注册并适配管理层接口。3.直接自己从底层开始写。
@西红柿炒番茄123
差不多,特殊的归为统一,常用的既可以用统一的,也可以用定好的API