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在处理这个消息的时候发生重启

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值