MTK發送內部消息發送流程

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章