1. 从一个“不切实际”的想法说起去年冬天我在调试一块 ESP32-S3 开发板的时候脑子里突然冒出一个念头手机能装 App电脑能装软件为什么单片机不行每次想换个功能就得重新编译固件、插上 USB 线、等烧录进度条跑完这套流程我重复了不下几百次烦透了。尤其是当设备已经装在壳子里、固定在某个角落的时候为了改一行逻辑把它拆下来重新烧录那种感觉就像为了换个手机铃声而把手机拆开焊一遍芯片。这个念头一直在我脑子里转。后来我了解到WebAssembly这个东西它最初是为浏览器设计的能让 C/C 编译出来的代码在网页里以接近原生的速度运行。但更关键的是WASM 的运行时可以做得非常小小到能塞进 ESP32 这种只有几百 KB RAM 的芯片里。于是我开始琢磨能不能在 ESP32 上跑一个 WASM 运行时把每个“应用”编译成.wasm文件通过网络或者串口传进去让固件动态加载执行这样一来固件本身只需要烧录一次之后所有的功能变更都通过“安装应用”来完成。这就是我做这个小型应用平台的起点。它不是一个商业产品也不是什么成熟框架而是一个验证性的项目用来回答一个很具体的问题ESP32 到底能不能像手机一样“安装应用”这篇文章我会把整个思路、技术选型、踩过的坑、实测数据全部摊开来讲适合对 ESP32 有一定基础、想了解动态加载和 WASM 在嵌入式场景下可行性的朋友。如果你只是想让 LED 闪一闪那这篇文章可能有点“杀鸡用牛刀”但如果你想搞清楚嵌入式系统怎么做到“固件不动、功能可换”那接下来的内容应该对你有用。2. 整体设计思路与方案选型2.1 为什么不是 OTA 而是“应用平台”很多人第一反应是ESP32 本来就有 OTA 升级啊直接远程更新固件不就行了没错OTA 确实能解决“不拆机更新”的问题但它解决的是固件整体替换不是功能模块化加载。OTA 的本质是把整个固件镜像写到另一个分区然后重启切换每次更新都是全量的而且更新完必须重启。这意味着你没法在运行时动态增加一个功能也没法让两个独立开发的功能模块互不干扰地共存。我想要的“应用平台”是这样的固件提供一套基础能力GPIO 控制、网络通信、文件系统、定时器等应用层是一个个独立的.wasm文件每个文件实现一个具体功能比如“读温度传感器并上报”“控制继电器开关”“驱动 OLED 显示”。安装应用就是把.wasm文件传到设备上卸载就是删掉文件运行就是让 WASM 运行时加载并执行。整个过程不需要重启不需要重新烧录固件。这个思路的核心价值在于解耦。固件开发者只需要维护底层能力和 WASM 运行时应用开发者只需要写业务逻辑然后编译成 WASM两边可以独立迭代。对于需要频繁调整逻辑的场景比如工业现场的参数调整、智能家居的功能增减这种模式能省掉大量重复烧录的时间。2.2 为什么选 WebAssembly 而不是 Lua 或 MicroPython嵌入式领域做动态加载常见方案有几种Lua 脚本、MicroPython、JerryScriptJavaScript、还有 WASM。我逐一评估过。Lua 的优势是运行时极小核心库编译出来可能就几十 KB而且解释执行不需要编译步骤。但 Lua 的性能在计算密集型任务上比较吃力而且它的生态偏向脚本化配置对于需要调用底层硬件接口的场景绑定层写起来比较繁琐。MicroPython 的生态很好但运行时体积偏大ESP32 上跑 MicroPython 固件本身就要占掉不少 Flash 和 RAM再在上面跑应用层资源会很紧张。JerryScript 也是类似的问题JS 引擎的内存占用对于 ESP32 来说还是偏重。WASM 的优势在于第一它是编译型字节码执行效率比解释型脚本高不少第二它的沙箱模型天然适合做应用隔离每个 WASM 模块只能访问宿主显式导出的函数不能随便碰内存第三工具链成熟C/C、Rust 都能编译到 WASM开发者不需要学新语言。劣势是运行时本身需要一定资源而且 WASM 的内存模型和嵌入式系统的裸内存管理需要做适配。我最终选了 WASM主要原因是性能与隔离性的平衡。实测下来一个简单的 WASM 运行时比如 Wasm3在 ESP32 上占用的 Flash 大约 50-60 KBRAM 峰值在 10 KB 左右这个开销是可以接受的。而且 Wasm3 是解释执行 WASM 字节码不需要 JIT移植起来相对简单。2.3 系统架构分层整个平台分成四层硬件层ESP32-S3 开发板带 8 MB PSRAM 和 16 MB Flash外设包括 GPIO、I2C、SPI、UART。固件层基于 ESP-IDF 开发提供硬件抽象接口GPIO 读写、I2C 传输、网络 socket、文件系统操作以及 WASM 运行时的宿主环境。运行时层Wasm3 解释器负责加载.wasm文件、解析导入导出、管理线性内存、执行字节码。应用层一个个.wasm文件每个文件是一个独立应用通过宿主导出的 API 调用硬件能力。应用和固件之间的接口通过 WASM 的导入/导出机制定义。固件导出一些 C 函数给 WASM 调用比如gpio_set_level、i2c_write、delay_msWASM 模块导出app_init、app_loop、app_deinit三个函数运行时在加载后调用app_init然后在主循环里反复调用app_loop卸载时调用app_deinit。这种设计的好处是应用开发者只需要关心业务逻辑底层硬件操作全部通过标准 API 完成。而且因为 WASM 的沙箱特性一个应用崩溃不会直接把整个系统搞死运行时可以捕获异常并卸载该应用。3. 核心细节解析与实操要点3.1 WASM 运行时的移植与裁剪Wasm3 本身是设计给资源受限环境的但默认配置还是偏大。移植到 ESP32 需要做几件事第一关闭不必要的特性。Wasm3 支持 WASM 的很多扩展比如浮点运算、批量内存操作、多返回值等。对于嵌入式场景我关掉了浮点运算用定点数替代、关掉了 WASM 的bulk memory扩展只保留最核心的整数运算和内存访问。这样编译出来的运行时体积从默认的 80 多 KB 降到了 55 KB 左右。第二调整内存配置。Wasm3 需要一块线性内存给 WASM 模块使用默认是 64 KB。ESP32-S3 有 512 KB 内部 SRAM 和 8 MB PSRAM我把 WASM 线性内存设在 PSRAM 上分配了 256 KB这样应用可以有更多空间做数据处理。但要注意PSRAM 的访问速度比内部 SRAM 慢对于频繁访问的内存区域还是放在内部 SRAM 更合适。第三实现宿主函数绑定。Wasm3 通过m3_LinkRawFunction把 C 函数链接到 WASM 的导入符号上。每个宿主函数需要处理参数解析和返回值封装。比如gpio_set_level接收两个整数参数引脚号、电平值返回一个整数0 表示成功非 0 表示错误。这部分代码需要仔细处理边界条件因为 WASM 传过来的参数是不可信的必须做范围检查。注意Wasm3 默认使用m3_Malloc和m3_Free做内存分配在 ESP32 上需要重定向到heap_caps_malloc和heap_caps_free并且指定分配区域内部 SRAM 或 PSRAM。如果忘记重定向可能会用到默认的 libc malloc在内存紧张时容易失败。3.2 应用接口的设计与约定应用和固件之间的接口设计是整个平台的关键。我定义了一套简单的 API分成几类GPIO 类gpio_mode(pin, mode)、gpio_write(pin, level)、gpio_read(pin)。I2C 类i2c_init(sda, scl, freq)、i2c_write(addr, reg, data, len)、i2c_read(addr, reg, buf, len)。时间类delay_ms(ms)、millis()。网络类net_connect(ssid, pass)、net_send(data, len)、net_recv(buf, len)。文件类file_open(path, mode)、file_read(fd, buf, len)、file_write(fd, data, len)、file_close(fd)。日志类log_info(msg)、log_error(msg)。每个函数在 WASM 侧都有一个对应的导入声明。应用开发者用 C 写代码时只需要包含一个头文件里面声明了这些函数的原型然后正常调用即可。编译时用wasm32-unknown-unknown目标链接时这些符号会变成导入项运行时由 Wasm3 解析并绑定到实际的 C 函数。这里有个细节WASM 的字符串传递。C 语言里字符串是char*但在 WASM 里指针是线性内存的偏移量。宿主函数收到的是一个整数偏移量需要先把它转换成实际的指针才能读取字符串内容。Wasm3 提供了m3_GetMemory来获取线性内存的基地址加上偏移量就是实际地址。但要注意WASM 模块的内存可能会在运行过程中增长如果调用了memory.grow所以每次访问前都要重新获取基地址不能缓存。3.3 应用的生命周期管理每个应用在设备上的生命周期包括安装、加载、运行、卸载。安装就是把.wasm文件写到 Flash 的文件系统里我用的是 SPIFFS后来换成了 LittleFS因为 LittleFS 的掉电恢复能力更好。文件命名用应用的唯一标识比如app_001.wasm。安装可以通过网络上传HTTP POST或者串口传输XMODEM 协议。加载是运行时读取.wasm文件内容调用m3_ParseModule解析字节码然后m3_LoadModule加载到运行时环境。加载成功后查找模块导出的app_init函数并调用。运行是在主循环里定期调用app_loop。这里有个调度问题如果应用很多每个应用的app_loop都调用一遍可能会拖慢整体响应。我的做法是给每个应用分配一个时间片比如每个应用最多执行 10 ms超时就让出 CPU 给下一个应用。Wasm3 本身不支持中断执行所以时间片控制需要在应用层面配合要求应用开发者不要在app_loop里写死循环。卸载是调用app_deinit然后m3_FreeModule释放模块占用的内存最后删除.wasm文件。实操心得Wasm3 在卸载模块后线性内存不会自动归还给系统而是留在运行时的内存池里。如果频繁安装卸载应用内存池会碎片化。我的解决办法是限制同时运行的应用数量最多 4 个并且在卸载后如果内存碎片率超过阈值就重启一次运行时不是重启设备。3.4 资源隔离与错误处理WASM 的沙箱模型提供了一定程度的隔离但还不够。因为所有应用共享同一个 WASM 线性内存空间Wasm3 默认行为一个应用如果越界写内存可能会破坏其他应用的数据。为了解决这个问题我给每个应用分配独立的M3Environment和M3Runtime这样每个应用有自己独立的线性内存。代价是内存开销变大每个运行时至少需要 16 KB 的固定开销。在 8 MB PSRAM 的板子上跑 4 个应用还是绰绰有余的。错误处理方面Wasm3 提供了m3_GetErrorInfo来获取错误信息。当应用执行出错比如除以零、访问非法内存、调用不存在的导入函数时运行时会返回错误码。我的做法是捕获错误后记录日志然后卸载该应用不影响其他应用继续运行。还有一个坑WASM 模块的栈溢出。Wasm3 默认的栈大小是 64 KB对于嵌入式应用来说太大了。我把它调到了 8 KB但有些应用递归调用太深还是会溢出。后来我在编译应用时加了-Wl,-z,stack-size4096来限制应用的栈使用同时在运行时捕获栈溢出错误。4. 实操过程与核心环节实现4.1 开发环境搭建与工具链配置先说一下我的开发环境。固件侧用的是 ESP-IDF v5.1编译链是 xtensa-esp32s3-elf-gcc。WASM 运行时用的是 Wasm3从 GitHub 上拉的最新源码。应用侧用的是 WASI SDK 提供的 clang 编译器目标设为wasm32-unknown-unknown。安装 WASI SDK 的步骤很简单下载对应平台的压缩包解压后把bin目录加到 PATH 里就行。验证安装是否成功clang --targetwasm32-unknown-unknown -v如果输出里能看到Target: wasm32-unknown-unknown说明配置正确。然后编译 Wasm3 到 ESP32。Wasm3 的源码里有一个platforms/embedded目录里面有针对嵌入式平台的移植示例。我参考了esp32的示例但做了一些修改把m3_config.h里的d_m3MaxFunctionStackHeight从默认的 2000 改成了 500减少栈空间占用把d_m3EnableOpTracing关掉减少代码体积。编译命令大概是这样idf.py set-target esp32s3 idf.py menuconfig在 menuconfig 里需要把 PSRAM 打开Component config - ESP PSRAM - Support for external, SPI-connected RAM然后把 Flash 大小设为 16 MB分区表选自定义。4.2 固件侧宿主函数的实现宿主函数是固件导出给 WASM 调用的接口。以gpio_write为例实现如下m3ApiRawFunction(host_gpio_write) { m3ApiGetArg(int32_t, pin); m3ApiGetArg(int32_t, level); if (pin 0 || pin 48) { m3ApiReturnType(int32_t); m3ApiReturn(-1); } gpio_set_level(pin, level); m3ApiReturnType(int32_t); m3ApiReturn(0); }这段代码用 Wasm3 提供的宏来解析参数和返回值。m3ApiGetArg从 WASM 栈上取参数m3ApiReturn把返回值压回栈上。注意参数类型必须和 WASM 侧声明的类型匹配否则会出现未定义行为。链接函数到导入符号m3_LinkRawFunction(module, env, gpio_write, i(ii), host_gpio_write);这里的i(ii)是函数签名表示返回 int32接收两个 int32 参数。Wasm3 用这种紧凑的签名格式来描述函数类型具体规则可以参考 Wasm3 的文档。注意如果签名写错了Wasm3 在链接时会报错但错误信息可能不太直观。建议先用wasm-objdump查看 WASM 模块的导入表确认函数名和签名后再写链接代码。4.3 应用侧代码编写与编译应用侧用 C 写包含一个头文件app_api.h里面声明了所有可用的宿主函数。比如extern int gpio_write(int pin, int level); extern int delay_ms(int ms); extern int log_info(const char* msg);然后写应用逻辑#include app_api.h int app_init() { log_info(app started); gpio_write(2, 1); return 0; } int app_loop() { gpio_write(2, 0); delay_ms(500); gpio_write(2, 1); delay_ms(500); return 0; } int app_deinit() { gpio_write(2, 0); log_info(app stopped); return 0; }编译命令clang --targetwasm32-unknown-unknown -nostdlib -Wl,--no-entry -Wl,--exportapp_init -Wl,--exportapp_loop -Wl,--exportapp_deinit -Wl,--allow-undefined -o app_001.wasm app_001.c几个关键参数-nostdlib表示不链接标准库因为 WASM 环境里没有 libc--no-entry表示不生成默认入口--export指定要导出的函数--allow-undefined允许未定义的符号这些就是宿主函数运行时才绑定。编译出来的.wasm文件通常只有几 KB非常小巧。4.4 应用上传与加载流程应用上传我实现了两种方式HTTP 上传和串口传输。HTTP 上传是在固件里起一个简单的 HTTP 服务器监听/upload路径的 POST 请求。收到数据后写到 LittleFS 里。这种方式适合设备已经联网的场景。串口传输用的是 XMODEM 协议通过 UART 接收文件。这种方式适合设备还没联网、需要本地部署的场景。XMODEM 的实现我参考了 ESP-IDF 里的示例做了一些简化只支持 128 字节包和 CRC 校验。加载流程是这样的设备启动后扫描 LittleFS 里所有.wasm文件逐个加载并调用app_init。然后在主循环里轮询每个应用的app_loop。如果某个应用返回非零值就认为它请求卸载运行时调用app_deinit然后释放模块。实测下来一个 4 KB 的 WASM 应用从加载到app_init执行完成耗时大约 15 ms。app_loop的单次执行时间取决于具体逻辑简单的 GPIO 翻转大约 0.1 ms复杂的 I2C 读写大约 2-3 ms。4.5 性能实测数据我在 ESP32-S3240 MHz 主频8 MB PSRAM上做了一组基准测试结果如下测试项耗时备注WASM 模块加载4 KB12 ms包含解析和链接app_init 执行3 ms简单 GPIO 初始化app_loop 单次执行GPIO 翻转0.1 ms无阻塞操作app_loop 单次执行I2C 读传感器2.5 ms100 kHz I2C 时钟宿主函数调用开销约 2 us从 WASM 进入 C 函数再返回内存占用运行时 1 个应用约 80 KB含线性内存从数据看WASM 的解释执行开销确实比原生代码高但对于大多数嵌入式控制场景来说完全够用。GPIO 翻转的 0.1 ms 延迟对于 LED 控制、继电器开关这类应用绰绰有余。I2C 读写的 2.5 ms 主要花在 I2C 传输本身WASM 的解释开销只占很小一部分。实操心得如果应用里有大量循环计算WASM 的解释执行会比原生慢 5-10 倍。这种情况下可以把计算密集的部分放到固件里作为宿主函数应用只负责调用和逻辑编排。比如 PID 控制算法我就是在固件里实现的应用只传参数和读结果。5. 常见问题与排查技巧实录5.1 WASM 模块加载失败这是最常见的问题表现是m3_ParseModule返回 NULL 或者m3_LoadModule报错。原因通常有几个第一WASM 文件损坏。可能是上传过程中丢包或者 Flash 写入失败。排查方法是把文件读出来用wasm-objdump -h检查文件头是否正确。如果文件头不是\0asm说明文件损坏。第二WASM 模块使用了不支持的指令。Wasm3 不是完整的 WASM 实现某些指令比如 SIMD、异常处理不支持。排查方法是用wasm-objdump -d反汇编看有没有不认识的指令。解决办法是在编译应用时加上-mno-simd -mno-exception-handling等标志。第三内存不足。Wasm3 在加载模块时需要分配线性内存如果 PSRAM 碎片化严重或者剩余内存不足加载会失败。排查方法是打印heap_caps_get_free_size(MALLOC_CAP_SPIRAM)看剩余内存。解决办法是减少同时运行的应用数量或者在加载前先卸载一些不用的应用。5.2 宿主函数调用崩溃表现是应用执行到某个宿主函数时设备重启或者卡死。原因通常是参数越界或者指针非法。比如i2c_write的len参数如果 WASM 传了一个很大的值宿主函数里直接按这个长度读内存就会越界访问。解决办法是在宿主函数里做参数检查len不能超过缓冲区大小addr必须在合法范围内。还有一个坑是字符串指针。WASM 传过来的字符串指针是线性内存的偏移量如果应用传了一个非法偏移量比如超出了线性内存范围宿主函数读取时就会崩溃。解决办法是用m3_GetMemory获取线性内存的基地址和大小然后检查偏移量是否在范围内。uint32_t mem_size; uint8_t* mem_base m3_GetMemory(runtime, mem_size, 0); if (offset mem_size) { return -1; } char* str (char*)(mem_base offset);5.3 应用之间互相干扰前面提到过如果多个应用共享同一个 WASM 运行时一个应用越界写内存会影响其他应用。表现是某个应用运行正常但另一个应用突然行为异常。排查方法是给每个应用分配独立的运行时环境这样内存是隔离的。如果资源不够至少要在宿主函数层面做严格的参数检查防止应用通过宿主函数间接破坏其他应用的数据。还有一个干扰是 GPIO 冲突。两个应用同时操作同一个引脚会导致电平状态不确定。我的做法是在宿主函数里维护一个引脚占用表应用在app_init里需要先“申请”引脚申请失败就不能使用。卸载时释放引脚。5.4 常见问题速查表问题现象可能原因排查方法解决办法模块加载返回 NULL文件损坏wasm-objdump -h检查文件头重新上传文件模块加载返回 NULL不支持的指令wasm-objdump -d反汇编编译时禁用不支持的特性模块加载返回 NULL内存不足打印剩余 PSRAM卸载不用的应用宿主函数调用崩溃参数越界在宿主函数里加日志增加参数检查宿主函数调用崩溃字符串指针非法检查偏移量范围用m3_GetMemory验证应用行为异常内存被其他应用破坏检查是否共享运行时分配独立运行时应用行为异常GPIO 冲突检查引脚占用表增加引脚申请机制执行速度慢计算密集测量app_loop耗时把计算移到固件侧设备重启栈溢出检查递归深度限制栈大小优化代码5.5 独家避坑技巧第一个技巧在开发阶段给每个宿主函数加上详细的日志记录参数和返回值。这样当应用行为异常时可以通过日志快速定位是哪个函数调用出了问题。日志用ESP_LOGI输出到串口不影响实时性。第二个技巧WASM 应用的编译优化级别建议用-O2而不是-Os。虽然-Os能减小代码体积但生成的 WASM 字节码可能更复杂解释执行反而更慢。实测-O2编译出来的应用执行速度比-Os快 20% 左右体积只大了 10%。第三个技巧如果应用需要频繁调用宿主函数比如每毫秒调用一次gpio_read考虑在固件侧做一个批量接口一次调用读取多个引脚的状态减少 WASM 和宿主之间的切换开销。每次切换大约 2 us频繁切换累积起来也很可观。第四个技巧LittleFS 的块大小建议设为 4 KB和 Flash 的扇区大小一致。如果设得太小文件系统元数据会占用过多空间设得太大小文件会浪费空间。4 KB 是一个比较平衡的选择。6. 这个平台还能怎么扩展目前这个平台已经能跑起来基本功能都验证过了。但说实话它离“好用”还有距离。我接下来打算做几个方向的扩展。第一个方向是应用商店的概念。现在安装应用需要手动上传.wasm文件如果能做一个简单的应用仓库设备直接通过 URL 下载安装那就更方便了。仓库可以是一个静态文件服务器设备端实现一个简单的 HTTP 客户端根据应用 ID 去拉取对应的.wasm文件。第二个方向是应用间通信。现在每个应用是独立的互相不能传数据。如果能让应用之间通过消息队列或者共享内存通信就能组合出更复杂的功能。比如一个应用负责采集传感器数据另一个应用负责显示两者通过消息传递数据。第三个方向是权限控制。现在应用可以调用所有宿主函数没有权限区分。如果能在加载应用时指定权限比如只能访问 GPIO不能访问网络安全性会更好。WASM 的导入机制天然支持这个只需要在链接宿主函数时根据权限决定链接哪些函数即可。第四个方向是热更新。现在更新应用需要先卸载再安装中间有一段时间应用不可用。如果能做到原子替换先加载新版本切换成功后再卸载旧版本就能实现无缝更新。这些扩展方向里应用间通信和权限控制是我最想做的。前者能让平台从“能跑多个应用”变成“应用能协作”后者能让平台从“能用”变成“敢用”。不过这些都需要对 Wasm3 做更深入的改造工作量不小。我在实际使用中发现WASM 在 ESP32 上的表现比预期好但也不是没有代价。解释执行的开销、内存隔离的成本、工具链的复杂度这些都是需要权衡的。如果你的场景是功能固定、不需要动态加载那直接烧固件更简单高效。但如果你需要频繁调整逻辑、或者想让不同的人独立开发功能模块那这个平台能省掉很多重复劳动。踩过几次坑之后我的建议是先从一个小功能开始验证比如用 WASM 控制一个 LED跑通了再逐步扩展。不要一上来就搞复杂架构那样容易在细节里迷失。
企业数字化 ERP 产品动态
相关推荐
全屋智能不烧钱:家居+商用一套系统打通落地复盘 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 13:10:09
Maven多模块拆分实战:Spring Boot项目编译从30分钟降至8分钟 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 13:10:09
如何修复 Atmosphere 的 010000000000002b 致命错误:完整排障指南 如何修复 Atmosphere 的 010000000000002b 致命错误:完整排障指南 【免费下载链接】Atmosphere Atmosphre is a work-in-progress customized firmware for the Nintendo Switch. 项目地址: https://gitcode.com/GitHub_Trending/at/Atmosphere
如果你的 Swi… · 2026/9/24 15:10:02
Chat2DB 完整实战指南:40+ 数据库客户端与 AI SQL 工作空间 Chat2DB 完整实战指南:40 数据库客户端与 AI SQL 工作空间 【免费下载链接】Chat2DB Chat2DB is a free, cross-platform, local-first database client and SQL workspace for developers, DBAs, analysts, and data teams. Connect to 40 databases, manage data, edit and r… · 2026/9/24 15:10:02
爆炸、魔法、武侠打斗:Minimax-h3_Singularity可复制的VFX特效与动作提示词模板大全 爆炸、魔法、武侠打斗:Minimax-h3_Singularity可复制的VFX特效与动作提示词模板大全 【免费下载链接】Minimax-h3_Singularity 项目地址: https://ai.gitcode.com/hf_mirrors/WarmBloodAban/Minimax-h3_Singularity
Minimax-h3_Singularity 是一个基于 Mini… · 2026/9/24 15:10:02
如何设计可恢复的执行系统:AX值得借鉴的5个设计决策 如何设计可恢复的执行系统:AX值得借鉴的5个设计决策 【免费下载链接】ax Googles open agentic orchestration runtime 项目地址: https://gitcode.com/GitHub_Trending/ax11/ax
AX(Agent Executor) 是 Google 开源的分布式智能体编排… · 2026/9/24 15:09:56
一次跑通palera1n:A8-A11设备越狱实战路径 一次跑通palera1n:A8-A11设备越狱实战路径 【免费下载链接】palera1n Jailbreak for A8 through A11, T2 devices, on iOS/iPadOS/tvOS 15.0, bridgeOS 5.0 and higher. 项目地址: https://gitcode.com/GitHub_Trending/pa/palera1n
palera1n是一款基于check… · 2026/9/24 15:09:50
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44