在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
作为一个嵌入式软件从业者,近几年的工作经历渐渐感觉到了从事嵌入式软件开发,工作投入高而产出低。提高工作效率的方法,笔者认为其之一是尽量避免使用C/C++语言进行嵌入式系统层面的开发,而是根据开发的具体系统功能,选择适合语言来开发。通常而言,C/C++的运行效率高而开发效率低,大多数脚本语言则运行效率不及使用C/C++开发的应用,而开发效率要高很多。 近来半载在“高人”的带领下,接触到了基于开源项目openwrt的嵌入式系统开发,而巧合的是openwrt系统的几个核心组件自带了Lua脚本编程接口;在接触openwrt之前我也浅略地学过Lua语言,并在工作实际中运用了Lua语言脚本。Openwrt开源项目中的ubus/uloop,是一个进程间通信的组件,可以很大程度上加速多进程项目的开发;此外openwrt还可以为我们编译zeromq及其Lua接口,这几点促使笔者使用openwrt编译了嵌入式Lua开发环境,并测试在安卓手机可以正常运行:这样就可以通过SSH连接到手机上进行一些简单的Lua脚本开发了。 该Lua开发环境也可以运行在常见的嵌入式ARM/Linux系统上,虽然笔者未曾测试过。除了openwrt的几个核心组件(ubus/uloop/uci等)它还集成了以下Lua库,基于笔者的经验,基于这些Lua库可以完成绝大多数的嵌入式系统服务的开发工作: Lua-cjson/luabitop/lua-openssl/luasocket/luaposix/luasql/lzmq。
笔者使用的openwrt 版本为19.07。作为一个通常用于开发路由器、网关的开源项目,它通常会禁用交叉编译器的软浮点支持,需要修改两处使能ARM平台的硬浮点支持,首先,为bcm53xx平台添加浮点计算的配置: 之后,修改交叉工具链的后缀名: 然后,执行make menuconfig选中bcm53xx芯片平台,并清除大部分不需要编译的软件包,仅保留我们需要的与Lua相关的软件包: 最后,确认生成的.config文件中,软浮点支持是被禁用了的(CONFIG_SOFT_FLOAT is not set): 这样就可以编译openwrt了。注意到我们清除了太多的我们不需要的软件包(包括openwrt默认选译的一些软件包),最终编译openwrt失败,仅管我们所需要的,与Lua相关的软件包都编译成功了: 编译完成后,我们对根文件系统root-bcm53xx建立一个Git仓库,下面的工作就是需要对这个仓库进行修改,以将其制作成我们想要的Lua开发环境:
由于我们只选择了Lua相关的软件包,编译得到的根文件系统中的文件是比较少的,当然也与根文件系统很多文件夹是空文件夹相关: 除了删除一些不需要的文件外(如openwrt编译出来的内核驱动模块等),笔者编写了三个简单的shell脚本(这三个脚本均可以在压缩包中找到;暂时未上传至服务器),记录了对ELF可执行文件及一些动态库的修改,主要目的是为了让该Lua开发环境能在任意设备上正常运行。 首先,修改可执行文件的动态链接器,修改为/lia目录下的ld-linux-armhf.yejq: 其次,修改/usr目录为/usa目录,以避免在ARM/Linux系统上与现有的文件系统上的/usr目录冲突: 最后,修改动态链接器ld-2.27.so,将环境变量解析时的LD_更改为LA_;同时将/lib目录修改成为/lia,这样动态链接器不会受以LD_为前缀的环境变量的影响,也不会从/lib:/usr/lib目录下寻找动态库文件(而会从/lia:/usa/lia目录下寻找动态库): 至此,Lua开发环境的二进制文件修改就结束了。这三点应当能够保证它能在很多嵌入式ARM/Linux上正常运行。由于64位ARM处理器也能够加载32位的ARM应用,它也应该能够在64位ARM平台上运行。需要注意的有两点,一个是时间相关的,Lua应用在获取系统时间时,会访问/etc/localtime时区数据文件,这个在开发环境中是没有的,需要使用者自己去解决;另一个是与网络解析相关的,需要访问/etc/resolv.conf文件,这个文件也是没有的,可以手动添加。笔者后继会完善这个Lua开发环境(暂时不上传),但不会更新此博客。如果有需要的可以发邮件至[email protected],笔者会将安装的压缩包发过去(不需积分^_^)。
笔者没有编写的安装脚本,下图是笔者在安卓手机上的安装过程: 安装完成后,可以试着运行一下,Lua解析器可以正常加载一些模块,如lzmq等: 至此,我们就可以在安卓手机或非openwrt-based的嵌入式ARM/Linux设备上开发简单的Lua系统服务了。 |
请发表评论