From 403447b4bd232154fcf545ca4fd36ade794fe835 Mon Sep 17 00:00:00 2001 From: zhangzhaopeng Date: Tue, 6 Jan 2026 20:13:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=8F=91=E5=B8=83=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E4=BF=AE=E5=A4=8Dby=5Fmodule=E9=93=BE?= =?UTF-8?q?=E8=A1=A8=E9=80=BB=E8=BE=91=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../has_task_msg_mamanger.c | 64 +++++++++---------- 1 file changed, 31 insertions(+), 33 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 97a1b37..b853f10 100644 --- a/mw/has_task_msg_manager/has_task_msg_mamanger.c +++ b/mw/has_task_msg_manager/has_task_msg_mamanger.c @@ -194,7 +194,7 @@ int has_msg_init_module(has_module_ID_e module_id) /* 初始化该模块订阅表 */ for (i = 0; i < (sizeof(g_sub_list) / sizeof(g_sub_list[0])); i++) { - if (g_sub_list[i].module_id == module_id) { + if (g_sub_list[i].module_id == (unsigned char)module_id) { // g_sub_list_index[module_id] = MODULE_MAX; // g_pub_list[module_id].pub_num = 0; /* 已经被初始化了,配置错误 */ @@ -283,7 +283,7 @@ static inline void msg_check_and_free_message(has_msg_node_t *node) } msg_mutex_unlock(target_mutex); if (temp) { - msg_debug("free node addr:0x%p\n", temp); + msg_debug("free node addr:%p\n", temp); msg_free(temp); } } @@ -306,46 +306,48 @@ int has_msg_publish(has_module_ID_e module_id, void *buffer, unsigned int length // return -1; // } has_msg_buffer_t *msg_buffer; - unsigned char sub_index; + has_static_pub_list_t *pub_list; + has_static_sub_list_t *sub_list; MSG_CHECK_MODULE_ID(module_id, -1); + pub_list = &g_pub_list[module_id]; // MSG_CHECK_ID_AND_INDEX TODO:如果使用这个,未初始化的模块也不能发布 - if (g_pub_list[module_id].pub_num == 0) { + if (pub_list->pub_num == 0) { // msg_printf("no one subscribe you:%d\n", module_id); return 0; } /* 根据订阅表分配内存 */ - node = (has_msg_node_t *)msg_malloc((sizeof(has_msg_node_t) * g_pub_list[module_id].pub_num) + node = (has_msg_node_t *)msg_malloc((sizeof(has_msg_node_t) * pub_list->pub_num) + sizeof(has_msg_buffer_t) + length); if (node == NULL) { msg_printf("malloc fail,pub id:%d\n", module_id); return -1; } - msg_debug("publish: id:%d node addr:0x%p\n", module_id, node); - msg_buffer = (has_msg_buffer_t *)(&node[g_pub_list[module_id].pub_num]); - msg_buffer->node_cnt = g_pub_list[module_id].pub_num; + msg_debug("publish: id:%d node addr:%p\n", module_id, node); + msg_buffer = (has_msg_buffer_t *)(&node[pub_list->pub_num]); + msg_buffer->node_cnt = pub_list->pub_num; msg_buffer->length = length; msg_buffer->module_id = module_id; memcpy(msg_buffer->buffer, buffer, length); /* 查订阅表添加消息 */ - for (int i = 0; i < g_pub_list[module_id].pub_num; i++) { - sub_index = g_sub_list_index[g_pub_list[module_id].pub_module[i]]; + for (int i = 0; i < pub_list->pub_num; i++) { + sub_list = &g_sub_list[g_sub_list_index[pub_list->pub_module[i]]]; node[i].msg_buff = msg_buffer; - msg_mutex_lock(&g_sub_list[sub_index].msg_mutex); - list_add_tail(&node[i].list, &g_sub_list[sub_index].msg_list); // 加入消息链表 + msg_mutex_lock(&sub_list->msg_mutex); + list_add_tail(&node[i].list, &sub_list->msg_list); // 加入消息链表 #ifdef MSG_OPT_MUTEX_SEM /* 通知等待线程唤醒 */ - if (msg_sem_notify(&g_sub_list[sub_index].sem) == -1) { + if (msg_sem_notify(&sub_list->sem) == -1) { list_del(&node[i].list); // 添加失败,删除链表 - msg_mutex_unlock(&g_sub_list[sub_index].msg_mutex); + msg_mutex_unlock(&sub_list->msg_mutex); msg_check_and_free_message(&node[i]); msg_printf("warning:Failed to add msg on module:%d !!!\n" - , g_sub_list[sub_index].module_id); + , sub_list->module_id); continue; } #endif - msg_mutex_unlock(&g_sub_list[sub_index].msg_mutex); + msg_mutex_unlock(&sub_list->msg_mutex); } return 0; } @@ -415,7 +417,7 @@ int has_msg_handle_by_module(has_module_ID_e module_id, has_msg_handle_cb cb, msg_mutex_lock(&sub_list->msg_mutex); if (!list_empty(&sub_list->msg_list)) { list_for_each_entry_safe(node, temp, &sub_list->msg_list, list) { - if (node->msg_buff->module_id == pub_module_id) { + if (node->msg_buff->module_id == (unsigned char)pub_module_id) { #ifdef MSG_OPT_MUTEX_SEM if (msg_sem_wait(&sub_list->sem, 0) != WAIT_MSG_COME) { msg_mutex_unlock(&sub_list->msg_mutex); @@ -424,23 +426,19 @@ int has_msg_handle_by_module(has_module_ID_e module_id, has_msg_handle_cb cb, } #endif list_del(&node->list); - break; + msg_mutex_unlock(&sub_list->msg_mutex); + if (cb != NULL) { + cb(node->msg_buff->module_id, node->msg_buff->buffer, node->msg_buff->length); + } + msg_debug("by handle:pub id:%d handle id:%d\n", node->msg_buff->module_id, module_id); + msg_check_and_free_message(node); + return 0; } } - msg_mutex_unlock(&sub_list->msg_mutex); - } else { // 没有消息需要处理 - msg_mutex_unlock(&sub_list->msg_mutex); - return -1; } - - if (cb != NULL) { - cb(node->msg_buff->module_id, node->msg_buff->buffer, node->msg_buff->length); - } - msg_debug("handle:pub id:%d handle id:%d\n", node->msg_buff->module_id, module_id); - msg_check_and_free_message(node); - - - return 0; + // 没有消息需要处理 + msg_mutex_unlock(&sub_list->msg_mutex); + return -1; } /** @@ -686,7 +684,7 @@ int has_msg_subscribe(has_module_ID_e module_id, has_module_ID_e sub_id) if (sub_list->sub_module_cnt < (MODULE_MAX - 1)) { /* 检查是否已经订阅 */ for (j = 0; j < sub_list->sub_module_cnt; j++) { - if (sub_id == sub_list->sub_module[j]) { + if ((unsigned char)sub_id == sub_list->sub_module[j]) { msg_mutex_unlock(&sub_list->msg_mutex); msg_printf("ID:%d has been sub by module:%d\n", sub_id, module_id); return -1; @@ -716,7 +714,7 @@ int has_msg_unsubscribe(has_module_ID_e module_id, has_module_ID_e sub_id) msg_mutex_lock(&sub_list->msg_mutex); for (int j = 0; j < sub_list->sub_module_cnt; j++) { - if (sub_id == sub_list->sub_module[j]) { + if ((unsigned char)sub_id == sub_list->sub_module[j]) { sub_list->sub_module[j] = INVALID_ID; sub_list->sub_module_cnt --; }