【花雕动手做】迷你小龙虾 MimiClaw 主程序 mimi 改进与升级方案:从即时优化到架构演进
ESP32‑S3 智能体 MimiClaw 的主入口如下/** * file mimi.c 《驴友花雕二次开发版本》 * brief MimiClaw 主程序入口 - ESP32-S3 AI AgentWS2812 双电机差速 */#includestdio.h#includestring.h#includefreertos/FreeRTOS.h#includefreertos/task.h#includeesp_log.h#includeesp_event.h#includeesp_system.h#includeesp_heap_caps.h#includeesp_spiffs.h#includenvs_flash.h#includemimi_config.h#includebus/message_bus.h#includewifi/wifi_manager.h#includechannels/telegram/telegram_bot.h#includechannels/feishu/feishu_bot.h#includellm/llm_proxy.h#includeagent/agent_loop.h#includememory/memory_store.h#includememory/session_mgr.h#includegateway/ws_server.h#includecli/serial_cli.h#includeproxy/http_proxy.h#includetools/tool_registry.h#includecron/cron_service.h#includeheartbeat/heartbeat.h#includeskills/skill_loader.h#includeonboard/wifi_onboard.h#includetools/tool_ws2812.h#includetools/tool_motor.hstaticconstchar*TAGmimi;staticesp_err_tinit_nvs(void){esp_err_tretnvs_flash_init();if(retESP_ERR_NVS_NO_FREE_PAGES||retESP_ERR_NVS_NEW_VERSION_FOUND){ESP_LOGW(TAG,NVS erased);ESP_ERROR_CHECK(nvs_flash_erase());retnvs_flash_init();}returnret;}staticesp_err_tinit_spiffs(void){esp_vfs_spiffs_conf_tconf{.base_pathMIMI_SPIFFS_BASE,.max_files10,.format_if_mount_failedtrue,};esp_err_tretesp_vfs_spiffs_register(conf);if(ret!ESP_OK){ESP_LOGE(TAG,SPIFFS mount failed);returnret;}size_ttotal0,used0;esp_spiffs_info(NULL,total,used);ESP_LOGI(TAG,SPIFFS: total%d, used%d,(int)total,(int)used);returnESP_OK;}staticvoidoutbound_dispatch_task(void*arg){ESP_LOGI(TAG,Outbound dispatch started);while(1){mimi_msg_tmsg;if(message_bus_pop_outbound(msg,UINT32_MAX)!ESP_OK)continue;if(strcmp(msg.channel,MIMI_CHAN_FEISHU)0){feishu_send_message(msg.chat_id,msg.content);}elseif(strcmp(msg.channel,MIMI_CHAN_TELEGRAM)0){telegram_send_message(msg.chat_id,msg.content);}elseif(strcmp(msg.channel,MIMI_CHAN_WEBSOCKET)0){ws_server_send(msg.chat_id,msg.content);}free(msg.content);}}voidapp_main(void){ESP_LOGI(TAG,);ESP_LOGI(TAG, MimiClaw - ESP32-S3 AI Agent);ESP_LOGI(TAG,);ESP_LOGI(TAG,Internal free: %d bytes,(int)heap_caps_get_free_size(MALLOC_CAP_INTERNAL));ESP_LOGI(TAG,PSRAM free: %d bytes,(int)heap_caps_get_free_size(MALLOC_CAP_SPIRAM));// 基础系统ESP_ERROR_CHECK(init_nvs());ESP_ERROR_CHECK(esp_event_loop_create_default());ESP_ERROR_CHECK(init_spiffs());// 核心子系统ESP_ERROR_CHECK(message_bus_init());ESP_ERROR_CHECK(memory_store_init());ESP_ERROR_CHECK(skill_loader_init());ESP_ERROR_CHECK(session_mgr_init());ESP_ERROR_CHECK(wifi_manager_init());ESP_ERROR_CHECK(http_proxy_init());ESP_ERROR_CHECK(telegram_bot_init());ESP_ERROR_CHECK(feishu_bot_init());ESP_ERROR_CHECK(llm_proxy_init());ESP_ERROR_CHECK(tool_registry_init());ESP_ERROR_CHECK(cron_service_init());ESP_ERROR_CHECK(heartbeat_init());ESP_ERROR_CHECK(agent_loop_init());// 可选显式初始化 LED 和电机if(tool_ws2812_init()ESP_OK){ESP_LOGI(TAG,WS2812 initialized (9 LEDs on GPIO48));}if(tool_motor_init()ESP_OK){ESP_LOGI(TAG,Motor driver initialized (2 motors, differential drive));}// 串口命令行ESP_ERROR_CHECK(serial_cli_init());ESP_LOGI(TAG,Serial CLI started);// WiFi 连接if(wifi_manager_start()ESP_OK){wifi_manager_scan_and_print();if(wifi_manager_wait_connected(30000)ESP_OK){ESP_LOGI(TAG,WiFi connected: %s,wifi_manager_get_ip());}else{ESP_LOGW(TAG,WiFi timeout);}}else{ESP_LOGW(TAG,No WiFi credentials, enter onboarding);wifi_onboard_start(WIFI_ONBOARD_MODE_CAPTIVE);return;}wifi_onboard_start(WIFI_ONBOARD_MODE_ADMIN);// 启动网络服务xTaskCreatePinnedToCore(outbound_dispatch_task,outbound,16384,NULL,5,NULL,1);agent_loop_start();feishu_bot_start();ws_server_start();ESP_LOGI(TAG,All services started! MimiClaw ready.);// 硬编码电机测试等待系统稳定vTaskDelay(pdMS_TO_TICKS(5000));ESP_LOGI(TAG, Testing left motor forward 2 seconds );motor_control(0,1);vTaskDelay(pdMS_TO_TICKS(2000));motor_control(0,0);vTaskDelay(pdMS_TO_TICKS(1000));ESP_LOGI(TAG, Testing right motor forward 2 seconds );motor_control(1,1);vTaskDelay(pdMS_TO_TICKS(2000));motor_control(1,0);ESP_LOGI(TAG, Motor test finished );}/* FreeRTOS 堆栈溢出钩子函数 */voidvApplicationStackOverflowHook(TaskHandle_t xTask,char*pcTaskName){ESP_EARLY_LOGE(TAG,!!! Stack overflow in task: %s !!!,pcTaskName?pcTaskName:unknown);while(1);}这份 mimi.c 已经二次开发是驴友花雕测试版本架构清晰但存在若干可优化的健壮性、可维护性与扩展性问题。以下是针对该文件的改进与升级方案分为立即改进与架构升级两个层面。一、立即改进无需大规模重构启动流程健壮性增强任务优先级与堆栈大小规范3. 内存监控增强app_main 开头打印了总空闲内存但后续未跟踪碎片化。建议每 60 秒通过心跳任务打印一次 heap_caps_get_free_size(MALLOC_CAP_INTERNAL) 与 MALLOC_CAP_SPIRAM用于远程监控。引入 ESP Insights 或自定义内存水位告警。日志系统优化使用 日志分级过滤将 ESP_LOGI 改为 ESP_LOGD 以降低生产环境串口输出。增加日志转发将重要日志通过 message_bus 发送到管理员会话便于远程调试。模块初始化顺序显式化当前初始化顺序虽合理但缺少失败回滚。建议使用 状态机枚举 记录初始化阶段便于定位重启原因。为每个 *_init() 增加反初始化函数在严重错误时可尝试优雅停机。二、架构升级方案中长期演进启动配置中心化现状所有初始化参数散落在各组件头文件或 menuconfig 中调整需重编译。升级方案引入JSON 配置文件存于 SPIFFS 或 LittleFS在 app_main 早期加载typedefstruct{struct{bool enable_ws2812;bool enable_motor;}hardware;struct{intoutbound_stack_size;intagent_priority;}tasks;}app_config_t;好处同一固件可适配不同硬件变体有无电机、LED现场调试无需重刷固件。引入统一电源管理任务电机与 WS2812 是耗电大户当前无节电策略。升级方案创建 power_manager 任务监听 MESSAGE_TYPE_IDLE 事件。空闲超过 30 秒自动关闭 LED、使电机驱动进入低功耗模式。双核任务绑定优化ESP32‑S3 为双核当前仅将 outbound_dispatch_task 固定到 Core 1。建议Core 0协议栈PRO CPU——处理 WiFi、LWIP、HTTP 服务。Core 1应用APP CPU——运行 Agent 推理、电机控制、LED 动画。在 sdkconfig 中启用 CONFIG_FREERTOS_UNICOREn并通过 xTaskCreatePinnedToCore 显式分配。安全启动与固件 OTA 支持当前缺失 OTA 能力无法远程升级。应在 app_main 中增加#ifCONFIG_MIMI_OTA_ENABLEDxTaskCreate(ota_monitor_task,ota,8192,NULL,1,NULL);#endif外设自检与看门狗集成添加硬件自检阶段LED、电机、IMU 等结果上报云端。启用 任务看门狗 (TWDT) 监控 agent_loop_task、outbound_dispatch_task防止死锁导致整机失联。通信总线抽象outbound_dispatch_task 中硬编码了 if (strcmp) 分支扩展新通道如 WhatsApp、Discord需修改此处。升级为注册回调机制typedefvoid(*outbound_handler_t)(constchar*chat_id,constchar*content);voidregister_outbound_channel(constchar*name,outbound_handler_thandler);三、具体代码修改示例部分关键改进改进 app_main 中的 WiFi 配网逻辑// 原代码wifi_onboard_start(WIFI_ONBOARD_MODE_ADMIN);// 总是启动// 改进后if(wifi_manager_get_state()!WIFI_STATE_CONNECTED){wifi_onboard_start(WIFI_ONBOARD_MODE_CAPTIVE);// 等待配网完成阻塞或事件驱动}else{// 仅当用户通过 CLI 请求时才启动 ADMIN 模式ESP_LOGI(TAG,WiFi already connected, admin onboard skipped);}移除电机硬编码测试// 使用条件编译#ifCONFIG_MIMI_FACTORY_TEST_ENABLEvTaskDelay(pdMS_TO_TICKS(5000));run_factory_motor_test();#endif增加模块初始化失败的回滚处理#defineCHECK_INIT(expr,label)do{\if((expr)!ESP_OK){\ESP_LOGE(TAG,Init failed at %s,#expr);\gotolabel;\}\}while(0)// 在 app_main 中使用if(0){cleanup_memory:memory_store_deinit();cleanup_bus:message_bus_deinit();}四、升级后启动时序图推荐流程五、总结上述改进与升级方案覆盖了稳定性、可维护性、扩展性、功耗与安全五个维度。短期内可先实施第一部分“立即改进”以提升现场部署可靠性中长期建议按架构升级路径迭代最终使 MimiClaw 成为一个模块化、可配置、支持 OTA 的生产级 AI Agent 固件。