[TOC]
前言
搭建好开发环境,输出log 信息之后,在阅读代码过程中发现,新的软件架构在task ,message方面,新增了一些应用,例如message_boker, Task list之类的。本文就针对新增的message , task list的原理做一个阐述
MESSAGE_BASE & MESSAGE_GROUP
在代码中出现了诸如LOGIC_INPUT_MESSAGE_BASE , UI_TELEPHONY_MESSAGE_GROUP 之类的,搜寻代码,无法找到它们这些消息ID的定义,其实这些定义都在domain_message.h 中已经定义,详情如下:
首先了解
xx_MESSAGE_GROUP和xx_MESSAGE_BASE之间的关系1
xx_MESSAGE_GROUP = xx_MESSAGE_BASE << 8
所有的
MESSAGE_GROUP的定义1
2
3
4
5
6
7
8enum message_groups
{
FOREACH_DOMAINS_MESSAGE_GROUP(EXPAND_AS_MESSAGE_GROUP_ENUM)
FOREACH_SERVICES_MESSAGE_GROUP(EXPAND_AS_MESSAGE_GROUP_ENUM)
FOREACH_TOPOLOGY_MESSAGE_GROUP(EXPAND_AS_MESSAGE_GROUP_ENUM)
FOREACH_APPS_MESSAGE_GROUP(EXPAND_AS_MESSAGE_GROUP_ENUM)
FOREACH_UI_INPUTS_MESSAGE_GROUP(EXPAND_AS_MESSAGE_GROUP_ENUM)
};它等价于如下代码,具体的细节查看
domain_message.h:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23enum message_groups
{
INTERNAL_MESSAGE_GROUP,
AV_MESSAGE_GROUP, /* See #av_status_messages */ \ ................................................................
LEAKTHROUGH_MESSAGE_GROUP, /* See leakthrough_msg_t */\
QCOM_CON_MANAGER_MESSAGE_GROUP,
HANDSET_SERVICE_MESSAGE_GROUP,
............................
AUDIO_CURATION_SERVICE_MESSAGE_GROUP,
TWS_TOPOLOGY_SERVICE_MESSAGE_GROUP, /* See #tws_topology_message_t */ \
TWS_TOPOLOGY_CLIENT_NOTIFIER_SERVICE_MESSAGE_GROUP,
HEADSET_TOPOLOGY_SERVICE_MESSAGE_GROUP,
SYSTEM_SERVICE_MESSAGE_GROUP,
CONN_RULES_SERVICE_MESSAGE_GROUP,
EARBUD_ROLE_SERVICE_MESSAGE_GROUP,
UI_INPUTS_TELEPHONY_MESSAGE_GROUP,
.................................
UI_INPUTS_BOUNDS_CHECK_MESSAGE_GROUP
}MESSAGE_GROUP的值确定了,那么每个group的MESSAGE_BASE值也随之确认1
2
3
4
5
6
7
8typedef enum
{
FOREACH_DOMAINS_MESSAGE_GROUP(EXPAND_AS_MESSAGE_BASE_ENUM)
FOREACH_SERVICES_MESSAGE_GROUP(EXPAND_AS_MESSAGE_BASE_ENUM)
FOREACH_TOPOLOGY_MESSAGE_GROUP(EXPAND_AS_MESSAGE_BASE_ENUM)
FOREACH_APPS_MESSAGE_GROUP(EXPAND_AS_MESSAGE_BASE_ENUM)
FOREACH_UI_INPUTS_MESSAGE_GROUP(EXPAND_AS_MESSAGE_BASE_ENUM)
} message_base_t;它等价以下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23enum message_groups
{
INTERNAL_MESSAGE_GROUP << 8,
AV_MESSAGE_GROUP << 8, /* See #av_status_messages */ \ ................................................................
LEAKTHROUGH_MESSAGE_GROUP << 8, /* See leakthrough_msg_t */\
QCOM_CON_MANAGER_MESSAGE_GROUP << 8,
HANDSET_SERVICE_MESSAGE_GROUP << 8,
............................
AUDIO_CURATION_SERVICE_MESSAGE_GROUP << 8,
TWS_TOPOLOGY_SERVICE_MESSAGE_GROUP << 8, /* See #tws_topology_message_t */ \
TWS_TOPOLOGY_CLIENT_NOTIFIER_SERVICE_MESSAGE_GROUP << 8,
HEADSET_TOPOLOGY_SERVICE_MESSAGE_GROUP << 8,
SYSTEM_SERVICE_MESSAGE_GROUP << 8,
CONN_RULES_SERVICE_MESSAGE_GROUP << 8,
EARBUD_ROLE_SERVICE_MESSAGE_GROUP << 8,
UI_INPUTS_TELEPHONY_MESSAGE_GROUP << 8,
.................................
UI_INPUTS_BOUNDS_CHECK_MESSAGE_GROUP << 8
}
MESSAGE_BROKER
有关message_broker官方只有如下说明:
The Message Broker allows client modules to register interest
in System Messages by Message Group. The Message Broker registers
with the message group owner on behalf of the client module. The
message group owner subsequently messages the client module directly.
The message group owner’s messge group ID and registration function
is provides to message broker in MessageBroker_init().
意思是:message broker允许将感兴趣的message_group注册到系统消息中。
应该代码中只应用到两个API:
- MessageBroker_Init()
代码中该代码中的涉及的参数message_broker_group_registrations_end[]和message_broker_group_registrations_begain[]具体定义都不可见。所以 MessageGroupRegister
和MessageGroupUnregister 两个函数的定义也未知。
- void MessageBroker_RegisterInterestInMsgGroups(Task task, const message_group_t* msg_groups, unsigned num_groups)
num_groups是指在*msg_groups为第一个message_group,在此基础上的几个message_group.
此函数最后要调用registration->MessageGroupRegister(task, group) ,但由于MessageGroupRegister的具体定义未知,所以也无从查询它究竟做了什么.
- 疑问?
message_broker的具体怎么应用,目前尚未知道,在后续的代码中希望可以找到答案。
Tasklist application
task list 中应用到的结构体如下图所示:
/task_list_struct.png)/task_list_struct.png)
创建task list
- 动态的task list : TaskList_Create()
- 静态的task list : TaskList_Initralise(), 它设置
目前代码中,两者创建的容量都是1,唯一区别就是
no_destroy的赋值不一样,动态赋值:false, 静态赋值TRUETaskList_AddTask(), 一般在register一个task的时候就需要该操作
使用过程中,就可以利用task list 来发送消息:Tasklist_MessageSendId()
动态创建tasklist后,unresgister 一个task的时候:
- TaskList_RemoveTask()
- 通过TaskList_Size()判断 task 是否为零,如果等于零,则TaskList_Destroy()