在平时编写arduino程序时,我们都是编写的C/C++语言程序。可是Arduino开发板认识这些C/C++程序吗?很显然是不认识的,所以才需要Arduino软件来将这些源代码“翻译”成Arduino认识的二进制指令才能上传到Arduino执行。这个过程叫做编译,在你点击“上传”按钮的时候就会自动完成。
我们要做的脚本解释器实现的就是一个翻译功能,它能将我们编写的高级语言程序翻译Arduino认识的指令进而直接执行,这样我们就不需要Arduino软件了,只需要通过串口不断的向Arduino发送代码,Arduino里面的脚本解释器就能不断的读取代码并自动翻译执行了。你也可以将代码存储到sd卡里面,Arduino直接读取sd卡里面的代码就可以执行。
PS:其实我们平时用的python就是一种脚本解释器,它能将python代码不断翻译成CPU认识的指令并执行。(当然,我们在arduino上制作的脚本解释器肯定不会有python那么强大的,arduino那仅仅几十K的ROM也不允许我们做出很厉害的解释器)
如果您到此步你依然不知道什么是脚本解释器的话,建议您还是不继续阅读下去了,或者是先去搜索一波,网上的很多文章讲的都非常好。
二、Arduino上的“脚本解释器”是什么样的首先我们来看arduino有多大的存储空间,就以arduino uno来看其Flash只有32KB,RAM也只有仅仅的2KB,所以为了能在这么小的空间里面容纳一个脚本解释器,此解释器必须要足够小。所以像python、javascript、lua解释器那种是不可能的了。(如果你想在MCU上运行python解释器,那么建议使用esp8266等开发板,我之前有一篇文章专门讲了这个)
三、几种方案(排名越靠前的代表越推荐) 1、Bitlash:(语法类似于C,帮助文档比较全)Bitlash是一个专门针对于arduino的脚本解释器,帮助文档比较完善(相比于下面推荐的解释器)所以非常推荐。Bitlash可以从串口接收脚本命令并运行。
Bitlash的特性主要有:
- arduino很多的库函数在bitlash里面都有对应的,例如引脚控制、PWM输出、millis函数、数学函数。函数定义、if、while、switch等语句支持C语言里面大多数的运算符支持后台运行自定义函数,并且能将自定义函数存储到EEPROM中提供用于扩展的API(个人觉得已经很完善了,几乎不用扩展了)
这里只是简单的列举了Bitlash的部分特性,其实Bitlash最主要的还是具有完善的帮助文档,这一点我觉得才是最重要的,同时Bitlash占用的ROM也很低,所以非常推荐。
如果想使用Bitlash的话可以去官网下载,同时官网有非常多的教程和文档,地址为:
http://bitlash.net/2、elk:(可嵌入的javascript的脚本引擎,易于扩展)
elk是一个微小的可嵌入的javascript的脚本引擎,它并不是完成的javascript(就arduino那点存储空间来看,表示很理解) elk仅仅实现了while,if等控制语句,同时支持函数定义和对象,不支持数组。elk的api比较简单易懂,可以使用api导入自定义的函数来实现对arduino的底层控制
如果想使用elk的话可以去github上下载,地址为:
https://github.com/cesanta/elk
或者也可以直接在Arduino里面搜索elk库就可以使用了,如下,此库带有一些示例可以直接上传到Arduino即可运行:
3、自己写一个
哈哈,你没看错,就是自己写一个解释器。如果只是实现简单的流程控制的话,自己写一个的难度不是很难的。
我自己写了一个仅仅支持简单的while、if、for语句的微型解释器,说实话自己写的话真的能加深一些算法的理解,帮助还是很大的。
PS:由于目前还不完善,就等我调试好后放在下一期来讲吧
四、写在最后
除了上述讲到的Bitlash、ELK,网上还有很多开源大佬编写的解释器,不过如果是在arduino uno上面运行的话个人还是推荐前面两个,所以在这里就不一一列举啦,同时如果你的开发板是stm32性能比较强的MCU的话呢,推荐去试试Lua语言,Lua语言其本身就设计为一种可以嵌入的语言,所以其解释器也非常小,网上有很多将Lua移植到stm32的案例。
本文只是简单的列举了几个方案,之后我打算出一些具体的教程,可能也是对解释器比较感兴趣吧哈哈,另外文章中难免会存在疏忽和错误,也欢迎大家批评指正。觉得有帮助的话点个赞呗~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)