调整格式,添加注释和说明

This commit is contained in:
2025-12-30 15:39:29 +08:00
parent 79a5899717
commit 83b013c678
3 changed files with 127 additions and 26 deletions

View File

@@ -0,0 +1,6 @@
这个软件用于代码模块之间的消息传递,采用发布-订阅的方式传递消息
使用方法:
1. 在 has_task_msg_os_port.h 选择操作系统更改宏MSG_OPT_OS。或选择自定义自己实现接口。
2. 在 has_task_msg.h 中添加自己负责的软件模块id号has_module_ID_e并且完成订阅表 SUBSCIBE_INFO
填表要把模块的id、模块要订阅的id等信息填好。
3. 代码中使用:初始化、发布、订阅和消息回调即可。请参考示例 msg_example.c

View File

@@ -20,19 +20,34 @@ typedef enum {
{ \
{GUI, 4, {ACM, SENSOR, WIFI, VOICE}}, \
{SENSOR, 1, {GUI}}, \
{ACM, 1, {WIFI}}, \
{WIFI, 0}, \
{VOICE, 3, {ACM, VOICE, GUI}}, \
}
/* 消息处理回调 */
// #define SUBSCIBE_INFO \
// { \
// {GUI, 4, {ACM, WIFI, VOICE, SENSOR}}, \
// {SENSOR, 5, {ACM, GUI, WIFI, VOICE, SENSOR}}, \
// {ACM, 4, {GUI, WIFI, VOICE, SENSOR}}, \
// {WIFI, 4, {ACM, GUI, VOICE, SENSOR}}, \
// {VOICE, 4, {ACM, WIFI, GUI, SENSOR}}, \
// }
/**
* @brief 消息处理回调类型
* @param module_id:发布者的id号
* @param buf:消息数据指针
* @param len:消息数据长度
* @return 0:成功 -1失败
*/
typedef int (*has_msg_handle_cb)(unsigned char module_id, const unsigned char *buf, unsigned int len);
/* 基础功能 */
int has_msg_init(void);
int has_msg_init_module(has_module_ID_e module_id); // HAS OS调用
int has_msg_publish(has_module_ID_e module_id, void *buffer, unsigned int length);
int has_msg_handle(has_module_ID_e module_id, has_msg_handle_cb cb);
int has_msg_os_init(void);
unsigned int has_msg_is_message_empty(has_module_ID_e module_id);
unsigned int has_msg_get_message_number(has_module_ID_e module_id);
int has_msg_delete_all_message(has_module_ID_e module_id);

View File

@@ -1,3 +1,12 @@
/*
* has_task_msg_manager/has_task_msg_manager.c
*
* Author: zhangzhaopeng
* Version 1.0
* Created on : 2025-12-29
* 这个软件用于代码模块之间的消息传递,采用发布-订阅的方式传递消息
*
*/
#include <string.h>
#include "list.h"
#include "has_task_msg.h"
@@ -76,6 +85,11 @@ if (((id) >= MODULE_MAX) || ((id) == INVALID_ID)) { \
if (g_sub_list_index[(id)] == MODULE_MAX) { \
return (ret);}
/**
* @brief 初始化消息表
*
* @return 0:成功 -1失败
*/
int has_msg_init()
{
int j;
@@ -85,7 +99,8 @@ int has_msg_init()
for (int i = 0; i < (sizeof(g_sub_list) / sizeof(g_sub_list[0])); i++) {
/* 检查各模块ID是否配置正确 */
if ((g_sub_list[i].module_id >= MODULE_MAX) || (g_sub_list[i].module_id == INVALID_ID)) {
msg_printf("module_id:%d is invalid, please check the macro:SUBSCIBE_INFO row:%d\n", g_sub_list[i].module_id, i);
msg_printf("module_id:%d is invalid, please check the macro:SUBSCIBE_INFO row:%d\n"
, g_sub_list[i].module_id, i);
MSG_ASSERT; // 配置都能写错,必须进断言
return -1;
}
@@ -100,16 +115,18 @@ int has_msg_init()
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], g_sub_list[i].module_id, i, j);
msg_printf("sub_module id:%d is invalid, module:id %d\n"
"please check the macro: SUBSCIBE_INFO row:%d, sub list:%d\n"
, g_sub_list[i].sub_module[j] , g_sub_list[i].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_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;
}
@@ -121,7 +138,9 @@ int has_msg_init()
}
/* 注册所找到发布者的发布表 */
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_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 ++;
}
msg_mutex_init(&g_sub_list[i].msg_mutex); // 初始化该模块互斥量
@@ -152,6 +171,13 @@ int has_msg_init()
return 0;
}
/**
* @brief 根据模块分别初始化消息表
*
* @param module_id:模块id号
* @return 0:成功 -1失败
* 用于HAS OS中的初始化
*/
int has_msg_init_module(has_module_ID_e module_id)
{
int i, j;
@@ -177,8 +203,9 @@ int has_msg_init_module(has_module_ID_e module_id)
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_printf("sub_module id:%d is invalid, module:id %d\n"
"please 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;
}
@@ -186,8 +213,9 @@ int has_msg_init_module(has_module_ID_e module_id)
/* 检查订阅数量是否配置正确 */
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_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;
}
@@ -200,7 +228,8 @@ int has_msg_init_module(has_module_ID_e module_id)
}
/* 注册所找到发布者的发布表 */
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_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 ++;
}
msg_mutex_init(&g_sub_list[i].msg_mutex); // 初始化该模块互斥量
@@ -208,7 +237,7 @@ int has_msg_init_module(has_module_ID_e module_id)
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);
@@ -224,15 +253,21 @@ int has_msg_os_init()
/* 设置无效,标记是否初始化 */
memset(g_sub_list_index, MODULE_MAX, sizeof(g_sub_list_index));
memset(g_pub_list, 0, sizeof(g_pub_list));
// 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);
for (int i = INVALID_ID + 1; i < MODULE_MAX; i++)
{
has_msg_init_module(i);
}
}
/**
* @brief 发布一个消息
*
* @param module_id:发布消息的模块id号
* @param buffer:消息数据指针
* @param length:消息数据长度
* @return 0:成功 -1失败
*/
int has_msg_publish(has_module_ID_e module_id, void *buffer, unsigned int length)
{
has_msg_node_t *node;
@@ -246,13 +281,15 @@ int has_msg_publish(has_module_ID_e module_id, void *buffer, unsigned int length
unsigned char sub_index;
MSG_CHECK_MODULE_ID(module_id, -1);
// MSG_CHECK_ID_AND_INDEX TODO:如果使用这个,未初始化的模块也不能发布
if (g_pub_list[module_id].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) + sizeof(has_msg_buffer_t) + length);
node = (has_msg_node_t *)msg_malloc((sizeof(has_msg_node_t) * g_pub_list[module_id].pub_num)
+ sizeof(has_msg_buffer_t) + length);
if (node == NULL) {
msg_printf("malloc fail,pub id:%d\n", module_id);
return -1;
@@ -296,6 +333,13 @@ static inline void msg_check_and_free_message(has_msg_node_t *node)
}
}
/**
* @brief 处理一个消息,先入先出
*
* @param module_id:处理消息的模块id号
* @param cb:消息处理回调
* @return 0:成功 -1失败
*/
int has_msg_handle(has_module_ID_e module_id, has_msg_handle_cb cb)
{
has_msg_node_t *node;
@@ -325,7 +369,16 @@ int has_msg_handle(has_module_ID_e module_id, has_msg_handle_cb cb)
return 0;
}
int has_msg_handle_by_module(has_module_ID_e module_id, has_msg_handle_cb cb, has_module_ID_e pub_module_id)
/**
* @brief 处理一个指定发布者的消息,先入先出
*
* @param module_id:处理消息的模块id号
* @param cb:消息处理回调
* @param pub_module_id:指定发布者的id号
* @return 0:成功 -1失败
*/
int has_msg_handle_by_module(has_module_ID_e module_id, has_msg_handle_cb cb,
has_module_ID_e pub_module_id)
{
has_msg_node_t *node, *temp;
has_static_sub_list_t *sub_list;
@@ -359,6 +412,13 @@ int has_msg_handle_by_module(has_module_ID_e module_id, has_msg_handle_cb cb, ha
return 0;
}
/**
* @brief 处理一个最近收到的消息
*
* @param module_id:处理消息的模块id号
* @param cb:消息处理回调
* @return 0:成功 -1失败
*/
int has_msg_handle_latest(has_module_ID_e module_id, has_msg_handle_cb cb)
{
has_msg_node_t *node;
@@ -390,7 +450,8 @@ int has_msg_handle_latest(has_module_ID_e module_id, has_msg_handle_cb cb)
/* 将消息复制出接口处理,不建议使用 */
#if 1
unsigned int has_msg_receive(has_module_ID_e module_id, unsigned char *pub_module_id, unsigned char *buf_out)
unsigned int has_msg_receive(has_module_ID_e module_id, unsigned char *pub_module_id,
unsigned char *buf_out)
{
has_msg_node_t *node;
has_static_sub_list_t *sub_list;
@@ -424,7 +485,8 @@ unsigned int has_msg_receive(has_module_ID_e module_id, unsigned char *pub_modul
return len;
}
unsigned int has_msg_receive_latest(has_module_ID_e module_id, unsigned char *pub_module_id, unsigned char *buf_out)
unsigned int has_msg_receive_latest(has_module_ID_e module_id, unsigned char *pub_module_id,
unsigned char *buf_out)
{
has_msg_node_t *node;
has_static_sub_list_t *sub_list;
@@ -459,6 +521,12 @@ unsigned int has_msg_receive_latest(has_module_ID_e module_id, unsigned char *pu
}
#endif
/**
* @brief 判断消息链表是否是空,没有消息要处理就是空
*
* @param module_id:要查空的模块id号
* @return 0:没有消息 -1有消息待处理
*/
unsigned int has_msg_is_message_empty(has_module_ID_e module_id)
{
has_msg_node_t *node, *temp;
@@ -478,6 +546,12 @@ unsigned int has_msg_is_message_empty(has_module_ID_e module_id)
}
}
/**
* @brief 获取待处理消息的个数
*
* @param module_id:处理消息的模块id号
* @return num : 消息数量
*/
unsigned int has_msg_get_message_number(has_module_ID_e module_id)
{
has_msg_node_t *node, *temp;
@@ -510,6 +584,12 @@ int has_msg_printf_subscribe(has_module_ID_e module_id)
return 0;
}
/**
* @brief 删除所有未处理的消息
*
* @param module_id:处理消息的模块id号
* @return 0:成功 -1失败
*/
int has_msg_delete_all_message(has_module_ID_e module_id)
{
has_msg_node_t *node, *temp;