MTK task 小结 5

本文详细介绍了MTK平台任务(task)之间如何发送消息。消息发送涉及添加消息ID,使用特定接口及ilm_struct结构体。消息主体通过allocate_ilm函数从内存池分配,避免频繁内存操作。在实际应用中,可通过扩展ilm_struct来承载具体消息信息,并使用特定函数进行消息发送,外部消息队列允许任务挂起等待,而内部消息队列则不会。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天继续昨天的,说一下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;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值