- 平台环境: 6261A
- MTK平台mod和mod之间发送消息的流程
用户使用的参数结构体
/* 消息体的头部 */
#define LOCAL_PARA_HDR \
kal_uint8 ref_count; \
kal_uint8 lp_reserved; \
kal_uint16 msg_len;
/* 在LOCAL_PARA_HDR 后面添加你的参数 */
typedef struct local_para_struct
{
LOCAL_PARA_HDR
/* 自定义参数 */
};
申请消息体空间的接口
/* 这个接口其实是一个宏定义 */
(void *)construct_local_para(
local_size, //消息体长度
TD_CTRL //不用配置
);
自定义了消息体,并且用construct_local_para申请了空间之后就可以封装为MTK队列消息的格式,进行发送了。
MTK队列消息拥有固定的格式:
/* The interlayer message structure, which is exchanged between modules. */
typedef struct ilm_struct {
module_type src_mod_id; // Source module ID of the message
module_type dest_mod_id; // Destination module ID of the message
sap_type sap_id; // Service Access Pointer Identifier
msg_type msg_id; // Message Identifier
local_para_struct *local_para_ptr; // local para pointer
peer_buff_struct *peer_buff_ptr; // peer_buff pointer
} ilm_struct;
需要使用专用的接口分配队列消息体空间:
ilm_struct *allocate_ilm(module_type module_id);
添加到发送队列:
kal_bool msg_send_ext_queue(ilm_struct ilm_ptr);
dest mod需要处理对应的MSG;
void module_main(task_entry_struct *task_entry_ptr)
{
ilm_struct ilm_msg;
while(1)
{
receive_msg_ext_q(
task_info_g[task_entry_ptr->task_index].task_ext_qid,
&ilm_msg
);
switch(ilm_msg.msg_id)
{
case TEST_MSG_ID:
{
handle_test_msg(&ilm_msg.local_para_ptr);
break;
}
default:
break;
}
}
free_ilm(&ilm_msg);
}
示例代码
typedef struct
{
LOCAL_PARA_HDR
kal_uint16 data_len;
kal_uint8 data[1];
} test_message_st;
kal_bool test_msg_send(
module_type src_mod,
module_type dest_mod,
sap_type sap_id,
msg_type msg_id,
local_para_struct *local_para_ptr,
peer_buff_struct *peer_buff_ptr
)
{
ilm_struct *ilm_st = NULL;
ilm_st = allocate_ilm(src_mode);
ilm_st->src_mod_id = src_mod;
ilm_st->dest_mod_id = dest_mod;
ilm_st->sap_id = sap_id;
ilm_st->msg_id = msg_id;
ilm_st->local_para_ptr = local_para_ptr;
ilm_st->peer_buff_ptr = peer_buff_ptr;
return msg_send_ext_queue(ilm_st);
}
kal_bool test_send_message_to_mod(kal_uint8 *data_p, kal_uint16 data_len)
{
test_message_st *test_msg_ptr = NULL;
test_msg_ptr = (test_message_st *)construct_local_para(sizeof(test_message_st) + data_len);
ASSERT(test_msg_ptr != NULL);
//不能这样初始化空间,否则会重启
//memset(test_msg_ptr, 0, (sizeof(test_message_st) + data_len));
test_msg_ptr->data_len = data_len;
memcpy(&test_msg_ptr->data[0], data_p, data_len);
return test_msg_send(
SRC_MOD_ID,
DEST_MODE_ID,
SAP_ID,
TEST_MSG_ID,
(local_para_struct *)test_msg_ptr,
NULL
);
}
请注意test_send_message_to_mod里面注释掉的memset, 如果这里把整个test_message_st空间都写0,会导致里面的LOCAL_PARA_HDR空间也会是0, 这就导致dest_mod在处理这个消息的时候发生重启