lua开发笔记(1)

lua开发笔记(1)

单片机与lua

我第一次接触lua是几年前偶然发现了一个单片机(MCU)的开源项目——NodeMCU。这个项目很有意思,他的目的是让传统程序员(或者叫“主流程序员”)可以更加轻松地开发单片机的程序。

主流程序员开发的项目大部分是有操作系统来屏蔽硬件底层,无论是C、C++、java、C#还是PHP、PYTHON等等,开发完成后的程序都是跑在操作系统上的,例如Windows,Linux等等。操作系统对硬件提供统一的抽象接口,所以无论硬件的性能如何提升,只要操作系统对其的提供的接口不变,普通程序的开发基本都不用考虑硬件层面的问题。

单片机程序开发很长一时间内是主流程序员不会接触的项目。单片机这名字本身就起得很挫,但总体意思还是表达出来了,就是单件芯片可以完成的控制系统,也可以勉强叫SOC吧。单片机的硬件架构与PC大致还是相同的,一样有中央控制器、RAM、ROM(flash,程序空间)、外围硬件接口GPIO、UART、I2C、SPI、USB等。有兴趣的可以看以下链接:
MCU和CPU的区别,CPU、MCU、DSP三者之间的联系区别

单片机与MPU的区别是没有内存管理器,就是这个原因导致一般的操作系统(windows、linux)无法在单片机上运行。

很长一段时间以长单片机的性能是很弱的,弱到什么程度?就目前还有大量使用的8位单片机51系列为例(目前多用于遥控器等),号称最强的51单片机STC单片机只有8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,一般16MHz的运行频率。估计大家看到这个硬件配置都好无耐,然而这就是单片机,运算能力不是它的强项,它更强调的控制能力。这种单片机一年出货量是以亿级来计算的,当然单价也很低,也就几块钱一片。

我读大学时做实验用的8051单片机,比上述的性能还要差很多,以前写单片机程序还不能用C语言来写,因为C语言对这种老单片机而言还是太重了,只能用汇编,内存要自己算好分配来用,非常蛋疼。我试过写一个多位乘法,对,就是乘法本身,高级语言的“*”,汇编程序可以写满3个版面,真是感人肺腑。在8位机的年代,单片机的开发是硬件和软件一个人做的,因为程序部分一来是功能简单,二来要大量与硬件打交道,主流程序员没有硬件知识的储备。

好在科技进步了,现在的单片机的性能已经强大了很多,拿我目前最常用的,也是国内很普遍的STM32F1系列来说,首先终于是32位了,最高512K字节Flash,64K字节RAM, 最高72MHz的运行频率。这样的配置主流程序员当然也是看不上的,但对于单片机开发界来说,已经是天翻地覆的变化了。

首先来说,C语言现在是单片机开发界的首选语言了,汇编只需偶尔穿插一下,但是C++还是不常用,主要原因是C++一个对象的new就可以把内存干掉不少。然后是硬件性能已经可以在单片机上运行“实时操作系统”,例如FreeRTOS,RTX,MBed,UCOS等等,有了这种相对传统操作系统简陋不少的操作系统后,多任务多线程就可以很轻松地实现了。单片机的程序开发变得更加复杂、更加抽象,所以目前单片机的硬件开发和软件开发很多时候都不能一个人来完成了。

但即使这样,目前单片机程序开发还是必须与硬件打交道,你要直接操作寄存器(或使用单片机厂商的库)去控制硬件通道的作用,例如单片机引脚是输出还是输入等。甚至还要控制引脚的时序和电平,对电信号进行读写实现单片机与外围元器件的通讯。

以上都扯远了。。。

到了最近几年,单片机业界出了些搅局者。最早让我发现的是一种叫ESP8266的WIFI模块,对,就是单片机用的WIFI模块。普通的WIFI模块就是使用UART接口,让单片机通过AT指令以一问一答的方式实现WIFI数据连接,然而这种模块除了这种“正统”功能外,居然还能做二次开发!

他的官网是这样说的:
ESP8266EX 内置超低功耗 Tensilica L106 32 位 RISC 处理器,CPU 时钟速度最高可达 160 MHz,支持实时操作系统 (RTOS) 和 Wi-Fi 协议栈,可将高达 80% 的处理能力留给应用编程和开发。

这就很爆炸了,一片不足20元的模块,有160MHz的主频,还自带WiFi协议栈(搞过IP协议栈的同学就知道这玩意的复杂程度了),还能用RTOS,还有GPIO、UART等硬件接口,简直不能太碉堡。

当然这货有开发上的不足,最重要的是没有传统单片机的JTAG接口,无法使用常用的MDK、IAR等IDE做断点调试。

但是有了上述如此碉堡的性能和底层,还是有人心思活跃的,搞了NodeMCU这个开源项目:
点这里

他的用意我在本文第一段就说了,让硬件进一步的抽象化,同时使用lua这种脚本语言可以达到热更新的目的,让调试更爽。

自从有了这个开源项目,有些先烈还想把lua嵌入到STM32F1里面,嵌入当然不成问题,问题是STM32F1撑不起LUA,LUA对这种单片机而言还是太重了。

Python与lua

NodeMCU目前没有成为单片机开发的主流,我也没有入这个坑,单片机开发我还是用RTOS和C语言。

进入物联网时代后,我的开发项目一直是要求单片机与服务器有数据双向通讯,服务器还是嵌入式服务器,只能是linux系统。在普通Linux发行版上,跑Python是没有什么问题的,只要性能足够,Python的生态环境和跨平台的特性可以满足大部分项目的需求了。

结果就是这两年我把lua彻底忘了。

lua与Python相比,本身的设计没有那么健壮,生态环境也没有Python好,甚至是搭建开发环境也比Python麻烦得多,我认为lua的优点就是对硬件性能要求比较低。

直到最近,我发现了一些工业用的4G路由器,除了4G接入、路由器的常规功能外,还带有RS232、RS485、GPIO等工业通讯总线和输入输出接口后,我终于找到了lua的价值——在openwrt上做开发,性能要求低,又不用在linux上写C程序,还有跨平台的优势!

这个博客系列就当是我的openwrt与lua的入坑记录吧。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值