RTThread IO组件 GPIO

本文主要了解GPIO的实现

  • drv_gpio.c文件的粗略分析

drv_gpio.c文件的粗略分析

在menuconfig图形配置中,我们可以看到components->Device Drivers->using generic GPIO device drivers中有开启。该文件只管一般的GPIO配置,不包括外设复用配置。
进来首先看到pin[]的声明,这里将IO口抽象为编号。我们使用就是利用这个数字,如果使用iic组件的话会看到需要输入两个引脚的编号,这个编号就是指这个数字,可以使用GET_PIN(H, 10)快速获得引脚编号。

中断映射表没什么好说的。
继续看会发现一连串stm32_pin_xxx函数 这些pin函数放到了

const static struct rt_pin_ops _stm32_pin_ops = 
{
	stm32_pin_mode,
	stm32_pin_write,
	stm32_pin_read,
	stm32_pin_attach_irq,
    stm32_pin_dettach_irq,
    stm32_pin_irq_enable,
}

个人思考
这里组合成对用ops接口。从裸机过来的我以前估计会写出
void xxxx_band(device_t x, void (*punc)(…));这样的形式,一对比这种方法还是比较合适的
如果换芯片直接将对应的底层改了就行。而且全是const。不占RAM。
这种方法在RTThread是很常见的结构。那么我们阅读时就需要明白上部分是底层,下部分是抽象成的东西。如果要弄清楚调用就可以直接快速查阅ops,省略不值得关注的东西。

对应的自己写模块也可以抽象一下。比如我要做1个脚,有两个关节。每个关节1个电机和传感器。那么脚的模块要独立式编译就必须抽象控制关节的api,关节必须完成脚的抽象,同时又必须抽象电机和传感器的api。电机有很多种,foc,步进等,传感器有更多了。这些部分同样要完成关机的抽象,另外要将对应的共同点整合起来,继续抽象。而电机和传感器的下层是对应实际的电机和传感器,则可以参考RTThread中的这种写法来达成。

这样就层层拆分了出来,不过即使如此问题仍然很多。比如接口如何设计,是根据最简接口来设计还是全面设计。如何实现策略模式,毕竟模块化设计不能实现策略模式太浪费。例如联网这种可以能使用有线网,有可能使用wefi。具体应用层只需要执行切换协议栈就可达成目的而不是重新在新建一个实例。

继续看文件
rt_device_pin_register将ops注册了上去。然后看了这个函数,发现很多接口赋值的RT_NULL,这里直接以为是接口就要合理实现,现在看来不通用化,不使用的可以直接为空。比如传感器的我们可以只设计init和read接口即可。这方便进行快速开发。

后在接下来就是中相关的东西。每个中断中都调用了rt_interrupt_enter和rt_interrupt_leave。

总结
本次大略摸清了RTThread 的 drv_gpio的编写套路以及一些设计规则。接下来继续分析几个文件看是否靠谱。

你可能感兴趣的:(RTThread学习)