[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
- 动态的task list : TaskList_Create()
- 静态的task list : TaskList_Initralise(), 它设置
目前代码中,两者创建的容量都是1,唯一区别就是
no_destroy
的赋值不一样,动态赋值:false
, 静态赋值TRUE
TaskList_AddTask(), 一般在register一个task的时候就需要该操作
使用过程中,就可以利用task list 来发送消息:Tasklist_MessageSendId()
动态创建tasklist后,unresgister 一个task的时候:
- TaskList_RemoveTask()
- 通过TaskList_Size()判断 task 是否为零,如果等于零,则TaskList_Destroy()