micropython 用c添加接口——框架介绍
micropython留给用户的是python的接口,语法规则也是遵循python的。有时候我们想自己添加自己的python接口。有两种方法:第一种在官方的python接口之上直接使用python的语法写自己的python脚本来实现相应的功能,这种方式比较简便,无需自己编译micropython的代码 ,但是缺点就是可扩展性有限,有些偏底层的功能单纯用python接口无法完成;那么就还有第二种自己基于micropython的代码用c写底层的实现然后留出来python的接口。我会写几篇文章来深入聊一下第二种方法,用c语言扩展micropython的接口。
首先从代码上看,添加自己的接口只用关注micropython项目下的ports文件夹,github地址在这里:https://github.com/micropython/micropython/tree/master/ports 这个文件下下面可以看到有stm32、esp32 、esp8266等平台。你使用的是哪种平台,只用去关注对应的文件夹里面的内容就可以了。当然如果自己想把micropython移植到自己的平台可以在ports下新建自己的平台文件夹,然后移植对应的代码,但是这里不做探讨, 因为我也还没有研究到那么深入去。
我自己是基于esp32 来添加接口的。所以就只关注ports/esp32文件夹下的代码就可以了。可以看到里面很多文件,我们自己要添加c语言接口要修改哪些文件?c语言的函数如何和python语言对接?这在后面的文章我会慢慢写。这篇文章先聊聊整个框架,我们把需要实现的类型搞明白,添加一个接口就只是照葫芦画瓢而已。
我自己总结了一张图,可以清晰的看出来我们实现的接口的分类:
从图中可以看出来我们实现的接口分为三大类:module、type、function。这几类的关系也很明显可以看得出来。module在python层是一个比较大的类,比如esp32 里面的machine,在module下面会有function和type两种类型,machine.Pin 和machine.UART 都属于type类型。在type类的下面就是具体的函数了,比如Pin.value() 用来设定io的高低电平。
在运行的有micropython的esp32串口交互中,可以输入type(machine) type(machine.Pin) type(machine.Pin.value) 分别查看下他们的类型,如下图所示:
有了这个分类,之后我们实现的c语言接口就只用把这三种类型先进行划分,再用c语言套用对应的实现代码就可以了。后面文章我会讲用c代码如何定义module、type和function以及python代码中的函数参数如何和c语言函数的参数对应起来。