最近在使用树莓派与其他设备通过SPI
接口进行通信,使用一个GPIO
管脚触发读取数据的信号,为了简化开发,使用了Python
。
在实际运行过程中,发现当长时间运行的是,会出现中断管脚信号丢失的情况,在参考 Ubuntu 16.04 (x64)下从源代码为Raspberry Pi Zero W编译实时内核 更换为实时内核之后,短时间运行已经可以正常,但是在十几个小时之后,依然出现了中断丢失的现象。
这个现象初步评估为Python
的GC
动作时间过长导致的中断信号丢失。Python
本身并不是为实时系统设计的,因此在GC
进行垃圾回收的时候,是没有实时性的考虑的,因此在严格要求实时性的系统环境下,不是非常的合适。更何况很多的IO
操作默认都是阻塞的,更加容易导致实时性问题。
由于树莓派本身也是支持Lua
脚本的,默认安装的Lua
引擎默认是5.1.4
。Lua
本身在游戏中使用较多,而游戏本身对于实时性的要求是很高的。
尤其是Lua 5.1
开始使用最新的GC
已经能很好的解决实时性问题。
关于Lua
的GC
相关信息,参考如下的文章:
正是由于对于GC
的特殊要求,导致我们在实时系统上能选择的脚本非常有限。
目前的评估来看,貌似Lua
差不多成为唯一的选择了。
以下操作在如下系统版本上进行过可行性验证:
具体的使用方法如下(对于Raspberry Pi Zero W
如果已经设置成AP
模式,建议外接USB
有线网卡操作):
控制GPIO
的例子如下:
控制GPIO
边沿触发(阻塞等待)的例子如下:
控制SPI
的例子如下:
使用ZeroMQ
的例子(PUB-SUB
)如下:
使用ZeroMQ
的例子(PAIR-PAIR
,线程之间一对一通信,类似信号量)如下:
使用Copas
的例子如下:
使用Copas
与ZeroMQ
结合的例子如下:
使用dkjson
的例子如下:
参考链接
- Lua Garbage Collection
- Using MicroPython for real-time software development
- MicroPython
- Lua In Real Time Programs
- Python or Lua - Realtime application
- RPi.GPIO.Lua
- Garbage Collection In Real Time Games
- Lua module for Raspberry Pi
- Lua 5.1 Reference Manual
- Multi Tasking
- ZeroMQ Get The Software
- Sending message from Lua Thread #505
- Multithreaded service in Lua
- ZeroMQ Guide with Lua examples
- zmq_inproc – ØMQ 本地进程内(线程间)传输方式
- zeromq模式介绍
- Coroutine Oriented Portable Asynchronous Services for Lua
- lua杂记01--链表
- Can lua-zmq make ZeroMQ work with Lua-Coroutine?
- 第五章 常用Lua开发库2-JSON库、编码转换、字符串处理
- lua bson 库
- BSON generator/parser in pure Lua (5.1)
- ZeroMq Lua bindings
- LuaStruct
- UlisseMini/luaStruct
写的非常好,lua确实是很好的可行方案
文章相当不错