新闻详情

新闻详情

首页 / 资讯中心 / 详情

在 Mbed OS 上运行 JerryScript:FRDM-K64F 从零构建、烧录与串口验证实战指南

发布时间:2026/9/28 17:28:58来源:尧图网络
在 Mbed OS 上运行 JerryScript:FRDM-K64F 从零构建、烧录与串口验证实战指南
语言运行时嵌入式物联网编译器【免费下载链接】jerryscriptUltra-lightweight JavaScript engine for the Internet of Things.项目地址https://gitcode.com/gh_mirrors/je/jerryscript点击查看免费下载本篇指南围绕 JerryScript 仓库中的 Mbed OS 移植目标targets/os/mbedos展开完整讲解如何在 Ubuntu 20.04 环境下把超轻量级 JavaScript 引擎 JerryScript 与 ARM Mbed OS 6.15.0 组合编译为 FRDM-K64F 开发板固件并通过 ST-Link 烧录、串口终端运行出第一行Hello, World!。读完本文你将掌握 Mbed OS 移植目标的目录结构、构建参数板型 / 工具链 / 堆大小的调整方法、make构建与烧录的完整命令链以及移植层jerry-port.cpp与主程序jerry-main.cpp的底层实现原理。一、目标平台与整体思路targets/os/mbedos是 JerryScript 官方为FRDM-K64F 开发板 Mbed OS 实时操作系统提供的移植目标目录。FRDM-K64F 是恩智浦NXP推出的 Kinetis K64FARM Cortex-M4F评估板通过板载 OpenSDA 调试器以 USB 直连主机Mbed OS 则是 ARM 主导的物联网嵌入式操作系统提供串口、定时器等抽象层。整个移植思路分三步将 JerryScript 引擎源码与 Mbed OS 源码放在同一工作目录如jerry-mbedos下用仓库自带的移植层文件jerry-main.cpp、jerry-port.cpp把引擎“接”到 Mbed OS 的串口与时间服务上通过mbed-tools compile产出.bin固件烧录进开发板后用串口终端观察 JS 执行结果。该目录包含 7 个文件职责划分如下文件作用Makefile封装mbed-tools compile提供make/make flash/make clean目标及板型、工具链、堆大小等参数Makefile.travis供 CITravis验证用的构建目标也适合在本地复现自动化构建jerry-main.cpp移植目标的主程序初始化引擎、注册print、解析并执行 JS 脚本jerry-port.cpp引擎移植层Port API实现致命错误、日志输出、本地时区、当前时间mbed_lib.jsonMbed 库配置向编译期注入 JerryScript 全局堆大小宏mbedignore.txtMbed 构建排除清单避免把无关目录编入固件README.md官方构建与烧录说明本文主体二、搭建构建环境Step 1官方文档验证于Ubuntu 20.04操作系统。首先在工作目录下建立jerry-mbedos文件夹并克隆两个项目JerryScript 本体以及指定版本分支的 Mbed OS。文档明确给出的最新测试可用版本为mbed-os-6.15.0。mkdir jerry-mbedos cd jerry-mbedos git clone https://github.com/jerryscript-project/jerryscript.git git clone https://github.com/ARMmbed/mbed-os.git -b mbed-os-6.15.0克隆完成后应得到如下目录结构jerry-mbedos jerryscript | targets | os | mbedos mbed-os需要说明的是克隆 JerryScript 时若使用本仓库gh_mirrors/je/jerryscript作为源码根目录构建时其路径即对应上述结构中的jerryscript目录Makefile 通过JERRY_ROOT_DIR $(realpath $(JERRY_TARGET_DIR)/../../..)见 Makefile自动定位引擎根目录因此目录相对位置必须保持targets/os/mbedos位于引擎根目录之下且与mbed-os平级。三、安装构建依赖Step 2在jerry-mbedos目录下依次执行依赖安装。首先是 JerryScript 自带的依赖脚本然后是 ST-Link 烧录工具与 Mbed 命令行工具链# Assuming you are in jerry-mbedos folder. jerryscript/tools/apt-get-install-deps.sh sudo apt install stlink-tools pip install --user mbed-cli # Install Python dependencies of Mbed OS. pip install --user -r mbed-os/requirements.txt各依赖的作用如下tools/apt-get-install-deps.shJerryScript 仓库自带的 Ubuntu 依赖安装脚本位于 tools/apt-get-install-deps.sh负责安装构建所需的编译工具链等基础软件stlink-toolsST-Link / OpenSDA 烧录工具FRDM-K64F 板载调试器即 OpenSDA通过该工具完成固件写入mbed-cliMbed 命令行工具老版本mbed-cli新版本项目亦使用mbed-tools见 Makefile 中的mbed-tools compilembed-os/requirements.txtMbed OS 的 Python 依赖清单包含编译配置所需的jsonschema、pyyaml等包。此外CI 流程Makefile.travis展示了等效的依赖安装方式pip3 install mbed-tools setuptools并安装../mbed-os/requirements.txt可作为脚本化部署的参考。四、编译固件Step 3依赖就绪后在jerry-mbedos目录下执行# Assuming you are in jerry-mbedos folder. make -C jerryscript/targets/os/mbedos MBED_OS_DIR${PWD}/mbed-osMBED_OS_DIR用于告知 Makefile 去哪里找 Mbed OS 源码。整个构建链路在 Makefile 中清晰可见.extra-files-copy把mbedignore.txt复制为引擎根目录下的.mbedignore、把mbed_lib.json复制为根目录下的mbed_lib.json让 Mbed 构建系统读取这些配置.mbed-build调用mbed-tools compile并携带--clean --mbed-os-path $(MBED_OS_DIR) --program-path $(JERRY_ROOT_DIR) --toolchain $(TOOLCHAIN) --mbed-target $(BOARD) --app-config $(JERRY_ROOT_DIR)/mbed_lib.json参数.extra-files-remove构建结束后清理临时复制的两个文件。构建完成后固件输出为jerryscript/build/mbed-os目录下的mbedos.bin文件可直接用于烧录。4.1 可调构建参数Makefile 顶部定义了四个可用变量Makefile变量默认值含义BOARDK64FMbed 目标板型号默认 FRDM-K64F可替换为其他 Mbed 支持板型TOOLCHAINGCC_ARM编译工具链默认 ARM GCCBUILD_DIR$(JERRY_ROOT_DIR)/build/mbed-os构建产物输出目录可通过命令行覆盖JERRY_HEAP_SIZE70JerryScript 全局内存堆大小单位 KBJERRY_HEAP_SIZE通过 mbed_lib.json 中的macros: [JERRY_GLOBAL_HEAP_SIZE70]注入编译宏。从引擎侧看config.h 中该宏的默认值是512KB而 Mbed 移植目标将其缩减为70KB这是为适应 K64F 的 256 KB SRAM 所做的内存预算。修改堆大小时只需更改mbed_lib.json中的宏值注意引擎在 config.h 中会校验该宏必须大于 0堆大小最终通过CONFIG_MEM_HEAP_SIZE (JERRY_GLOBAL_HEAP_SIZE * 1024)见 jcontext.h换算为字节数参与内存分配。4.2 mbedignore.txt 的作用Mbed 构建系统默认会扫描程序根目录即 JerryScript 引擎根目录下的全部源码而 JerryScript 仓库含有大量与 Mbed 无关的目录cmake、docs、tests、tools 等。mbedignore.txt 通过cmake/*、docs/*、jerry-main/*、jerry-math/*、targets/*、tests/*、third-party/*、tools/*这 8 条规则将这些目录排除出编译范围从而显著缩短编译时间、避免无关代码进入固件。五、烧录固件Step 5用 Micro-USB 线连接开发板该接口同时承担充电与烧录功能在jerry-mbedos目录下执行# Assuming you are in jerry-mbedos folder. make -C jerryscript/targets/os/mbedos MBED_OS_DIR${PWD}/mbed-os flashflash目标在 Makefile 中实现先通过.mbed-set-flash-flag给MBED_CLI_FLAGS追加--flash参数再执行正常构建mbed-tools compile --flash会调用stlink-tools把mbedos.bin写入板载调试器连接的 K64F 芯片。六、串口连接与运行验证Step 5烧录完成后开发板会在宿主机上显示为串口设备/dev/ttyACM0。使用minicom以115200波特率连接sudo minicom --device/dev/ttyACM0 --baud115200连接后需要做两件事在 minicom 中按组合键CTRL-A - Z - U打开Add Carriage Ret回车符自动追加选项——由于移植层日志输出只发送\n终端需要该选项才能正确换行按下开发板上的RESET按钮触发固件重新运行。复位后串口终端将打印 JerryScript 应用输出This test run the following script code: [print (Hello, World!);] Hello, World!第一行是主程序用调试级别日志打印的待执行脚本源码第二行Hello, World!则是脚本中print调用在串口上的真实输出证明 JS 引擎已在 Cortex-M4F 上完整跑通。七、源码级解析Hello World 背后的移植实现7.1 主程序 jerry-main.cppjerry-main.cpp 演示了在嵌入式平台上使用 JerryScript C API 的完整生命周期可视为最小可运行的引擎调用范式jerry_init (JERRY_INIT_EMPTY)初始化引擎空初始化不启用快照等特性jerry_log (JERRY_LOG_LEVEL_DEBUG, This test run the following script code: [%s]\n\n, script)打印待执行脚本jerryx_register_global (print, jerryx_handler_print)调用 jerry-ext 扩展层jerryscript-ext/handlers.h把print注册为全局函数其实现会把参数转成字符串输出jerry_parsejerry_run先解析脚本生成可执行代码再在全局作用域执行用jerry_value_is_exception判断执行是否出错据此返回0成功或1失败jerry_value_free释放返回值最后jerry_cleanup ()清理引擎。串口输出最终落到 stderr 上——这是由移植层的jerry_port_log决定的见下节因此在 minicom 中看到的就是print与jerry_log混排的输出。另外jerry-main.cpp 中根据MBED_MAJOR_VERSION区分了 Mbed OS 5 与 6 的串口类版本 5 使用Serial版本 6 使用BufferedSerial均以 115200 波特率初始化未支持版本会触发#error编译失败。7.2 移植层 jerry-port.cppjerry-port.cpp 实现了 JerryScript 要求宿主机提供的 Port API接口定义见 jerryscript-port.h共四个函数jerry_port_fatal致命错误处理直接以错误码调用exitjerry_port_log日志输出实现——逐字符写入 stderr并在每个\n前追加\r这正是文档要求在 minicom 中开启Add Carriage Ret的原因若终端侧不补\r\n会被终端解释为仅换行不回车导致输出错位jerry_port_local_tza本地时区偏移嵌入式环境固定返回 0即 UTCjerry_port_current_time当前时间毫秒级是移植中最精妙的部分——它以time(NULL)提供秒级基准以us_ticker_read()提供微秒级增量由于us_ticker_read()约每 71 分钟UINT_MAX微秒溢出一次代码用静态变量记录上一次的 tick 与 time检测到 tick 回绕时累计33ms的校正量skew见 jerry-port.cpp从而在无独立定时器线程的 MCU 上维持可用的毫秒级时钟。正是jerry_port_current_time等底层服务支撑起 JS 侧Date对象、setTimeout类功能若上层脚本使用的时间来源。八、自动化构建参考CI 流程如需在脚本或 CI 中复现整个流程可参考 Makefile.travis 的目标拆解install-mbedos克隆指定分支的 Mbed OS示例中使用mbed-os-6.17.0README 主体则以6.15.0为准clone 到../mbed-osinstall-mbedos-deps安装mbed-tools、setuptools及 Mbed OS 的 Python 依赖script执行make -C targets/os/mbedos MBED_OS_DIR$(realpath ../mbed-os)完成编译。注意 CI 使用的是新版mbed-toolspip3 install mbed-tools而 README 中安装的是旧版mbed-cliMakefile 的构建命令始终是mbed-tools compile因此若你的环境同时存在两者建议优先使用mbed-tools以保证与 Makefile 调用一致。九、常见问题与调参建议固件找不到确认构建命令带有MBED_OS_DIR${PWD}/mbed-os且目录结构符合第二节产物固定输出在jerryscript/build/mbed-os/mbedos.bin。串口无输出检查是否开启了 minicom 的Add Carriage RetCTRL-A - Z - U并确认波特率为 115200jerry_port_log输出走 stderr某些串口工具需开启“合并 stderr”或直接观察全部输出。编译缓慢 / 无关代码被编译确认.mbedignore已由 Makefile 自动复制到引擎根目录mbedignore.txt内容见 mbedignore.txtmake clean会清理build/mbed-os及临时复制文件。内存不足 / 脚本过大调整 mbed_lib.json 中的JERRY_GLOBAL_HEAP_SIZE单位 KB须大于 0见 config.h同时权衡 K64F 的 256 KB SRAM 预算。更换开发板通过make ... BOARD板型覆盖默认的K64F并确保该板型在 Mbed OS 中被支持。至此你已经完成了从源码克隆、依赖安装、固件编译、烧录到串口运行的全部闭环并且在源码层面理解了 Mbed OS 移植目标中主程序、移植层与构建脚本的协作方式——这套流程同样适用于后续在 Mbed OS 平台上接入其他 JerryScript 应用逻辑如 GPIO 控制、传感器读取等物联网场景的二次开发。赞分享语言运行时嵌入式物联网编译器【免费下载链接】jerryscriptUltra-lightweight JavaScript engine for the Internet of Things.项目地址https://gitcode.com/gh_mirrors/je/jerryscript点击查看免费下载相关推荐在 ESP32 上运行 JerryScript基于 ESP-IDF 的构建、烧录与串口验证全指南在 ESP32 上运行 JerryScript基于 ESP IDF 的构建、烧录与串口验证全指南 JerryScript 作为面向物联网的超轻量级 JavaS语言运行时嵌入式物联网编译器JerryScript 在 RIOT OS 上的嵌入式移植STM32F4-Discovery 从构建、烧录到运行完整指南JerryScript 在 RIOT OS 上的嵌入式移植STM32F4 Discovery 从构建、烧录到运行完整指南 本文基于 JerryScript 官语言运行时嵌入式物联网编译器Zephyr 在 Qualcomm QCC744M EVKqcc744m_evk评估板上的构建、烧录与串口调试实战指南Zephyr 在 Qualcomm QCC744M EVKqcc744m_evk评估板上的构建、烧录与串口调试实战指南 Qualcomm QCC744M 评操作系统嵌入式RTOS物联网上一篇NssMPClib的安装与使用教程下一篇【热门开源项目下载】ClkLog用户行为分析系统全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Sqoop导入HDFS全量覆盖:--delete-target-dir参数机制与最佳实践 2026/9/28 18:54:53

Sqoop导入HDFS全量覆盖:--delete-target-dir参数机制与最佳实践

1. 一次数据覆盖事故引发的思考:Sqoop导入为何总要和“已存在的目录”较劲先说个我自己的经历,挺典型的。早年间我第一次用Sqoop做MySQL到HDFS的全量导入,命令写好后第一次执行很顺利,数据乖乖落进了HDFS的指定目录。等第二天数据…

阅读更多 →
设备偶发掉线排查全攻略:从物理链路到应用层的系统化方法论 2026/9/28 18:54:47

设备偶发掉线排查全攻略:从物理链路到应用层的系统化方法论

1. 先搞清楚"偶发掉线"到底难在哪设备偶发掉线、重启后恢复,这个现象在运维圈里有个很形象的说法叫"幽灵故障"。它最让人头疼的地方不在于故障本身有多复杂,而在于它的不可复现性——你去现场的时候它好了,你一走它又犯了…

阅读更多 →
Jetson黑屏故障排查:从rc.local到systemd的启动链诊断指南 2026/9/28 18:54:47

Jetson黑屏故障排查:从rc.local到systemd的启动链诊断指南

1. 项目概述:Jetson开机黑屏不是“死机”,而是系统启动链上某个环节的静默失败Jetson系列开发板——Nano、Orin Nano、Orin NX、AGX Orin——这几年在边缘AI部署场景里几乎成了标配。但凡做过Jetson项目的人,大概率都经历过那种“通电、风扇转…

阅读更多 →
OpenClaw安装排错笔记:Windows下Node.js与npm环境配置TaoToken接入 2026/9/28 18:54:46

OpenClaw安装排错笔记:Windows下Node.js与npm环境配置TaoToken接入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
嵌入式驱动开发实战:设备树、固件加载与调试全解析 2026/9/28 18:54:27

嵌入式驱动开发实战:设备树、固件加载与调试全解析

1. 嵌入式驱动开发到底在忙什么很多人对嵌入式驱动开发这个岗位有误解,觉得就是对着芯片手册抄寄存器、写写初始化代码,或者认为它跟应用层开发比起来更“底层”所以更枯燥。我做了十多年嵌入式,从早期的裸机开发到后来完整的Linux BSP维护&a…

阅读更多 →
在线教程丨Qwen3-Coder-Flash 配 TaoToken:settings.json 骨架与 Agentic 编程验证 2026/9/28 18:54:27

在线教程丨Qwen3-Coder-Flash 配 TaoToken:settings.json 骨架与 Agentic 编程验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉