MTK进阶——TASK创建及使用

1、创建Task
1)添加Task索引和Module ID
在Custom_config.h文件中custom_task_indx_type和custom_module_type两个枚举中分别添加Task索引(INDX_TEST)和Module ID(MOD_TEST)。
2)添加Task索引和Module ID的映射
在Custom_config.c文件中custom_mod_task_g中增加Module和Task的映射(INDX_TEST)。注意此处映射顺序应和Module ID中定义的顺序一致,也建议以上三个定义顺序一致。

2、配置Task
完成创建以后我们继续在Custom_config.c中的custom_comp_config_tbl(comptask_info_struct类型结构体数组)下添加配置信息({“Test”, "Test", 210, 1024, 10, 0, test_task_create, KAL_FALSE})
comptask_info_struct结构体定义如下:
typedef struct {
kal_char             *comp_name_ptr;//Task名称
kal_char             *comp_qname_ptr;//外部队列名称
kal_uint32           comp_priority;//Task优先级
kal_uint16           comp_stack_size;//Task堆栈大小
kal_uint8            comp_ext_qsize;//外部队列大小
kal_uint8            comp_int_qsize;//内部队列大小
kal_create_func_ptr  comp_create_func;//创建Task的入口函数,返回kal_bool类型,要求参数为comptask_handler_struct **,定义见下方。
kal_bool             comp_internal_ram_stack;//暂不知道作何用处,一般为KAL_FALSE
} comptask_info_struct;
comptask_handler_struct定义Task生命周期内系统将要回调函数入口:
typedef struct {
kal_task_func_ptr    comp_entry_func;//主函数,实现为一个消息循环
task_init_func_ptr   comp_init_func;//初始化函数
task_cfg_func_ptr    comp_cfg_func;//配置函数
task_reset_func_ptr  comp_reset_func;//重置函数
task_end_func_ptr    comp_end_func;//Task结束时调用
} comptask_handler_struct;

3、Task实现及使用
kal_bool test_task_create(comptask_handler_struct **handle)
{
static const comptask_handler_struct test_handler_info =
{
test_main,  /* task entry function */
NULL,  /* task initialization function */
NULL,  /* task configuration function */
NULL,  /* task reset handler */
NULL,  /* task termination handler */
};

*handle = (comptask_handler_struct *)&test_handler_info;
return KAL_TRUE;
}
static void test_main(task_entry_struct * task_entry_ptr)
{
ilm_struct current_ilm;
while(1){
receive_msg_ext_q(task_info_g[task_entry_ptr->task_indx].task_ext_qid, &current_ilm);//该处是外部消息队列,内部的用receive_msg_int_q
swich(current_ilm.msg_id)
{
case MSG_ID_TEST_START:
break;
default:
break;
}
free_ilm(&current_ilm);
}
}
两种定义消息ID的方法:
1)adaptation\include\stack_msgs.h中的msg_type中MSG_ID_END之前定义;
2)在interface\ps文件夹中加一个头文件(如test_sap.h),并在其中定义ID,将该头文件包含到stack_msgs.h中
消息结构ilm_struct:
typedef struct ilm_struct {
module_type       src_mod_id;//请求服务的模块ID
module_type       dest_mod_id;//接收请求的模块ID
sap_type          sap_id;//服务请求标识,没有定义可填0
msg_type          msg_id;//请求消息ID
local_para_struct *local_para_ptr;//请求需要提供的附加信息,指向包含IML本地参数的内存地址指针,没有为NULL
peer_buff_struct  *peer_buff_ptr;//请求需要提供的附加信息,指向包含同等信息缓冲区的指针,没有为NULL
} ilm_struct;
填充消息结构体,定义local_para_ptr相对应的结构体:
typedef struct
{
LOCAL_PARA_HDR
/* 首先包含LOCAL_PARA_HDR ,再定义消息相关函数
#define LOCAL_PARA_HDR \
kal_uint8    ref_count; \
kal_uint16    msg_len;
该宏定义了引用次数和消息长度 */
kal_int16 result;
kal_uint16 seq_num;
}media_vid_play_finish_ind_struct;
peer_buff_ptr对应结构定义与local_para_ptr相似,把LOCAL_PARA_HDR换成PEER_BUFF_HDR即可,很少用到peer_buff_ptr。
将消息放到队列:
当源模块和目的模块相同相同时,放入内部消息队列:
kal_bool msg_send_int_queue(ilm_struct * ilm_ptr);
不同时放入外部消息队列:
kal_bool msg_send_ext_queue(ilm_struct * ilm_ptr);
也可使用MTK来封装完成发送,不必关心源与目的模块是否相同:
宏:SEND_ILM(src_mod, dest_mod, sap, ilm_ptr)
完整的消息发送:
void vid_send_play_finish_ind(kal_int16 result)
{
ilm_struct * ilm_ptr = NULL;
ilm_ptr = allocate_ilm(MOD_MMI);
ilm_ptr->msg_id = (msg_type)MSG_ID_TEST;
ilm_ptr->local_para_ptr = NULL;
ilm_ptr->peer_buff_ptr = NULL;

SEND_ILM(MOD_MMI, MOD_TEST, 0, ilm_ptr);
}
示例:
void vid_send_play_finish_ind(kal_int16 result)
{
/*----------------------------------------------------------------*/
/* Local Variables                                                */
/*----------------------------------------------------------------*/
media_vid_play_finish_ind_struct *ind_p;
ilm_struct *ilm_ptr = NULL;

/*----------------------------------------------------------------*/
/* Code Body                                                      */
/*----------------------------------------------------------------*/
kal_trace(TRACE_GROUP_4, VID_TRC_SEND_PLAY_FINISH_IND);

//参数结构体变量构造
ind_p = (media_vid_play_finish_ind_struct*)
construct_local_para(sizeof(media_vid_play_finish_ind_struct), TD_CTRL);

//向结构体中填充参数
ind_p->result = result;
ind_p->seq_num = vid_context_p->seq_num;

ilm_ptr = allocate_ilm(MOD_MED);
ilm_ptr->src_mod_id = MOD_MED;
ilm_ptr->dest_mod_id = vid_context_p->src_mod;
ilm_ptr->sap_id = MED_SAP;

ilm_ptr->msg_id = (msg_type) MSG_ID_MEDIA_VID_PLAY_FINISH_IND;
ilm_ptr->local_para_ptr = (local_para_struct*) ind_p;
ilm_ptr->peer_buff_ptr = NULL;

msg_send_ext_queue(ilm_ptr);

}

转http://hi.baidu.com/surfmygod/blog/item/addc036b28f4d9ca81cb4a34.html


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值