/** * @file app_modules.c * @brief 模块注册框架实现 * @details 管理已注册线程模块的生命周期: register → init1 → init2 → start → stop。 * 此文件编译进 libsystem.a,供 RTU 主程序使用。 */ #include "mySystem.h" #include "myLog.h" #include #include #include /** 最大可注册模块数 */ #define APP_MODULES_MAX 16 /** 已注册模块表 */ static stru_app_module g_modules[APP_MODULES_MAX]; static int g_module_count = 0; /** 线程句柄表 */ static pthread_t g_threads[APP_MODULES_MAX]; void app_module_register(const char *name, app_init1_fn init1, app_init2_fn init2, app_run_fn run, stru_app *p_app) { if (g_module_count >= APP_MODULES_MAX) { LOG_E("app_module_register: max modules reached"); return; } if (!name || !run) { LOG_E("app_module_register: invalid args"); return; } stru_app_module *m = &g_modules[g_module_count]; m->name = name; m->init1 = init1; m->init2 = init2; m->run = run; m->p_app = p_app; g_module_count++; LOG_I("app_module_register: [%s] registered", name); } int app_modules_init1(void) { for (int i = 0; i < g_module_count; i++) { if (g_modules[i].init1) { LOG_I("app_modules_init1: [%s]...", g_modules[i].name); if (g_modules[i].init1(g_modules[i].p_app) != 0) { LOG_E("app_modules_init1: [%s] failed", g_modules[i].name); return -1; } } } return 0; } int app_modules_init2(void) { for (int i = 0; i < g_module_count; i++) { if (g_modules[i].init2) { LOG_I("app_modules_init2: [%s]...", g_modules[i].name); if (g_modules[i].init2(g_modules[i].p_app) != 0) { LOG_E("app_modules_init2: [%s] failed", g_modules[i].name); return -1; } } } return 0; } void app_modules_start(void) { for (int i = 0; i < g_module_count; i++) { LOG_I("app_modules_start: [%s]...", g_modules[i].name); if (pthread_create(&g_threads[i], NULL, g_modules[i].run, g_modules[i].p_app) != 0) { LOG_E("app_modules_start: [%s] thread create failed", g_modules[i].name); } } } void app_modules_stop(void) { for (int i = 0; i < g_module_count; i++) { if (g_modules[i].p_app && g_modules[i].p_app->p_event) { task_event_send(g_modules[i].p_app->p_event, 0x80); /* 停止信号 */ } } } void app_modules_join(void) { for (int i = 0; i < g_module_count; i++) { if (g_threads[i]) { pthread_join(g_threads[i], NULL); LOG_I("app_modules_join: [%s] exited", g_modules[i].name); } } }