Compare commits
2 Commits
a4d1600de7
...
79a5899717
| Author | SHA1 | Date | |
|---|---|---|---|
| 79a5899717 | |||
| 3f378c0531 |
@@ -5,11 +5,10 @@
|
||||
|
||||
// #define MSG_OPT_DYNAMIC_SUB // 允许动态订阅
|
||||
// #define MSG_OPT_DEBUG // 调试
|
||||
#define MSG_OPT_PUB_LIST // 使用静态发布表(多条消息单次分配内存)
|
||||
|
||||
/* 暂时不支持发布列表和动态订阅同时使用,后续需要再更新支持 */
|
||||
#if defined(MSG_OPT_DYNAMIC_SUB) && defined(MSG_OPT_PUB_LIST)
|
||||
#error "These two functions are not currently supported to be used together."
|
||||
#if defined(MSG_OPT_DYNAMIC_SUB)
|
||||
#error "These functions is not currently supported to be used together."
|
||||
#endif
|
||||
|
||||
#ifdef MSG_OPT_DEBUG
|
||||
@@ -21,7 +20,6 @@
|
||||
#define MSG_ASSERT {while(1);}
|
||||
|
||||
#pragma pack(1)
|
||||
#ifdef MSG_OPT_PUB_LIST
|
||||
/* 消息数据 */
|
||||
typedef struct {
|
||||
unsigned char module_id; // 发布的模块ID
|
||||
@@ -34,18 +32,8 @@ typedef struct {
|
||||
struct list_head list; // 消息链表
|
||||
has_msg_buffer_t *msg_buff;
|
||||
} has_msg_node_t;
|
||||
#else
|
||||
/* 消息节点和数据 */
|
||||
typedef struct {
|
||||
unsigned char module_id; // 发布的模块ID
|
||||
struct list_head list; // 消息链表
|
||||
unsigned int length;
|
||||
unsigned char buffer[];
|
||||
} has_msg_node_t;
|
||||
#endif
|
||||
#pragma pack()
|
||||
|
||||
#ifdef MSG_OPT_PUB_LIST
|
||||
/* 静态发布列表 */
|
||||
typedef struct {
|
||||
unsigned char pub_module[MODULE_MAX - 1]; // 发布表
|
||||
@@ -55,7 +43,6 @@ typedef struct {
|
||||
unsigned char pub_num;
|
||||
} has_static_pub_list_t;
|
||||
static has_static_pub_list_t g_pub_list[MODULE_MAX] = {0};
|
||||
#endif
|
||||
|
||||
/* 静态订阅列表 */
|
||||
typedef struct {
|
||||
@@ -74,7 +61,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,10 +79,9 @@ 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));
|
||||
#endif
|
||||
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)) {
|
||||
@@ -103,6 +89,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++) {
|
||||
@@ -123,17 +114,16 @@ int has_msg_init()
|
||||
return -1;
|
||||
}
|
||||
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 ++;
|
||||
}
|
||||
#endif
|
||||
msg_mutex_init(&g_sub_list[i].msg_mutex); // 初始化该模块互斥量
|
||||
INIT_LIST_HEAD(&g_sub_list[i].msg_list); // 初始化订阅链表
|
||||
}
|
||||
@@ -150,7 +140,6 @@ int has_msg_init()
|
||||
// }
|
||||
// msg_printf("\n");
|
||||
// }
|
||||
#ifdef MSG_OPT_PUB_LIST
|
||||
// msg_printf("\n");
|
||||
// for (int i = 1; i < MODULE_MAX; i++) {
|
||||
// msg_printf("module:%d publish to:\n", i);
|
||||
@@ -160,10 +149,89 @@ int has_msg_init()
|
||||
// msg_printf("\n");
|
||||
// }
|
||||
#endif
|
||||
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;
|
||||
// g_pub_list[module_id].pub_num = 0;
|
||||
/* 已经被初始化了,配置错误 */
|
||||
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; // 索引表赋值
|
||||
|
||||
/* 通知发布者,需要发给此模块 */
|
||||
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 ++;
|
||||
}
|
||||
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));
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
int has_msg_publish(has_module_ID_e module_id, void *buffer, unsigned int length)
|
||||
{
|
||||
@@ -174,7 +242,6 @@ int has_msg_publish(has_module_ID_e module_id, void *buffer, unsigned int length
|
||||
// if (length == 0) {
|
||||
// return -1;
|
||||
// }
|
||||
#ifdef MSG_OPT_PUB_LIST
|
||||
has_msg_buffer_t *msg_buffer;
|
||||
unsigned char sub_index;
|
||||
|
||||
@@ -204,49 +271,11 @@ int has_msg_publish(has_module_ID_e module_id, void *buffer, unsigned int length
|
||||
list_add_tail(&node[i].list, &g_sub_list[sub_index].msg_list); // 加入消息链表
|
||||
msg_mutex_unlock(&g_sub_list[sub_index].msg_mutex);
|
||||
}
|
||||
#else
|
||||
int i;
|
||||
|
||||
msg_debug("publish: id:%d\n", module_id);
|
||||
for (i = 0; i < (sizeof(g_sub_list) / sizeof(g_sub_list[0])); i++) { // 遍历模块
|
||||
#ifdef MSG_OPT_DYNAMIC_SUB
|
||||
msg_mutex_lock(&g_sub_list[i].msg_mutex);
|
||||
#endif
|
||||
for (int j = 0; j < g_sub_list[i].sub_module_cnt; j++) { // 查找订阅表
|
||||
if ((unsigned char)module_id == g_sub_list[i].sub_module[j]) { // 找到订阅信息
|
||||
node = msg_malloc(sizeof(has_msg_node_t) + length);
|
||||
msg_debug("node addr:0x%p\n", node);
|
||||
if (node == NULL) {
|
||||
msg_printf("malloc fail,pub id:%d\n", module_id);
|
||||
#ifdef MSG_OPT_DYNAMIC_SUB
|
||||
msg_mutex_unlock(&g_sub_list[i].msg_mutex);
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
node->length = length;
|
||||
node->module_id = module_id;
|
||||
memcpy(node->buffer, buffer, length);
|
||||
#ifndef MSG_OPT_DYNAMIC_SUB
|
||||
msg_mutex_lock(&g_sub_list[i].msg_mutex);
|
||||
#endif
|
||||
list_add_tail(&node->list, &g_sub_list[i].msg_list); // 加入消息链表
|
||||
#ifndef MSG_OPT_DYNAMIC_SUB
|
||||
msg_mutex_unlock(&g_sub_list[i].msg_mutex);
|
||||
#endif
|
||||
|
||||
break; // 不可重复订阅
|
||||
}
|
||||
}
|
||||
#ifdef MSG_OPT_DYNAMIC_SUB
|
||||
msg_mutex_unlock(&g_sub_list[i].msg_mutex);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* TODO:更合理的方式是每个消息一个互斥量,但是可能会导致每个消息malloc和free的时候频繁init和deinit */
|
||||
#ifdef MSG_OPT_PUB_LIST
|
||||
|
||||
/* 检查计数判断该消息是否被所有订阅模块处理完,处理完就释放内存 */
|
||||
static inline void msg_check_and_free_message(has_msg_node_t *node)
|
||||
{
|
||||
@@ -266,7 +295,6 @@ static inline void msg_check_and_free_message(has_msg_node_t *node)
|
||||
msg_free(temp);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
int has_msg_handle(has_module_ID_e module_id, has_msg_handle_cb cb)
|
||||
{
|
||||
@@ -287,19 +315,11 @@ int has_msg_handle(has_module_ID_e module_id, has_msg_handle_cb cb)
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef MSG_OPT_PUB_LIST
|
||||
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);
|
||||
#else
|
||||
if (cb != NULL) {
|
||||
cb(node->module_id, node->buffer, node->length);
|
||||
}
|
||||
msg_debug("handle:pub id:%d handle id:%d free addr:0x%p\n", node->module_id, module_id, node);
|
||||
msg_free(node);
|
||||
#endif
|
||||
|
||||
|
||||
return 0;
|
||||
@@ -318,11 +338,7 @@ int has_msg_handle_by_module(has_module_ID_e module_id, has_msg_handle_cb cb, ha
|
||||
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) {
|
||||
#ifdef MSG_OPT_PUB_LIST
|
||||
if (node->msg_buff->module_id == pub_module_id) {
|
||||
#else
|
||||
if (node->module_id == pub_module_id) {
|
||||
#endif
|
||||
list_del(&node->list);
|
||||
break;
|
||||
}
|
||||
@@ -333,19 +349,11 @@ int has_msg_handle_by_module(has_module_ID_e module_id, has_msg_handle_cb cb, ha
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef MSG_OPT_PUB_LIST
|
||||
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);
|
||||
#else
|
||||
if (cb != NULL) {
|
||||
cb(node->module_id, node->buffer, node->length);
|
||||
}
|
||||
msg_debug("handle:pub id:%d handle id:%d free addr:0x%p\n", node->module_id, module_id, node);
|
||||
msg_free(node);
|
||||
#endif
|
||||
|
||||
|
||||
return 0;
|
||||
@@ -370,19 +378,11 @@ int has_msg_handle_latest(has_module_ID_e module_id, has_msg_handle_cb cb)
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef MSG_OPT_PUB_LIST
|
||||
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);
|
||||
#else
|
||||
if (cb != NULL) {
|
||||
cb(node->module_id, node->buffer, node->length);
|
||||
}
|
||||
msg_debug("handle:pub id:%d handle id:%d free addr:0x%p\n", node->module_id, module_id, node);
|
||||
msg_free(node);
|
||||
#endif
|
||||
|
||||
|
||||
return 0;
|
||||
@@ -414,7 +414,6 @@ unsigned int has_msg_receive(has_module_ID_e module_id, unsigned char *pub_modul
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef MSG_OPT_PUB_LIST
|
||||
memcpy(buf_out, node->msg_buff->buffer, node->msg_buff->length);
|
||||
if (pub_module_id != NULL) {
|
||||
*pub_module_id = node->msg_buff->module_id;
|
||||
@@ -422,16 +421,6 @@ unsigned int has_msg_receive(has_module_ID_e module_id, unsigned char *pub_modul
|
||||
len = 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);
|
||||
#else
|
||||
memcpy(buf_out, node->buffer, node->length);
|
||||
if (pub_module_id != NULL) {
|
||||
*pub_module_id = node->module_id;
|
||||
}
|
||||
|
||||
len = node->length;
|
||||
msg_debug("handle:pub id:%d handle id:%d free addr:0x%p\n", node->module_id, module_id, node);
|
||||
msg_free(node);
|
||||
#endif
|
||||
return len;
|
||||
}
|
||||
|
||||
@@ -459,7 +448,6 @@ unsigned int has_msg_receive_latest(has_module_ID_e module_id, unsigned char *pu
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef MSG_OPT_PUB_LIST
|
||||
memcpy(buf_out, node->msg_buff->buffer, node->msg_buff->length);
|
||||
if (pub_module_id != NULL) {
|
||||
*pub_module_id = node->msg_buff->module_id;
|
||||
@@ -467,16 +455,6 @@ unsigned int has_msg_receive_latest(has_module_ID_e module_id, unsigned char *pu
|
||||
len = 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);
|
||||
#else
|
||||
memcpy(buf_out, node->buffer, node->length);
|
||||
if (pub_module_id != NULL) {
|
||||
*pub_module_id = node->module_id;
|
||||
}
|
||||
|
||||
len = node->length;
|
||||
msg_debug("handle:pub id:%d handle id:%d free addr:0x%p\n", node->module_id, module_id, node);
|
||||
msg_free(node);
|
||||
#endif
|
||||
return len;
|
||||
}
|
||||
#endif
|
||||
@@ -536,12 +514,10 @@ int has_msg_delete_all_message(has_module_ID_e module_id)
|
||||
{
|
||||
has_msg_node_t *node, *temp;
|
||||
has_static_sub_list_t *sub_list;
|
||||
#ifdef MSG_OPT_PUB_LIST
|
||||
struct list_head free_list;
|
||||
has_msg_node_t *free_temp;
|
||||
unsigned char id;
|
||||
INIT_LIST_HEAD(&free_list);
|
||||
#endif
|
||||
MSG_CHECK_ID_AND_INDEX(module_id, -1);
|
||||
|
||||
sub_list = &g_sub_list[g_sub_list_index[module_id]];
|
||||
@@ -550,17 +526,11 @@ int has_msg_delete_all_message(has_module_ID_e module_id)
|
||||
if (!list_empty(&sub_list->msg_list)) {
|
||||
list_for_each_entry_safe(node, temp, &sub_list->msg_list, list) {
|
||||
list_del(&node->list);
|
||||
#ifdef MSG_OPT_PUB_LIST
|
||||
list_add_tail(&node->list, &free_list); // 加入临时链表
|
||||
#else
|
||||
msg_debug("id:%d free addr:0x%p\n", module_id, node);
|
||||
msg_free(node);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
INIT_LIST_HEAD(&sub_list->msg_list);
|
||||
msg_mutex_unlock(&sub_list->msg_mutex);
|
||||
#ifdef MSG_OPT_PUB_LIST
|
||||
/* 释放内存 */
|
||||
list_for_each_entry_safe(node, temp, &free_list, list) {
|
||||
/* msg_check_and_free_message(node); */
|
||||
@@ -577,7 +547,6 @@ int has_msg_delete_all_message(has_module_ID_e module_id)
|
||||
msg_free(free_temp);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user