铭鸿体育资讯网

改个功能要刷固件,单片机开发太僵硬,不如试试JavaScript?

我做过不少单片机项目,最烦的就是改个功能就得重新编译固件烧录,流程又长又麻烦。后来发现可以用胶水语言,比如JavaScr

我做过不少单片机项目,最烦的就是改个功能就得重新编译固件烧录,流程又长又麻烦。后来发现可以用胶水语言,比如JavaScript,直接在芯片上跑脚本,改逻辑不用碰底层代码,一下把开发效率提上来了。

传统单片机开发,固件和应用是绑死的。你写个LED闪烁,要改闪烁频率,就得改C代码,编译,烧录,测试,一套下来半天没了。要是项目大点,版本号都得跟着变,维护起来头大。而且嵌入式工程师既要管硬件驱动,又要写业务逻辑,啥都干,沟通成本高,分工也乱。

后来有人搞了动态模块方案,就是把应用编译成独立的ELF文件,固件加载它运行。这能分离固件和应用,但需要固件导出API,开发复杂,调试也不方便。我觉得还是胶水语言更实在,直接在固件里嵌个脚本引擎,应用以脚本形式存在,改脚本就行,不用动固件。

胶水语言里,我研究过JerryScript和PikaScript。JerryScript是三星搞的,支持JavaScript,资源占用RAM 64KB以内,Flash 200KB以内,但官方好像不维护了,有点可惜。PikaScript是国内项目,支持Python,资源占用更小,RAM只要4KB,Flash 32KB,还在更新。选哪个得看资源,团队熟悉啥语言,还有生态,比如RT-Thread上集成JerryScript的多些。

我选的是JerryScript,在RT-Thread上跑。先装好RT-Thread环境,再添加JerryScript软件包,配好内存堆大小,比如32KB,还得搞个文件系统传脚本。初始化引擎就调用`jerry_init`,加载脚本用`jerry_parse`加`jerry_run`,脚本可以放字符串里,也可以存文件里读出来。测试时写个`console.log`,输出直接映射到串口,挺方便的。

最爽的是能把C函数导出给JavaScript调用。比如我写个`led_on`函数,用`jerry_create_external_function`注册,JS脚本里就能直接调`led_on()`控制LED。这就把硬件驱动和业务逻辑分开了,底层搞驱动的只管稳,上层搞应用的只管写脚本,分工明确。

这种模式让开发效率提升很明显。以前改个功能,要重新编译固件,至少半小时,现在直接改脚本,几秒钟搞定。固件版本几乎不变,应用版本单独管,回归测试也简单。而且支持热更新,通过OTA把新脚本传上去,设备不停机就能更新功能,物联网设备远程维护特别香。

当然也有挑战。脚本执行效率只有C的十分之一到五十分之一,不适合高频中断或实时控制,比如电机锁相环还得用C。内存也要注意,堆设小了脚本跑不了,得用`jerry_get_memory_stats`监控。还有安全问题,脚本可能死循环,得加看门狗限制。

总的来说,胶水语言是打破单片机传统开发模式的好办法,尤其适合应用层频繁变的物联网设备。JerryScript在RT-Thread上很成熟,推荐试试。实践下来,开发效率提升一半以上,固件更新频次降了八成。未来这模式会推动嵌入式开发更敏捷,连前端工程师都能搞硬件应用了。