RT-Thread为什么要引入驱动程序

p7885572RTOS 2023-05-20 21:51:24 7052阅读 举报

RT-Thread实际上跟Linux相比的话,RT-Thread的驱动程序更加简单,它层次最多就只有两层而已,当然这说的太绝对了啊,有些可能会有三四层,但是一般来说只有两层而已。RT-Thread的文件系统呢,也很简单。

我们先把这些知识点都过一遍,先我们就以GPIO为例,比如我们要去操作一盏LED灯,MCU芯片的某个引脚要去操作一盏灯,这是一个LED灯。

   串联电阻接3.3V,我们只需要去把这个引脚做如下几件事情:第一把这个引脚配置成输出模式;第二配置引脚的输出方向;第三啊,比如我们想让这个灯点亮的时候,输出低电平亮灯,输出高电平是去灭灯,我们单片机程序怎么写呢?我们使用HAL库,好,HAL库怎么做,我们随便来看看一个HAL库。

void HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init),在写之前你要先配置,我先找到这个函数,实际上我对这函数不用去记它,用到的时候再去看看就好了。好,HAL_GPIO_Init(),你使用HAL库的话,你得先去执行这个初始化函数,要去配置某个引脚,把它配置成输出引脚。GPIO_TypeDef这个结构体表示哪一组,他表示你要去使用哪一组的引脚,可能是GPIOA,可能是GPIOB等等。

GPIO_InitTypeDef这结构体里面它指定了你要去设置哪一个引脚,哪一种模式,是否只能上拉下拉等等。

/**

  * @brief GPIO Init structure definition

  */

typedef struct

{

  uint32_t Pin;       /*!< Specifies the GPIO pins to be configured.

                           This parameter can be any value of @ref GPIO_pins_define */

 

  uint32_t Mode;      /*!< Specifies the operating mode for the selected pins.

                           This parameter can be a value of @ref GPIO_mode_define */

 

  uint32_t Pull;      /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.

                           This parameter can be a value of @ref GPIO_pull_define */

 

  uint32_t Speed;     /*!< Specifies the speed for the selected pins.

                           This parameter can be a value of @ref GPIO_speed_define */

} GPIO_InitTypeDef;

它的这个速度是什么意思?就比如说我们可以让这个引脚输出高电平,本来是低电平,对吧?但现在是变成高电平,这是理想的波形。我一去设置这个寄存器的时候,它的电平就从 0 瞬间变成高电平,它是实际是不可能的,所以你可以去控制这种转换的速度,就比如说你可以说,我控这个灯也不要那么着急,可以慢慢的变成高电平,这个坡痕很缓很慢,如下图上面波形。而如果在某些场合,你可能想比较快的,就从低电平变成高电平,这坡就很陡,如下图下面的波形。这就是设置不同的速度所产生的效果,这种速度有什么好处?你看如果这种波形从 0 变成1,变得很快的话,这个波形单很漂亮,很快就可以把这个灯给点亮了。但是这种对外的影响就很大,你想去测试各种电磁兼容性的时候,可能就过不了它。下图上面这种慢是慢点,我是缓慢变化的,这种对外的影响就比较小一点,各有优缺点。

 

 

好,这是插讲了一下HAL库,我们主要关心的是把某一个引脚配置成了输出引脚,然后我想让它输出高低电平,那怎么办?

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

GPIO_TypeDef *GPIOx这个是哪一组?GPIO_Pin是我要把这一组里面的哪一个引脚配置成 0 或者1。你看在HAL库里面,我们去写驱动程序的时候,我们就写了两个函数,你可以认为这就是驱动程序。这个驱动程序有什么缺点?缺点就在于一个写应用程序的人,我还得来深入分析你这个结构体,你不为难我吗?我只是一个写应用程序的人,我只想去关心我们公司的业务逻辑,比如说我去做这种自动售货机,我只关心这个用户有没有付了钱,付钱了之后就从那个柜子里面把产品给推出来,你既然要我去看这种结构体,这太为难我了,对吧?所以说这种封装,它的封装,这接口,它很贴近于这些寄存器,基本上装的寄存器级别的封装了,这种就不大适合给别人用。

 

  如果你们公司做的产品很复杂,你们公司分为写应用程序的人,写驱动程序的人,如果你直接把这套代码扔给别人用的话,别人就会骂死你。我让你写驱动程序干啥?我还得去研究一下这个硬件,还得去研究一下这寄存器,那我干脆我自己写就好了。第一,这个缺点就是,跟硬件太密切了,耦合太严重了,跟硬件的耦合太严重了。第二,干嘛呢?你看HAL库里面提供了这引脚的操作,在我这场景里面我想去操作灯,对,我写应用程序的人,我只关心怎么去设置这个灯就行了。我不关心是哪一个引脚,我也不关心它的输出高低电平,输出低电平还是输出高电平,我根本就不关心。那么你能不能够抽象出一个统一的接口给我?就比如说可能你给我去调用 led_init(), led_control(),这样的函数就可以,你看这种才是应用程序想用的,但是这种HAL_GPIO_WritePin也太为难人了,对吧?那么你能不能够提供一些稍微好的接口给我?你去以后去操作 LED 的时候,操作按键的时候,操作I2C的时候,我不不要求你提供这种独特的接口给我,我只要求你提供一些标准的接口,可不可以?就比如说在另外系统里面POSIX,这个接口什么含义?你们就去找。对这种接口我可以使用open,我可以打开某个文件,然后去读数据,去写数据,去执行某些比较特殊的操作。你看如果你支持这种接口的话,我的应用程序只去使用这些标准的接口就可以了。那如果你不想支持这种接口,对我们的RT-Thread来说,你对于不同的设备都给我提供一个 rtdevice, 用rt_device_find 找到这个设备,然后 rt_device_open 打开这个设备,然后 rt_device_read 去读这个设备,rt_device_write去写这个设备,rt_device_control去控制这个设备。

我需要你提供这种统一的接口,你能不能够做到?你看有你使用HAL库的话,对 GPIO操作,你有这种封装的接口函数,对于I2C操作你可能又是另外一样的函数,但是我想统一这接口的话,你就需要再引入一层,再引入另外一套就叫做驱动程序。

标签: #RT-Thread#

版权声明:
作者:p7885572
链接:https://www.dianziwang.net/p/1685ea367cbebb.html
来源:RTOS
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以点击 “举报”


登录 后发表评论
0条评论
还没有人评论过~