MTK task相关Word文档下载推荐.docx
- 文档编号:16598807
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:10
- 大小:19.68KB
MTK task相关Word文档下载推荐.docx
《MTK task相关Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《MTK task相关Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
};
/*CodeBody*/
*handle=&
mmi_handler_info;
returnKAL_TRUE;
}
这个函数的结构,是MTK创建task的基本结构,系统初始化时,会调用该函数。
看里面的结构体
typedefstruct{
kal_task_func_ptrcomp_entry_func;
//task的入口函数
task_init_func_ptrcomp_init_func;
//task的初始化函数
task_cfg_func_ptrcomp_cfg_func;
//task的配置函数
task_reset_func_ptrcomp_reset_func;
//task的重置函数
task_end_func_ptrcomp_end_func;
//task的终止函数
}comptask_handler_struct;
task的入口函数是必须的,这个函数告诉系统,初始化完相应的task控制块后,就要进入该函数来运行。
task初始化函数,是在进入task入口函数之前被调用,用来初始化可能需要的资源,可选。
task终止函数是,当task结束是要调用,用来释放资源,可选。
其他两个函数我也不清楚干什么,希望知道的共享下
先看MMItask的初始化函数.
MMI_BOOLMMI_Init(task_indx_typetask_indx)
//创建一个mutex(互斥体)
mmi_mutex_trace=kal_create_mutex("
mmi_trace"
);
//这个是初始化2step按键,2step按键是指有一些按键具有半按下状态
//比如照相功能,按下一半进行聚焦,再按下一半拍照
mmi_frm_get_2step_keys();
//初始化timer,具体可以看MTKtimer小结系列
L4InitTimer();
//初始化UI相关信息,里面有许多画点,图等函数
setup_UI_wrappers();
returnMMI_TRUE;
初始化函数比较简单。
下面来看MMI的入口函数,这个函数是整个MMI运行的核心。
//为了简单,删除了大部分宏控制程序
voidMMI_task(oslEntryType*entry_param)
MYQUEUEMessage;
oslMsgqidqid;
U32my_index;
U32count=0;
U32queue_node_number=0;
//获得task的外部消息队列id,通过这个id,获得别的task往MMItask发送的消息
//MMItask有两个消息,外部消息队列和内部消息队列
//外部消息队列的消息不直接处理,只是简单的存放到内部消息队列,
//这样使内部消息队列的优先级稍微高一点
qid=task_info_g[entry_param->
task_indx].task_ext_qid;
mmi_ext_qid=qid;
//初始化event处理函数,这个几个event必须在获得消息前就进行注册
//不让可能使得这个event丢弃。
具体event事件,下次介绍
InitEventHandlersBeforePowerOn();
//进入task的while循环
//task的while
(1)循环使得这个task不会结束,只有挂起或者运行
while
(1)
//判断是否有key事件需要处理
if(g_keypad_flag==MMI_TRUE)
mmi_frm_key_handle(NULL);
//获得外部消息队列里,消息的个数
msg_get_ext_queue_info(mmi_ext_qid,&
queue_node_number);
//如果没有任何消息需要处理(内部消息和外部消息都没有,同时也没有按键需要处理)
//OslNumOfCircularQMsgs获得内部消息队列消息的个数
if((queue_node_number==0)&
&
(OslNumOfCircularQMsgs()==0)&
(g_keypad_flag==MMI_FALSE))
U8flag=0;
ilm_structilm_ptr;
//去外部消息队列里获得消息,这是一个阻塞函数,也就是说,如果外部消息队列里,
//没有任何消息,那么这个task将被阻塞,或者说挂起,也就是不在运行,
//直到有消息到达,才会被唤醒,看过操作系统原理的,应该不难理解这个意思和这个本质
OslReceiveMsgExtQ(qid,&
Message);
//如果有消息,获得task的index
OslGetMyTaskIndex(&
my_index);
//设置该task的获得mod为MMImod.
OslStackSetActiveModuleID(my_index,MOD_MMI);
//保存该消息,用于放入到内部队列
ilm_ptr.src_mod_id=Message.src_mod_id;
ilm_ptr.dest_mod_id=Message.dest_mod_id;
ilm_ptr.msg_id=Message.msg_id;
ilm_ptr.sap_id=Message.sap_id;
ilm_ptr.local_para_ptr=Message.local_para_ptr;
ilm_ptr.peer_buff_ptr=Message.peer_buff_ptr;
//放入内部队列
//这个内部队列是个简单的循环队列
flag=OslWriteCircularQ(&
ilm_ptr);
//对timer消息进行特殊处理
if(Message.src_mod_id!
=MOD_TIMER)
hold_local_para(ilm_ptr.local_para_ptr);
hold_peer_buff(ilm_ptr.peer_buff_ptr);
OslFreeInterTaskMsg(&
else
//把外部消息放入到内部消息
mmi_frm_fetch_msg_from_extQ_to_circularQ();
//处理内部消息
count=OslNumOfCircularQMsgs();
while(count>
0)
if(OslReadCircularQ(&
Message))
CheckAndPrintMsgId((U16)(Message.msg_id));
//是否是wap的消息
//这里就体现了一个task可以对应多个mod
if(Message.dest_mod_id==MOD_WAP)
switch(Message.msg_id)
//timer消息具体看MTKtimer小结2
caseMSG_ID_TIMER_EXPIRY:
kal_uint16msg_len;
//处理stacktimer消息
EvshedMMITimerHandler(get_local_para_ptr(Message.oslDataPtr,&
msg_len));
break;
//开机消息
//具体分析见后文
caseMSG_ID_MMI_EQ_POWER_ON_IND:
mmi_eq_power_on_ind_struct*p=(mmi_eq_power_on_ind_struct*)Message.oslDataPtr;
/*Toinitializedata/time*/
SetDateTime((void*)&
(p->
rtc_time));
gdi_init();
g_pwr_context.PowerOnMMIStatus=MMI_POWER_ON_INDICATION;
switch(p->
poweron_mode)
casePOWER_ON_KEYPAD:
OslMemoryStart(MMI_TRUE);
g_charbat_context.PowerOnCharger=0;
g_pwr_context.PowerOnMode=POWER_ON_KEYPAD;
DTGetRTCTime(&
StartUpTime);
memset(&
LastDuration,0,sizeof(LastDuration));
mmi_bootup_entry_disk_check();
casePOWER_ON_PRECHARGE:
casePOWER_ON_CHARGER_IN:
g_pwr_context.PowerOnMode=p->
poweron_mode;
InitializeChargingScr();
if(!
g_charbat_context.isChargerConnected)
QuitSystemOperation();
casePOWER_ON_ALARM:
g_pwr_context.PowerOnMode=POWER_ON_ALARM;
gdi_layer_clear(GDI_COLOR_BLACK);
AlmInitRTCPwron();
casePOWER_ON_EXCEPTION:
g_pwr_context.PowerOnMode=POWER_ON_EXCEPTION;
SetAbnormalReset();
InitializeAll();
OslDumpDataInFile();
ClearInputEventHandler(MMI_DEVICE_ALL);
ClearKeyHandler(KEY_END,KEY_LONG_PRESS);
InitNvramData();
InitAllApplications();
mmi_pwron_exception_check_display();
default:
//event时间,这个也是MMItask的一个重点
ProtocolEventHandler(
(U16)Message.oslMsgId,
(void*)Message.oslDataPtr,
(int)Message.oslSrcId,
(void*)&
}
count--;
MMItask的工作方式:
从外部队列获取消息放入内部消息队列,内部消息队列根据消息类型注册的回调函数,进行调用(event机制,这个又是MMIframework的主要部分之一)。
在MTK上,用户(开发人员)可以根据需要,创建task。
创建一个task分为4步:
1增加一个taskindex到custom_task_indx_type
2增加一个modindex到custom_module_type
3把mod关联到相应的task上,因为一个task可以对应多个mod,所以需要把mod挂载到task上。
(用挂载这个词,应该就比较好理解了,task是MTK执行的基本单位,所以一个mod要能独立运行,就要挂载到某个task上,为什么不一个mod一个task呢,我想task越多,多系统效率影响就越大。
那么就可以考虑互斥的mod挂载到一个task上,反正互斥的,不会同时需要运行,就像音乐,视频,照相机一样,不会同时运行)
4创建task基本信息到custom_comp_config_tbl
下面来具体看一个例子。
1添加taskindex
typedefenum{
INDX_CUSTOM1=RPS_CUSTOM_TASKS_BEGIN,
INDX_CUSTOM2,
#ifdefTASK_CREATE_TEST
INDX_TASK_TEST,
#endif
RPS_CUSTOM_TASKS_END
}custom_task_indx_type;
我们增加了一个taskindexINDX_TASK_TEST
2添加一个modindex
MOD_CUSTOM1=MOD_CUSTOM_BEGIN,
MOD_CUSTOM2,
MOD_TASK_TEST,
MOD_CUSTOM_END
}custom_module_type;
我们增加了一个modindexMOD_TASK_TEST
3挂载mod到task上
custom_task_indx_typecustom_mod_task_g[MAX_CUSTOM_MODS]=
INDX_CUSTOM1,/*MOD_CUSTOM1*/
INDX_CUSTOM2,/*MOD_CUSTOM2*/
INDX_NIL/*PleaseendwithINDX_NILelement*/
这样就把MOD_TASK_TEST挂载到INDX_TASK_TEST上面了,这里的映射关系是通过index来控制的,也就是说要的到MOD_TASK_TEST对应的taskindex,只要这样taskindex=custom_mod_task_g[MOD_TASK_TEST];
,所以创建过程中,顺序一定要对应好,不然容易出错。
4创建task信息
constcomptask_info_structcustom_comp_config_tbl[MAX_CUSTOM_TASKS]=
/*INDX_CUSTOM1*/
{"
CUST1"
"
CUST1Q"
210,1024,10,0,
#ifdefCUSTOM1_EXIST
custom1_create,KAL_FALSE
#else
NULL,KAL_FALSE
},
/*INDX_CUSTOM2*/
CUST2"
CUST2Q"
211,1024,10,0,
#ifdefCUSTOM2_EXIST
custom2_create,KAL_FALSE
#else
/*INDX_TASK_TEST*/
TAST_TEST"
TASK_TESTQ"
212,1024,10,0,
task_test_create,KAL_FALSE
这样就创建好了task的信息,这里说task需要的信息
kal_char*comp_name_ptr;
//task的name
kal_char*comp_qname_ptr;
//外部队列name
kal_uint32comp_priority;
//优先级
kal_uint16comp_stack_size;
//stack大小
kal_uint8comp_ext_qsize;
//外部队列大小
kal_uint8comp_int_qsize;
//内部队列大小
kal_create_func_ptrcomp_create_func;
//task创建函数
kal_boolcomp_internal_ram_stack;
//是否是internal_ram_stack
}comptask_info_struct;
task的优先级是数值越大,优先级越低。
由于是MTK用的是实时操作系统,高优先级的task只要需要,就会先运行,一直运行,所以task的优先级定义时需要考虑清楚。
comp_internal_ram_stack表示是否使用internalramstack,internalram相对速度要快,但是数量很有限,一般自己创建的不要去使用,容易引起问题。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MTK task相关 task 相关