今天继续昨天的,说一下task之间的消息发送。
task 之间发送消息,第一是要添加一个消息 id,在custom_sap.h里面,
/* Add customization message id here */ MSG_ID_CUSTOM1_CUSTOM2 = CUSTOM_MSG_CODE_BEGIN, MSG_ID_CUSTOM2_CUSTOM1, MSG_ID_MSG_TEST, //添加了一个消息id
接下来是发送
MTK 发送消息是mod 到 mod,因为mod是挂载到task上,那么最终还是发送到task上。
MTK 发送消息是有一套固定的接口,对消息实体也有固定要求。
消息的主体是 ilm_struct 结构:
typedef struct ilm_struct { module_type src_mod_id; //源 mod id module_type dest_mod_id; //目的 mod id sap_type sap_id; // Service Access Pointer Identifier 不清楚干什么用的 msg_type msg_id; // 消息 id 就是上面创建的消息 id local_para_struct *local_para_ptr; //消息信息载体 1 peer_buff_struct *peer_buff_ptr; //消息信息载体 2 } ilm_struct;
这个消息结构不是随便malloc 出来的,是由专门的函数 allocate_ilm 来创建,这个函数会从一个pool 去申请,这样做可以方便控制,同时也可以减少内存分配释放操作,碎片的产生。
创建完毕后,可以填完剩下的信息, 注意 allocate_ilm 参数是当前要发送消息的mod id,不要搞错了。
比如:
ilm_struct *ilm_ptr = allocate_ilm(MOD_TASK_TEST); //创建一个消息结构 ilm_ptr->src_mod_id = MOD_TASK_TEST; //设定源mod id ilm_ptr->sap_id = 0; ilm_ptr->dest_mod_id = MOD_MMI; //设定目的mod id ilm_ptr->msg_id = (msg_type) MSG_ID_MSG_TEST; //设定消息id
接着需要一个消息 实体,也就是搭载具体消息信息的结构体
typedef struct local_para_struct { LOCAL_PARA_HDR } local_para_struct;
#define LOCAL_PARA_HDR / kal_uint8 ref_count; / kal_uint16 msg_len;
分别用来记录该信息的引用次数以及长度。
在实际开发中,其实是扩展这个消息,头结构保持一致就可以(有点像C++的父类子类的意思);
比如:
typedef struct { LOCAL_PARA_HDR char msg_str[10]; int msg_int; }msg_test_struct;
当然这个结构体内存也不是随便分配的,有专门的函数
local_para_struct *local_para = construct_local_para(sizeof(msg_test_strct), TD_CTRL);//第二个参数现在不用。 strcpy(local_para->msg_str,”msg”); local_para->msg_int = 12;
Ok现在可以发送这个消息了
ilm_ptr->local_para_ptr = local_para; msg_send_ext_queue(ilm_ptr) ;
说明:发送消息函数是往task的外部消息队列里发送,这样task就可以通过 receive_msg_ext_q获得,
还有一对函数是处理内部消息队列的 msg_send_int_queue 和 receive_msg_int_q。这两者的不同在于,当调用外部消息接受函数时,如果没有外部消息队列为空,那么task将挂起,直到有消息到达,而内部消息队列则不会挂起,只是返回fasle;
原文转载自:http://blog.youkuaiyun.com/yanwuxufeng/article/details/5770303