From 3f378c0531ba3573a530a2dab1c8ed98b2df157f Mon Sep 17 00:00:00 2001 From: zhangzhaopeng Date: Tue, 30 Dec 2025 10:45:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A2=84=E7=95=99=E7=9A=84OS?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../has_task_msg_mamanger.c | 99 ++++++++++++++++++- 1 file changed, 96 insertions(+), 3 deletions(-) diff --git a/mw/has_task_msg_manager/has_task_msg_mamanger.c b/mw/has_task_msg_manager/has_task_msg_mamanger.c index c8a7c28..c0cb37c 100644 --- a/mw/has_task_msg_manager/has_task_msg_mamanger.c +++ b/mw/has_task_msg_manager/has_task_msg_mamanger.c @@ -74,7 +74,7 @@ typedef struct { struct list_head msg_list; // 消息链表 } has_static_sub_list_t; static has_static_sub_list_t g_sub_list[] = SUBSCIBE_INFO; -static unsigned char g_sub_list_index[MODULE_MAX] = {0}; // 订阅表id索引 +static unsigned char g_sub_list_index[MODULE_MAX]; // 订阅表id索引 /* 检查ID是否合法,id:检查的ID,ret:不合法时return的值 */ @@ -92,6 +92,7 @@ if (g_sub_list_index[(id)] == MODULE_MAX) { \ int has_msg_init() { int j; + /* 设置无效,标记是否初始化 */ memset(g_sub_list_index, MODULE_MAX, sizeof(g_sub_list_index)); #ifdef MSG_OPT_PUB_LIST memset(g_pub_list, 0, sizeof(g_pub_list)); @@ -103,6 +104,11 @@ int has_msg_init() MSG_ASSERT; // 配置都能写错,必须进断言 return -1; } + /* 已经被初始化了,配置错误 */ + if (g_sub_list_index[g_sub_list[i].module_id] != MODULE_MAX) { + msg_printf("[msg]warning: msg two same module id:%d\n", g_sub_list[i].module_id); + continue; + } /* 检查订阅表ID是否配置正确 */ for (j = 0; j < (MODULE_MAX - 1); j++) { @@ -124,12 +130,13 @@ int has_msg_init() } g_sub_list_index[g_sub_list[i].module_id] = i; // 索引表赋值 #ifdef MSG_OPT_PUB_LIST - /* 构建发布表 */ - for (int k = 0; k < g_sub_list[i].sub_module_cnt; k++) { + /* 通知发布者,需要发给此模块 */ + for (int k = 0; k < g_sub_list[i].sub_module_cnt; k++) { // 寻找发布者 if (g_pub_list[g_sub_list[i].sub_module[k]].pub_num == 0) { msg_mutex_init(&g_pub_list[g_sub_list[i].sub_module[k]].buffer_mutex); } + /* 注册所找到发布者的发布表 */ g_pub_list[g_sub_list[i].sub_module[k]].pub_module[g_pub_list[g_sub_list[i].sub_module[k]].pub_num] = g_sub_list[i].module_id; g_pub_list[g_sub_list[i].sub_module[k]].pub_num ++; } @@ -164,6 +171,92 @@ int has_msg_init() return 0; } +int has_msg_init_module(has_module_ID_e module_id) +{ + int i, j; + /* 检查ID */ + if ((module_id >= MODULE_MAX) || (module_id == INVALID_ID)) { + msg_printf("%s:module_id:%d is invalid\n", __func__, module_id); + MSG_ASSERT; // 配置都能写错,必须进断言 + return -1; + } + /* 初始化该模块订阅表 */ + for (i = 0; i < (sizeof(g_sub_list) / sizeof(g_sub_list[0])); i++) + { + if (g_sub_list[i].module_id == module_id) { +// g_sub_list_index[module_id] = MODULE_MAX; +// #ifdef MSG_OPT_PUB_LIST +// g_pub_list[module_id].pub_num = 0; +// #endif + /* 已经被初始化了,配置错误 */ + if (g_sub_list_index[module_id] != MODULE_MAX) { + msg_printf("[msg]warning: msg two same module id:%d\n", module_id); + break; + } + /* 检查订阅表ID是否配置正确 */ + for (j = 0; j < (MODULE_MAX - 1); j++) { + if (g_sub_list[i].sub_module[j] == INVALID_ID) { + break; + } else if (g_sub_list[i].sub_module[j] >= MODULE_MAX) { + msg_printf("sub_module id:%d is invalid, module:id %d\nplease check the macro:" + " SUBSCIBE_INFO row:%d, sub list:%d\n", g_sub_list[i].sub_module[j], module_id, i, j); + MSG_ASSERT; // 配置都能写错,必须进断言 + return -1; + } + } + + /* 检查订阅数量是否配置正确 */ + if (g_sub_list[i].sub_module_cnt != j) { + msg_printf("sub_module_cnt is config as %d, which actually is %d, please check the" + " macro: SUBSCIBE_INFO row:%d\n", g_sub_list[i].sub_module_cnt, j, i); + MSG_ASSERT; // 配置都能写错,必须进断言 + return -1; + } + g_sub_list_index[module_id] = i; // 索引表赋值 + +#ifdef MSG_OPT_PUB_LIST + /* 通知发布者,需要发给此模块 */ + for (int k = 0; k < g_sub_list[i].sub_module_cnt; k++) { // 寻找发布者 + if (g_pub_list[g_sub_list[i].sub_module[k]].pub_num == 0) { + msg_mutex_init(&g_pub_list[g_sub_list[i].sub_module[k]].buffer_mutex); + } + + /* 注册所找到发布者的发布表 */ + g_pub_list[g_sub_list[i].sub_module[k]].pub_module[g_pub_list[g_sub_list[i].sub_module[k]].pub_num] = module_id; + g_pub_list[g_sub_list[i].sub_module[k]].pub_num ++; + } +#endif + msg_mutex_init(&g_sub_list[i].msg_mutex); // 初始化该模块互斥量 + INIT_LIST_HEAD(&g_sub_list[i].msg_list); // 初始化订阅链表 + break; + } + } + /* 初始化发布表 */ +#ifdef MSG_OPT_DEBUG + if (i == (sizeof(g_sub_list) / sizeof(g_sub_list[0]))) { + msg_debug("module:%d never subscribe any module\n", module_id); + } +#endif + return 0; +} + +/* 如果是OS初始化,则用下列类似调用方式,先清除 +需要初始化的模块再调用 has_msg_init_module 传相应ID */ +int has_msg_os_init() +{ + /* 设置无效,标记是否初始化 */ + memset(g_sub_list_index, MODULE_MAX, sizeof(g_sub_list_index)); +#ifdef MSG_OPT_PUB_LIST + memset(g_pub_list, 0, sizeof(g_pub_list)); +#endif + // for(;;) + // has_msg_init_module(GUI); + // has_msg_init_module(SENSOR); + // has_msg_init_module(ACM); + // has_msg_init_module(WIFI); + // has_msg_init_module(VOICE); +} + int has_msg_publish(has_module_ID_e module_id, void *buffer, unsigned int length) {