- 平臺環境: 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在處理這個消息的時候發生重啓