树莓派实时系统下脚本语言的选择(应当使用Lua而不是Python)

最近在使用树莓派与其他设备通过SPI接口进行通信,使用一个GPIO管脚触发读取数据的信号,为了简化开发,使用了Python

在实际运行过程中,发现当长时间运行的是,会出现中断管脚信号丢失的情况,在参考 Ubuntu 16.04 (x64)下从源代码为Raspberry Pi Zero W编译实时内核  更换为实时内核之后,短时间运行已经可以正常,但是在十几个小时之后,依然出现了中断丢失的现象。

这个现象初步评估为PythonGC动作时间过长导致的中断信号丢失。Python本身并不是为实时系统设计的,因此在GC进行垃圾回收的时候,是没有实时性的考虑的,因此在严格要求实时性的系统环境下,不是非常的合适。更何况很多的IO操作默认都是阻塞的,更加容易导致实时性问题。

由于树莓派本身也是支持Lua脚本的,默认安装的Lua引擎默认是5.1.4Lua本身在游戏中使用较多,而游戏本身对于实时性的要求是很高的。

尤其是Lua 5.1开始使用最新的GC已经能很好的解决实时性问题。

关于LuaGC相关信息,参考如下的文章:

正是由于对于GC的特殊要求,导致我们在实时系统上能选择的脚本非常有限。

目前的评估来看,貌似Lua差不多成为唯一的选择了。

以下操作在如下系统版本上进行过可行性验证:

具体的使用方法如下(对于Raspberry Pi Zero W如果已经设置成AP模式,建议外接USB有线网卡操作):

控制GPIO的例子如下:

控制GPIO边沿触发(阻塞等待)的例子如下:

控制SPI的例子如下:

使用ZeroMQ的例子(PUB-SUB)如下:

使用ZeroMQ的例子(PAIR-PAIR,线程之间一对一通信,类似信号量)如下:

使用Copas的例子如下:

使用CopasZeroMQ结合的例子如下:

使用dkjson的例子如下:

参考链接


发布者

《树莓派实时系统下脚本语言的选择(应当使用Lua而不是Python)》上有2条评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注