简介
假如您以某种方式遇到了micropython,在某个实例中爱上了它,然后订购了pyboard,甚至您可能已经为加急快递支付了额外费用。pyboard到达后,您变得像小狗一样兴奋。您使用了硬件,学习了如何使用加速度计,开关,LED和温度传感器,并通过I2C,SPI,USART或CAN接口与其他设备成功通信。您已将开发板插入计算机,然后在上面模拟出一个看起来失去方向感的鼠标把某人逼疯。您甚至试图将其除以零,只是为了查看芯片是否会起火(顺便说一句,这很恶心),并且注意到解释器巧妙地阻止了此类事件的发生。您已经编写了自己的python函数,甚至将它们编译成冻结的模块,然后将所有该死的东西烧录到微控制器上。然后,您已经对板载汇编器有所了解,因为您希望可以加速运行(但其实你不能)。
然而,在此之后您总感到有些不满意。您发现您想以一种特殊的方式访问外围设备,或者需要一些独特的函数,当在python本身中实现该函数时,它似乎会占用过多的RAM,并且需要很长的执行时间。由于局限性,使用汇编就很尴尬了。也许,你完全不想通过用python编写所有东西来使代码易于阅读,你想隐藏其中的魔力,只是为了让它更容易阅读。但是您仍然想保留python的优雅。
经过彻底的内省和深思熟虑之后,如果您发现自己身上的这些问题,则有两种选择:您感到绝望,放弃想法并继续前进;或者学习micropython如何在后台完成这些繁重的工作,用C语言编写自己的函数、类和方法。事实证明,一旦掌握了它,它并不难。唯一的窍门就是掌握它,这就是本文的目的。
在接下来的内容中,我想展示如何添加新功能并将其传递给python解释器。我将尝试以一种平易近人的方式讨论micropython的各个方面。每个概念都将在一个实现中呈现,并减少到最低限度,您可以立即进行编译并尝试一下。(这里的代码已经针对micropython v.1.11进行了测试。)在每一章的最后,我将完整列出所讨论的代码,并且还包括源链接,以便复制和粘贴而不用输入大量的代码。此外,我还提供了一个小示例,以便我们可以看到我们代码的效果。该代码以及该文档的源代码也可以在 https://github.com/v923z/micropython-usermod 下获得。最简单的入门方法可能是使用
git clone https://github.com/v923z/micropython-usermod.git
至于来源:您在这里看到的所有内容都来自一个Jupyter笔记本。没错,文档,C源代码,编译和测试,您可以在https://github.com/v923z/micropython-usermod/blob/master/docs/micropython-usermod.ipynb 找到这些笔记本 。您可能想知道,这一切都在MIT许可下。
我从一个非常简单的模块开始,然后逐步构建它。在讨论的最后,我将概述通用数学库的版本,类似于numpy。实际上,正是在我研究这个数学模块的时候,我才意识到,缺少一个关于micropython的编程指南,因此才有了本文档。显然,numpy是一个巨大的库,我们不会完整的实现它。但是我们将能够定义有效存储的阵列,在这些阵列上可以进行矢量化计算,处理矩阵,对其反转和收缩,将多项式拟合到测量数据并获得任意序列的傅立叶变换。我确实希望您觉得教程足以令人信服!
最后一句话:我相信,本文中的所有示例都可以在python本身中轻松实现,我绝对不主张在固件中包含这些琐碎的案例。我基于两个理由选择了这些示例:第一,它们都很简单,几乎是原始的,但是正是因为这个原因,它们展示了一个没有干扰的想法;其次,拥有一段并行的python代码是很有用的,因为它告诉我们期望什么,而且它还鼓励我们实现C语言版本,从而产生pythonic函数。
代码块
您将在本文档中遇到各种代码块。这些具有各种范围,如下所示:
如果代码块以感叹号开头,则该内容应在命令行上执行。
如果代码块看起来像一段python代码,则应在python解释器中运行。
如果代码块的标题是%%micropython,那么您猜对了,那么内容应该传递到移植的micropython解释器中。
其他代码段可以是C代码或makefile。这些都应该易于识别,因为这两个文件都有一个带有指向文件位置的链接的头部。
参考
在线版本
PDF版本
EPub版本