- 语言运行时
- 嵌入式
- 物联网
- 编译器
【免费下载链接】jerryscript
Ultra-lightweight JavaScript engine for the Internet of Things.
本指南基于 JerryScript 官方仓库 targets/os/nuttx/README.md 整理,完整讲解如何将超轻量级 JavaScript 引擎 JerryScript 移植到 STM32F4-Discovery 开发板,并运行在 Apache NuttX 实时操作系统之上。读完本文,你将掌握从搭建交叉编译环境、配置 NuttX 内核、集成 JerryScript 应用、生成 ROMFS 文件系统镜像,到烧录固件并通过 NSH 串口 Shell 执行 JavaScript 脚本的全套流程,同时理解该移植背后的源码级实现(Kconfig 配置项、Makefile 构建参数、端口适配层与 ARM 汇编的 setjmp/longjmp 实现)。
一、移植目标与仓库文件概览
JerryScript 官方为 NuttX 提供了独立的移植目录,位于仓库的 targets/os/nuttx 下,目标平台组合为:
- 开发板:STM32F4-Discovery(意法半导体评估板,搭载 Cortex-M4 内核的 STM32F4 系列 MCU)
- 操作系统:NuttX(Apache 基金会下的类 POSIX 实时操作系统)
- 文档验证环境:Ubuntu 20.04 主机,NuttX 最新实测可用版本为 10.2
该目录包含一组小而完整的移植文件,各自职责如下:
| 文件 | 作用 |
|---|---|
| Kconfig | 定义 JerryScript 在 NuttX 中的 Kconfig 菜单项(开关、优先级、栈大小) |
| Make.defs | 当CONFIG_INTERPRETERS_JERRYSCRIPT=y时,将本目录注册进 NuttX 应用构建系统 |
| Makefile | 描述jerry应用的编译规则,并调用 JerryScript 的tools/build.py交叉编译核心静态库 |
| jerry-main.c | jerry命令行的入口实现:参数解析、REPL、脚本执行、调试服务器 |
| jerry-port.c | JerryScript 端口适配层:日志、行读取、fatal、时区、时间等接口的 NuttX 实现 |
| setjmp.S 与 setjmp.h | Cortex-M4 浮点上下文的 setjmp/longjmp 汇编实现与类型定义 |
| Makefile.travis | 用于 CI 的无交互自动构建目标(安装依赖、clone NuttX、配置、编译) |
整套移植以"应用"的形式挂在 NuttX 的apps/interpreters/jerryscript路径下,随 NuttX 固件一起编译链接,最终在设备上得到一个名为jerry的 NSH 命令。
二、搭建 STM32F4-Discovery 构建环境
2.1 克隆所需项目
先在主机上创建统一的工作目录jerry-nuttx,并克隆四个项目:JerryScript 本体、NuttX 内核(10.2 分支)、NuttX 应用库(apps)、kconfig 工具以及 ST-Link 烧录工具:
# Create a base folder for all the projects. mkdir jerry-nuttx && cd jerry-nuttx git clone https://github.com/jerryscript-project/jerryscript.git git clone https://github.com/apache/incubator-nuttx.git nuttx -b releases/10.2 git clone https://github.com/apache/incubator-nuttx-apps.git apps -b releases/10.2 git clone https://bitbucket.org/nuttx/tools.git tools git clone https://github.com/texane/stlink.git -b v1.5.1-patch执行完成后,目录结构应为:
jerry-nuttx + jerryscript | + targets | + os | + nuttx + nuttx + apps + tools + stlink后续所有命令都假定你位于jerry-nuttx根目录下执行。
2.2 安装项目依赖
JerryScript 提供了依赖安装脚本 tools/apt-get-install-deps.sh,可先运行它补齐 JerryScript 本体的构建依赖:
# Assuming you are in jerry-nuttx folder. jerryscript/tools/apt-get-install-deps.sh随后分别安装 NuttX 的交叉编译工具链、构建工具、以及 ST-Link 与串口通信工具:
# Toolchain dependencies of NuttX. sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi # Tool dependencies of NuttX. sudo apt install \ bison flex gettext texinfo libncurses5-dev libncursesw5-dev \ gperf automake libtool pkg-config build-essential gperf genromfs \ libgmp-dev libmpc-dev libmpfr-dev libisl-dev binutils-dev libelf-dev \ libexpat-dev gcc-multilib g++-multilib picocom u-boot-tools util-linux # ST-Link and serial communication dependencies. sudo apt install libusb-1.0-0-dev minicom其中gcc-arm-none-eabi用于交叉编译 Cortex-M 固件;genromfs用于后续生成 ROMFS 文件系统镜像;minicom用于连接开发板串口;u-boot-tools(mkimage 等)是 NuttX 构建所需的辅助工具。
三、把 JerryScript 应用接入 NuttX 应用树
NuttX 的应用(apps)采用模块化组织,每个应用位于apps/<类别>/<应用名>目录。这里需要把 JerryScript 的移植文件放到apps/interpreters/jerryscript:
# Assuming you are in jerry-nuttx folder. mkdir -p apps/interpreters/jerryscript cp jerryscript/targets/os/nuttx/* apps/interpreters/jerryscript/ # Or more simply: # ln -s jerryscript/targets/os/nuttx apps/interpreters/jerryscriptcp与符号链接两种方式等价,后者可避免文件复制,便于同步修改。
这一步生效的机制在 Make.defs 中:当配置项CONFIG_INTERPRETERS_JERRYSCRIPT=y时,CONFIGURED_APPS会追加$(APPDIR)/interpreters/jerryscript,从而把该目录纳入 NuttX 整体构建:
ifeq ($(CONFIG_INTERPRETERS_JERRYSCRIPT),y) CONFIGURED_APPS += $(APPDIR)/interpreters/jerryscript endif而 Kconfig 定义了三个核心配置项:
INTERPRETERS_JERRYSCRIPT:布尔开关,默认关闭(default n);INTERPRETERS_JERRYSCRIPT_PRIORITY:jerry任务的优先级,默认 100;INTERPRETERS_JERRYSCRIPT_STACKSIZE:jerry任务的栈大小(字节),默认 16384。
这些默认值在 Makefile 中被直接引用为PRIORITY与STACKSIZE,进而通过Application.mk生成 NSH 内建命令。
四、构建 kconfig-frontends 配置工具
NuttX 的图形化配置依赖kconfig-frontends工具集。如果系统包管理器已经安装了kconfig-frontends,可跳过本节;否则需要从之前克隆的tools仓库中编译安装:
# Assuming you are in jerry-nuttx folder. cd tools/kconfig-frontends ./configure \ --disable-nconf \ --disable-gconf \ --disable-qconf \ --disable-shared \ --enable-static \ --prefix=${PWD}/install make make install # Add install folder to PATH PATH=${PWD}/install/bin:$PATH注意这里的 configure 选项:禁用了nconf/gconf/qconf三种图形前端、采用静态链接(--enable-static),安装到本地install目录,最后把该目录加入PATH,供后续menuconfig/olddefconfig使用。
五、配置 NuttX 内核并启用 JerryScript
NuttX 的构建配置全部存放在nuttx/.config文件中。首先基于官方提供的usbnsh配置模板初始化配置——该模板把 USB 作为 NSH 控制台(USB console shell):
# Assuming you are in jerry-nuttx folder. cd nuttx/tools # Configure NuttX to use USB console shell. ./configure.sh stm32f4discovery:usbnsh默认情况下 JerryScript 处于禁用状态,需要手动开启。官方提供了两种方式:交互式menuconfig(5.1 节)或直接修改.config文件(5.2 节)。
5.1 方式一:使用 menuconfig 交互配置
# Assuming you are in jerry-nuttx folder. # Might be required to run `make menuconfig` twice. make -C nuttx menuconfig基础配置(必选):
- 启用
System Type -> FPU support:STM32F4 带硬件浮点单元,JerryScript 数学库需要启用 FPU 支持; - 启用
Application Configuration -> Interpreters -> JerryScript:即把CONFIG_INTERPRETERS_JERRYSCRIPT置为y。
可选配置一:启用 ROMFS,把 JavaScript 输入文件烧录进设备 flash:
- 启用
File systems -> ROMFS file system - 启用
Application configuration -> NSH library -> Scripting Support -> Support ROMFS start-up script
可选配置二:启用 MMCSD,在开发板上挂载 micro-SD 卡。注意以下选项针对的是 STM32F4-Discovery 基板上的 micro-SD 卡槽:
- 启用
System Type -> STM32 Peripheral Support -> SDIO - 启用
RTOS Features -> Work queue support -> High priority (kernel) worker thread - 启用
RTOS Features -> RTOS hooks -> Custom board late initialization - 启用
RTOS Features -> RTOS hooks -> Enable on_exit() API - 启用
Driver Support -> MMC/SD Driver Support - 禁用
Driver Support -> MMC/SD Driver Support -> MMC/SD write protect pin - 禁用
Driver Support -> MMC/SD Driver Support -> MMC/SD SPI transfer support - 启用
Driver Support -> MMC/SD Driver Support -> MMC/SD SDIO transfer support - 启用
File systems -> FAT file system - 启用
File systems -> FAT file system -> FAT upper/lower names - 启用
File systems -> FAT file system -> FAT long file names
5.2 方式二:直接追加 .config 内容(无交互)
更简单的做法是把所需配置直接追加到nuttx/.config末尾。最小启用集合如下:
# Assuming you are in jerry-nuttx folder. cat >> nuttx/.config << EOL CONFIG_ARCH_FPU=y CONFIG_SCHED_ONEXIT=y CONFIG_INTERPRETERS_JERRYSCRIPT=y CONFIG_INTERPRETERS_JERRYSCRIPT_PRIORITY=100 CONFIG_INTERPRETERS_JERRYSCRIPT_STACKSIZE=16384 EOL各选项含义:
CONFIG_ARCH_FPU=y:启用 FPU(对应 menuconfig 中的 FPU support);CONFIG_SCHED_ONEXIT=y:启用on_exit()API(对应 RTOS hooks);CONFIG_INTERPRETERS_JERRYSCRIPT=y:启用 JerryScript 应用;CONFIG_INTERPRETERS_JERRYSCRIPT_PRIORITY=100:jerry任务优先级;CONFIG_INTERPRETERS_JERRYSCRIPT_STACKSIZE=16384:jerry任务栈大小(字节)。
可选:启用 ROM 文件系统(ROMFS):
# Assuming you are in jerry-nuttx folder. cat >> nuttx/.config << EOL CONFIG_BOARDCTL_ROMDISK=y CONFIG_FS_ROMFS=y CONFIG_NSH_ROMFSETC=y CONFIG_NSH_ROMFSMOUNTPT="/etc" CONFIG_NSH_INITSCRIPT="init.d/rcS" CONFIG_NSH_ROMFSDEVNO=0 CONFIG_NSH_ROMFSSECTSIZE=64 CONFIG_NSH_DEFAULTROMFS=y EOL这些选项让 NSH 把 ROMFS 挂载到/etc,并执行init.d/rcS作为启动脚本,ROMFS 设备号、扇区大小等均可按需调整。
可选:启用 MMCSD 驱动与 FAT 文件系统。以下选项针对 STM32F4-Discovery 基板上的 micro-SD 卡槽:
# Assuming you are in jerry-nuttx folder. cat >> nuttx/.config << EOL CONFIG_STM32_SDIO=y CONFIG_STM32_SDIO_DMAPRIO=0x00010000 CONFIG_MMCSD_HAVE_CARDDETECT=y CONFIG_BOARD_LATE_INITIALIZE=y CONFIG_BOARD_INITTHREAD_STACKSIZE=2048 CONFIG_BOARD_INITTHREAD_PRIORITY=240 CONFIG_SIG_SIGWORK=17 CONFIG_SCHED_WORKQUEUE=y CONFIG_SCHED_HPWORK=y CONFIG_SCHED_HPNTHREADS=1 CONFIG_SCHED_HPWORKPRIORITY=224 CONFIG_SCHED_HPWORKSTACKSIZE=2048 CONFIG_BCH=y CONFIG_ARCH_HAVE_SDIO=y CONFIG_ARCH_HAVE_SDIOWAIT_WRCOMPLETE=y CONFIG_ARCH_HAVE_SDIO_PREFLIGHT=y CONFIG_MMCSD=y CONFIG_MMCSD_NSLOTS=1 CONFIG_MMCSD_MMCSUPPORT=y CONFIG_MMCSD_SDIO=y CONFIG_FS_FAT=y CONFIG_FAT_LCNAMES=y CONFIG_FAT_LFN=y CONFIG_FAT_MAXFNAME=32 CONFIG_FAT_LFN_ALIAS_TRAILCHARS=0 CONFIG_FSUTILS_MKFATFS=y CONFIG_NSH_MMCSDSLOTNO=0 EOL这段配置把 STM32 的 SDIO 外设、MMC/SD 驱动(SDIO 传输模式)、FAT 文件系统、板级后初始化线程以及内核工作队列一并打开,为后续挂载 SD 卡读取脚本文件做好准备。
六、为设备准备 JavaScript 输入文件
JerryScript 在设备上需要 JavaScript 源文件作为输入。根据第 5 步的选择,有两种承载方式:ROMFS(烧录进 flash)或 SD 卡(FAT32 文件系统)。
6.1 方式一:由自定义目录生成 ROMFS 镜像
如果使用了 MMCSD 方式,可跳过本节。否则需要把存放 JS 文件的目录打包成 C 头文件。受 flash 容量限制,尽量精简目录内容:
# Assuming you are in jerry-nuttx folder. mkdir jerry-example # Let hello.js be a possible JavaScript input for JerryScript. cp jerryscript/tests/hello.js jerry-example # Generate ROMFS image from a custom folder. genromfs -f romfs_img -d jerry-example # Dump image as C header file and override NuttX's default ROMFS file. xxd -i romfs_img apps/nshlib/nsh_romfsimg.h # Add const modifier to place the content to flash memory. sed -i "s/unsigned/const\ unsigned/g" apps/nshlib/nsh_romfsimg.h流程说明:genromfs把jerry-example目录打包为 ROMFS 镜像文件;xxd -i把二进制镜像转成 C 数组并覆盖 NuttX 默认的 [nsh_romfsimg.h] 模板(注意:该头文件位于克隆的 apps 仓库中,并非 JerryScript 仓库文件);最后的sed把unsigned改成const unsigned,使镜像数据被放入只读的 flash 段而非 RAM。
仓库自带的示例 tests/hello.js 内容仅一行:print ("Hello JerryScript!");,非常适合作为 ROMFS 中的首个测试脚本。
6.2 方式二:把文件复制到 SD 卡
如果使用了 ROMFS 方式,可跳过本节。否则只需把 JS 文件复制到一张 FAT32 格式化的内存卡上,插入开发板的 micro-SD 卡槽即可。
七、编译 NuttX(含 JerryScript)
在jerry-nuttx根目录下执行:
# Assuming you are in jerry-nuttx folder. make -C nuttx整个构建链路中,Makefile 扮演关键角色。它的libjerry目标会调用 JerryScript 的tools/build.py交叉编译四个静态库(libjerry-core.a、libjerry-ext.a、libjerry-math.a、libjerry-port.a),核心构建参数如下:
libjerry: $(JERRYSCRIPT_ROOT_DIR)/tools/build.py \ --clean \ --lto=OFF \ --jerry-cmdline=OFF \ --jerry-math=ON \ --amalgam=ON \ --mem-heap=70 \ --profile=es.next \ --compile-flag="-I${NUTTX_INCLUDE_DIR}" \ --toolchain=$(abspath $(JERRYSCRIPT_ROOT_DIR)/cmake/toolchain_mcu_stm32f4.cmake)各参数含义:
--lto=OFF:关闭链接期优化,避免交叉链接阶段与 NuttX 工具链产生兼容问题;--jerry-cmdline=OFF:不构建桌面版命令行程序,因为 NuttX 侧使用自带的jerry-main.c;--jerry-math=ON:启用 JerryScript 内置数学库(jerry-math),替代 libm;--amalgam=ON:使用合并(amalgamated)单文件构建方式,减少目标文件数量;--mem-heap=70:内部堆大小设为 70 KB,这是面向 MCU 场景的紧凑配置;--profile=es.next:采用 profiles/es.next.profile 功能集,启用完整的 ES.Next 特性;--compile-flag="-I${NUTTX_INCLUDE_DIR}":把 NuttX 的include目录加入头文件搜索路径;--toolchain=cmake/toolchain_mcu_stm32f4.cmake:指定交叉编译工具链文件。
工具链文件 cmake/toolchain_mcu_stm32f4.cmake 定义了目标平台:armv7l/STM32F4,编译标志为-mlittle-endian -mthumb -mcpu=cortex-m4 -march=armv7e-m -mfpu=fpv4-sp-d16 -mfloat-abi=hard,编译器为arm-none-eabi-gcc,即针对带单精度 FPU 的 Cortex-M4 硬浮点 ABI 生成代码。
库文件构建完成后,通过copylibs目标复制到应用目录,$(firstword $(AR)) x $@逐个解包进 NuttX 链接;ASRCS = setjmp.S、CSRCS = jerry-port.c、MAINSRC = jerry-main.c则把三个移植源文件直接编入应用。最终产物是nuttx.bin固件镜像。
八、烧录固件到开发板
连接开发板的 Mini-USB 口(用于供电与烧录),编译 ST-Link 工具并烧写:
# Assuming you are in jerry-nuttx folder. make -C stlink release sudo stlink/build/Release/st-flash write nuttx/nuttx.bin 0x80000000x8000000是 STM32F4 内部 flash 的起始地址,st-flash会把nuttx.bin从该地址开始写入。
九、连接设备串口
连接开发板的 Micro-USB 口(用于串口通信)。设备在主机上通常显示为/dev/ttyACM0,使用minicom以 115200 波特率连接:
sudo minicom --device=/dev/ttyACM0 --baud=115200在minicom中通过按键组合CTRL-A -> Z -> U设置Add Carriage Ret(回车换行)选项。可能需要按下开发板的RESET键并在控制台上多次按Enter,NSH 提示符才会出现:
NuttShell (NSH) NuttX-10.2.0 nsh>十、在 NSH 中运行 JerryScript
10.1 无输入文件运行(内置演示)
直接在nsh>提示符后输入jerry不带任何参数:
NuttShell (NSH) NuttX-10.2.0 nsh> jerry No input files, running a hello world demo: Hello world 5 times from JerryScript无文件输入时,jerry先输出提示并运行一段内置的 hello world 演示。
10.2 运行 ROMFS 中的脚本
如果启用了 ROMFS,脚本位于挂载点/etc下,直接以路径传入:
NuttShell (NSH) NuttX-10.2.0 nsh> jerry /etc/hello.js10.3 运行 SD 卡中的脚本
启用 MMCSD 后,NuttX 初始化完成时 SD 卡读卡器显示为/dev/mmcsd0。先挂载再执行:
NuttShell (NSH) NuttX-10.2.0 nsh> mount -t vfat /dev/mmcsd0 /mnt nsh> jerry /mnt/hello.js十一、jerry 命令行的源码级解析
设备上的jerry命令由 jerry-main.c 实现,其执行逻辑可分为三个阶段。
参数解析阶段:循环扫描命令行参数,最多接受 16 个参数(JERRY_MAX_COMMAND_LINE_ARGS)。支持的选项与官方桌面版一致的子集:
| 选项 | 说明 |
|---|---|
-h/--help | 打印用法说明 |
--log-level [0-3] | 设置日志级别(0=错误、1=警告、2=信息、3=调试,对应JERRY_LOG_LEVEL_*) |
--mem-stats | 启用内存统计(JERRY_INIT_MEM_STATS),并把日志级别设为 DEBUG |
--show-opcodes | 打印执行的字节码(JERRY_INIT_SHOW_OPCODES | JERRY_INIT_SHOW_REGEXP_OPCODES) |
--start-debug-server | 启动调试服务器 |
--debug-server-port [port] | 指定调试服务器端口,默认 5001 |
其余非选项参数被收集为脚本文件名列表(file_names[])。
初始化与执行阶段:调用jerry_init(flags)初始化引擎;若开启了调试服务器,则通过扩展库jerryx_debugger_after_connect建立 TCP 与 WebSocket 双重调试通道(见 debugger-ws.c 等扩展实现);随后把assert、gc、print三个原生函数注册为全局对象方法(jerryx_register_global)。若无文件参数,进入jerryx_repl交互式 REPL 循环;否则逐个调用jerryx_source_exec_script执行脚本文件,出现异常时打印未处理异常并以退出码 1 终止。
收尾阶段:调用jerry_run_jobs处理挂起的 Promise 微任务队列,最后jerry_cleanup释放引擎资源。
十二、端口适配层与底层支撑实现
JerryScript 引擎与宿主系统之间通过"端口层"解耦,NuttX 移植的端口实现集中在 jerry-port.c,全部接口都很精简:
jerry_port_log:日志输出,NuttX 移植中为空实现(消息被忽略),因为控制台输出统一走print扩展;jerry_port_line_read:读取一行输入,返回 NULL(REPL 输入通道在 jerry-main.c 中另行处理);jerry_port_fatal:致命错误处理,直接以错误码调用exit()终止进程;jerry_port_local_tza:本地时区偏移,移植中固定返回 0,即"我们活在 UTC";jerry_port_current_time:当前时间,移植中返回 0(设备通常无 RTC,时间功能需按需扩展)。
另一个关键底层依赖是setjmp/longjmp。JerryScript 的错误处理依赖这两个函数,而 STM32F4 使用了 FPU 寄存器,NuttX 自带的实现可能不保存浮点上下文,因此移植目录专门提供了 setjmp.S 与 setjmp.h。jmp_buf定义为 14 个uint64_t元素;setjmp用stmia保存r4-r11与返回地址lr,str保存栈指针sp,再用vstm保存浮点寄存器s16-s31;longjmp按对称顺序恢复这些寄存器,并把val作为setjmp的返回值(若val为 0 则强制返回 1,以区分"直接调用返回 0"与"longjmp 返回"两种情形)。
十三、自动化构建参考(CI 脚本)
Makefile.travis 给出了完全无交互的自动化构建流程,与本文手动步骤一一对应,可作为脚本化移植的参考:
install-apt-get-deps:apt 安装gcc-arm-none-eabi与gperf;install-kconfig:克隆 nuttx/tools 并本地编译安装 kconfig-frontends(含autoreconf --force --install兼容处理);install-clone-nuttx:克隆 nuttx 与 apps 的releases/10.2分支;script-add-jerryscript-app:用ln -s ../../jerryscript/targets/os/nuttx ../apps/interpreters/jerryscript建立应用链接;script-configure-usbnsh:执行configure.sh stm32f4discovery:usbnsh;script:向.config追加CONFIG_ARCH_FPU=y、CONFIG_SCHED_ONEXIT=y、CONFIG_INTERPRETERS_JERRYSCRIPT=y三项,运行make olddefconfig后执行make -C ../nuttx完成固件构建。
十四、常见问题与关键要点
- 菜单配置需运行两次:官方文档提示
make menuconfig可能需要运行两次,以刷新应用菜单树; - ROMFS 与 MMCSD 二选一:两种脚本承载方式互斥,选择其一即可,第 6 步会明确"Skip this section"提示;
- 注意 flash 容量:生成 ROMFS 镜像前尽量精简目录体积,STM32F4-Discovery 的 flash 有限;
- 堆大小与功能集可调:
--mem-heap=70(70 KB 堆)与--profile=es.next是 Makefile 中针对该板卡的默认取舍,开发者可按内存预算调整; - 串口参数固定:使用 115200 波特率,并通过
minicom的CTRL-A -> Z -> U开启回车选项,否则输入可能无法被正确解析; - USB 双口分工:Mini-USB 负责供电与 ST-Link 烧录,Micro-USB 负责串口控制台,二者不要混淆。
至此,一套"STM32F4-Discovery + NuttX 10.2 + JerryScript"的嵌入式 JavaScript 运行环境已完整打通:从交叉编译、内核配置、应用集成、脚本烧录到设备端执行,均可按本文步骤复现;而 Kconfig、Makefile、jerry-main.c、jerry-port.c 与 setjmp.S 等文件,则为二次定制(如新增端口接口、调整任务栈、接入调试器)提供了清晰的切入点。
- 语言运行时
- 嵌入式
- 物联网
- 编译器
【免费下载链接】jerryscript
Ultra-lightweight JavaScript engine for the Internet of Things.
相关推荐
Zephyr 在 Radxa ROCK 3B(Rockchip RK3568)上的移植、构建与 U-Boot 运行指南
Zephyr 在 Radxa ROCK 3B(Rockchip RK3568)上的移植、构建与 U Boot 运行指南 Radxa ROCK 3B 是一款基于
操作系统嵌入式RTOS物联网Linux on Nios II:在 Altera FPGA 上构建与移植 Linux 内核的完整指南
Linux on Nios II:在 Altera FPGA 上构建与移植 Linux 内核的完整指南 Nios II 是专为 Altera(现 Intel)F
操作系统内核驱动驱动开发虚拟化嵌入式网络存储Zephyr RTOS 在 Raspberry Pi 5 上的移植与实战指南:构建、串口调试与 Xen Dom0 运行
Zephyr RTOS 在 Raspberry Pi 5 上的移植与实战指南:构建、串口调试与 Xen Dom0 运行 导读 本文基于 Zephyr 官方仓库中
操作系统嵌入式RTOS物联网
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考