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, ¤t_ilm);//该处是外部消息队列,内部的用receive_msg_int_q swich(current_ilm.msg_id) { case MSG_ID_TEST_START: break; default: break; } free_ilm(¤t_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
|
MTK进阶——TASK创建及使用
最新推荐文章于 2022-03-14 16:05:50 发布