![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
MTK 手机
文章平均质量分 76
yanwuxufeng
这个作者很懒,什么都没留下…
展开
-
MTK 内存管理简单总结
<br />MTK 手机用的操作系统是 nucleus, 这是一个rtfs(实时操作系统),这个rtfs本身是不带内存管理功能,所以MTK自己写的内存管理。<br />(nucleus在系统初始化完毕时,会调用Application_Initialize,参数就是可使用内存的起始地址)<br /> <br />大体上来分,MTK内存可以分为3种:control buffer<br />平常使用的OslMalloc就是这个内存。<br />这个内存内部实现是按块来划分的(pool),具体的配置可以custom原创 2010-07-12 22:32:00 · 9354 阅读 · 4 评论 -
MTK MMI event 小结 5
昨天说了一下key event 的基本情况,今天直接从代码开始吧 先看执行key event 函数 mmi_frm_key_handle void mmi_frm_key_handle(void *paraBuff){ kbd_data k; U32 msg_count; mmi_eq_keypad_detect_ind_struct *p; // 判断参数是否为空 // 在 初始化时,系统就注册了 MSG_ID原创 2010-08-06 01:21:00 · 3310 阅读 · 2 评论 -
MTK MMI event 小结 6
在 MTK MMI event 小结 5 中,提到了event 处理函数 mmi_frm_key_handle,这个函数主要作用是判断是否需要处理按键,从按键缓存里面持续的读取按键信息,然后调用 mmi_frm_convert_process_key_event 进行处理。这个函数没有什么可说的,最多是在屏幕旋转的情况下,把 导航键 转换一下,接着它调用了 ProcessKeyEvent, 这个函数主要是对于一些状态的处理,防止key down 和up 不成对,出现混乱。 void P原创 2010-08-08 15:56:00 · 3422 阅读 · 7 评论 -
MTK MMI event 小结 7
到这,key event 的处理基本上就算完成了。其他几个常用的函数注册key 处理函数了。了解了按键event的处理过程之后(其实也是比较简单的),注册函数就很好了解了,就是把相应key 和 event 的数组里放入一个回调函数的指针。比如 void SetKeyHandler(FuncPtr funcPtr, U16 keyCode, U16 keyType) 抛开其他语句,就是一句简单的实现currKeyFuncPtrs[keyCode][keyType] = funcPtr; 还有可以原创 2010-08-09 15:57:00 · 3485 阅读 · 2 评论 -
MTK MMI event 小结 8
在 MTK MMI event 小结 7 中,说到,init 时候, 注册了触摸屏消息MSG_ID_TP_EVENT_IND 的处理函数 mmi_pen_touch_panel_event_ind, static void mmi_pen_touch_panel_event_ind(void *param ){ // 这个用于控制 只有一个 MSG_ID_TP_EVENT_IND 在 消息队列里 g_pen_is_driver_indication_in_q原创 2010-08-10 23:06:00 · 1978 阅读 · 2 评论 -
MTK MMI event 小结 9
到这里 pen event 其实也就差不多了,说一下几个常用的函数: mmi_pen_enable /mmi_pen_disable //打开/关闭 pen 事件 mmi_pen_set_calibration_data / mmi_pen_read_calibration_data //设置和读取校准数据,校准数据总共四个值 x = x*x_scale + x_offset, y = y*y_scale + y_offset mmi_pen_start_calibration原创 2010-08-12 17:41:00 · 1973 阅读 · 0 评论 -
MTK HISTORY 小结 1
MTK 的屏幕历史记录 history 机制也是开发中肯定要遇到的。简单的讲就是应用(界面)切换时,由一个正常的循序。比如A->B->C,那么最长见返回顺序就是C->B->A,这里的ABC可以是应用也可以是应用里的界面,也就是说,当在 某个屏幕按返回键时,能正常地返回到上一界面。从应用开发的角度来讲,应用完全可以自己实现一套机制,让应用自己界面切换顺序正常。但是如果应用之间的切换,那么就需要使用MTK history 机制。 history 实现也并不复杂,在进入一个新的应用是,先调用上一个原创 2010-08-15 19:50:00 · 1824 阅读 · 6 评论 -
MTK HISTROY 小结 3
在 MTK HISTROY 小结 2 介绍了下,当进入一个新的app的时候,MTK 的history 机制 都干了些什么。 1 先把当前app屏幕信息保存到历史history stack 里面 2 回调当前app设置的退出函数,告知app已经被退出 3 清理按键和触摸屏event 和 相应的处理函数。这里需要注意的是对END KEY 进行了特殊处理。 4 设置当前active app 为新app。 说明一点,这里用app之间的切换来说明,其实这套history 机制,可原创 2010-08-18 17:38:00 · 1529 阅读 · 1 评论 -
MTK HISTROY 小结 2
昨天简单的介绍了下,MTK history 机制,今天还是具体来看代码吧。每个应用都会用得的一个函数 EntryNewScreen 开始,这个函数是进入应用是,一开始回调用的函数,这个函数告诉MTK history 机制,需要进入一个新的应用,原来的应用需要被退出(或者说挂起,保存到历史记录里),等到新应用退出时,从新回到该应用(或者说恢复状态,这个具体由应用来确定)。 /** newscrnID 新应用的屏幕id(一个应用可能会有多个 屏幕id)* newExitH原创 2010-08-16 17:44:00 · 1946 阅读 · 1 评论 -
MTK HISTROY 小结 4
在上两偏里,主要讲了进入一个app是需要用到的一个函数 EntryNewScreen,今天就说一下主动退出一个应用需要使用的函数 GoBackHistory,这个函数的作用就是退出当前app,回到上一个app。 在 GoBackHistory 这个函数里,没有什么内容,主要是 一个执行一个函数 ExecutePopHistory(),还有就是设置了 mmi_is_orderly_exit_screen = MMI_FALSE; 对于这个变量,也是一种特殊用法,只有当使用GoBackToHistory原创 2010-08-19 18:20:00 · 1400 阅读 · 1 评论 -
MTK HISTORY 小结 5
连续 一个多星期没写了,这段时间也公司也比较忙,连续加班又刷夜的,都快晕了,不过还是希望公司的产品能上线,也有点成就感。 还是继续 MTK 的 history 机制吧,主要的执行过程已近些完了。说白里,历史记录就是一个栈,先进后出,当然,严格的按照栈的特性,不够灵活,可能会从一个屏幕跳转到特殊的屏幕,这样就需要特殊接口。先把 GoBackHistory 说完,还有一个函数 decrement。 static U8 decrement(void){ // 这个变量是用原创 2010-08-29 17:19:00 · 1649 阅读 · 4 评论 -
MTK HISTORY 小结 6
到这里其实主要history 机制主要得功能都基本ok了,其他的好多接口函数都是换汤不换药,主要就是删除history stack 里面的记录,怎么回调需要被删除的screen 的call back,具体就不说了。 GoBacknHistory 返回到前n个screen id,这个函数有时候还是比较有用,比如当写一个公用模块,处理完毕后,直接返回到调用的地方,这样就不用在意到底是哪个模块调用的,要回到哪里。当然用其他方法来实现,比如保存调用该模块前的screen id等等,但是没有这个函数来的方原创 2010-08-30 16:27:00 · 1490 阅读 · 2 评论 -
MTK socket 小结 1
移动互联网也炒了好几年了,现在开发手机也好,单独做应用也好,都会涉及到网络这一块。MTK 提供了网络功能,在GPRS上封装了socket 功能。MTK 上的socket 其实与linux 上的有些相似,其实说到socket 编程,只要封装实现了socket,那么基本上就要实现socket那些接口。 先来简单的介绍一下socket,socket 编程是介于 传输层 和 应用层之间,可以简单的理解为socket 就是封装了传输层的TCP 和 UDP 协议,使用户不用去封装一个 TCP 或者 UDP原创 2010-08-31 18:04:00 · 4977 阅读 · 2 评论 -
MTK socket 小结 2
今天主要讲一下MTK socket 基本接口。MTK socket 主要是基于 Berkeley sockets,用起来也就大同下异。MTK socket 主要有三种模式:block(阻塞),non-block(非阻塞),Asynchronous(异步),组合方式 也只有三种 1 block ,2 non-block,3 non-block + Asynchronous。 block模式下,调用相应的函数(接受或者发送数据),如果这个函数动作没有完成(没有发送或者接受完成),那么函数就不会反回,原创 2010-09-03 01:31:00 · 5138 阅读 · 3 评论 -
MTK socket 小结 3
在 MTK socket 小结 2 说了一个socket create 函数,不知道今天能说几个,create 了一个socket,就像打开了一个文件,可以对其进行操作,当然操作前要稍微进行一些设置。 //关闭socket 与 soc_create 成对使用kal_int8 soc_close(kal_int8 s) // 绑定一个socket 到 一个指定的ip地址 和 端口。主要用于服务器短开发// 一般ip 地址全 0,端口就是想原创 2010-09-05 18:03:00 · 7358 阅读 · 2 评论 -
MTK MMI event 小结 4
这三天一直没有更新blog,打破了一天一篇的规律。周六日加了两天,再加上一天的通宵,实在有些累。不过再怎么说,感觉是给自己找借口,原来计划是不管多忙,都要更新。以后不会发生了,除非客观原因,比如没网,没电等等。 今天就饥饿着总结MMI event,今天打算说说key event。MTK 的 key envent 管理其实跟 MTK MMI event 小结 2 说的protocol event 机制也差不了多少,简单来说,就是app 通过注册某一个key 的回调函数,当这个key事件产生是,该机原创 2010-08-04 17:15:00 · 3374 阅读 · 3 评论 -
MTK MMI event 小结 2
昨天草草的写了几句,今天自己先复习了想写的东西,一看那么晚了,哎,都怪原来没有搞透,现在复习也有些地方不是很明白。如果有错误希望指正。 今天主要看分析,常用事件机制。做过MTK开发的童鞋应该知道要接受 MTK L4 层的消息,用一个注册函数 SetProtocolEventHandler,注册一个event 的 处理函数。比如短信,电话,电池电量,信号量等等都是通过 这个函数来注册消息。当L4 层,处理完封装事件后,就会把这个event 发送到MMI task 里来(消息发送可以看 MTK ta原创 2010-07-29 19:16:00 · 3884 阅读 · 3 评论 -
MTK task 小结 补充
今天忽然想到一个配置文件,跟task 有些关系,在实际过程中可能会用到。 文件是custom_config.c ,里面有些配置函数,用来配置系统信息,其中最常用的是改变MMI task stack的大小。 当集成一些库的时候,用的stack 可能比较大,这时候就需要修改task的大小,函数custom_config_task_stack_size kal_uint32 custom_config_task_stack_size(task_indx_type task_ind原创 2010-07-30 17:08:00 · 3107 阅读 · 2 评论 -
MTK 内存管理简单总结 2
在 MTK 内存管理简单总结 中,大体说了MTK的三种内存分配方式,对于第三种,也就是app buffer,是比较丰富的一种。 在 MTK 平台中也有许多具体的实现。在代码里搜索一下 kal_adm_create 就可以发现有许多地方使用了。 看一个比较典型的使用: 在文件app_mem.c里,有两个memory pool,一个是用于应用之间共享内存,另一个是用于屏幕内存。 第一种内存,主要是用于各种应用之间共享内存(以下简称ASM),这样可以节省内存,MTK实现了一种机制,可以在多个应用之间共享原创 2010-07-13 16:28:00 · 6664 阅读 · 9 评论 -
MTK 内存管理简单总结 4
MTK的ASM一套内存管理机制,也就是当共享内存不足时,可以要求后台应有释放共享内存,从而来保证应用的正常运行。 这套机制的实现在AppMemMgr.c里面,下面具体分析一下。 1 mmi_frm_appmem_prompt_to_release_mem, 当调用 applib_mem_ap_alloc 分配共享内存失败时,调用该函数,弹出“内存不足(out of memory)”提示框, 让用户选择想要停止得后台应用程序来释放内存。 mmi_frm_appmem_prompt_to_release_me原创 2010-07-16 16:35:00 · 3665 阅读 · 4 评论 -
MTK 内存管理简单总结 3
昨天说到了内存的分配。下面看一下内存释放 主要进行了3步: static void applib_mem_ap_free_int(void *mem_ptr){ /*----------------------------------------------------------------*/ /* Local Variables */ /*--------原创 2010-07-14 16:31:00 · 4438 阅读 · 4 评论 -
MTK timer 小结 2
在 MTK timer 小结 1 提到了两种timer,KAL timer 和 stack timer, 这两种timer 在平时用的比较少,在驱动开发,或者时间要求特别精确的情况下,使用 KAL timer, 一般在task要管理一组timer,用 stack timer 加上 event scheduler,后者就是今天要介绍的第三种timer。 event scheduler 处理的timer 时间精确性上来说,相对不是那么精确,对于上层app应用来说,是必不可少的。MMI 层的tim原创 2010-07-19 17:14:00 · 5670 阅读 · 7 评论 -
MTK timer 小结 1
MTK timer 有很多种,从最低层的KAL(kernel adpat layer)到MMI,都有timer的身影。 先来看一下KAL的timer KAL timer 是非常底层的timer, 它的实现是直接封装MTK的RTOS(nuleus)的timer,实现方式是由HISR,从而这种timer具有很高的优先级, 也就是说,当这个timer 超时时,就会触发一个HISR(高级中断 High Level ISR (Interrupt Service Routine)),这个中断会回原创 2010-07-18 16:50:00 · 7634 阅读 · 6 评论 -
MTK 内存管理简单总结 5
在 MTK 内存管理简单总结 4 提到,当内存不足时,可以调用 mmi_frm_appmem_prompt_to_release_mem 来显示后台应用, 让用户去选择关闭后台应用释放内存,下面看一下具体流程 当选者某一后台应用,选择stop 按键时,会触发 mmi_frm_appmem_prompt_screen_stop_highlighted 函数 (触发过程跟MTK的UI事件机制想关,以后分析)。 mmi_frm_appmem_prompt_screen_stop_highlightedsta原创 2010-07-17 17:01:00 · 2744 阅读 · 0 评论 -
MTK timer 小结 3
在 MTK timer 小结 2 说道最常用的MMI timer 实现机制的初始化过程。今天继续忘下说,下面要说的是创建一个timer。MMI 层,启动一个timer,最终都会调用到 L4StartTimer 这个函数。具体来分析一下这个函数 // 参数 nTimerId 是要自己定义一个timer id,在 timerEvents.h 里的 MMI_TIMER_IDS 定义,用来区分timer// TimerExpiry 超时的回调函数// funcArg 回调函数回传的参数// nTim原创 2010-07-20 18:07:00 · 5090 阅读 · 4 评论 -
MTK timer 小结 4
昨天说到回调函数 L4CallBackTimer。 static void L4CallBackTimer(void *p){ // 在evshed_set_event 第三个参数中传得 timer noder // 这里转换这个指针 mmi_frm_timer_type *pTimer = (mmi_frm_timer_type *)p; // 得到timer id U32 nTimerId = pTimer->timer_info & (~N原创 2010-07-21 17:06:00 · 3466 阅读 · 11 评论 -
MTK task 小结 1
MTK 的 基本执行单元是task, 从操作系统的角度来理解,task 有些像线程而不是进程,进程之间的地址空间是相互隔离的,说白点就是进程之间的全局变量是不相互干扰的, 而线程之间则是用同一个地址空间,MTK 的task 之间的地址空间也是共同的,也就是在MTK 编程里,定义了一个全局变量,那么在任何一个task里面都能引用, (这里举个例子,在实际编程过程中最好不要用全局变量,实在没有办法避开,那么全局变量也要分模块化,进行封装, 扯远了)。 所以说,MTK 的tas原创 2010-07-22 18:36:00 · 4047 阅读 · 9 评论 -
MTK task 小结 2
虽然MTK手机,是feature phone(功能机),不像symbian 6 那样可以同时运行多个应用。但是MTK还是 有许多task组成。平时MTK的后台播放MP3就是一由一个task 完成的。具体以后分析。现在来看看MTK 最主要的task,MMI task,MTK 的应用程序都是在该task里面运行,它有一整套开发MTK 应用的framework。 先来看创建MMI task的函数 kal_bool mmi_create(comptask_handler_struct *原创 2010-07-24 17:28:00 · 7297 阅读 · 7 评论 -
MTK task 小结 3
在 MTK task 小结 2 中 大概描述了下 MMI task 的工作方式:从外部队列获取消息放入内部消息队列,内部消息队列根据消息类型注册的回调函数,进行调用(event 机制,这个又是MMI framework的主要部分之一)。 在MTK上,用户(开发人员)可以根据需要,创建task。 创建一个task 分为 4 步: 1 增加一个task index 到 custom_task_indx_type 2 增加一个mod index 到 custom_module_t原创 2010-07-25 17:20:00 · 4456 阅读 · 3 评论 -
MTK task 小结 4
在 MTK task 小结 3 中写到创建一个MTK task,没有写完,今天把剩下的写完。下面需要介绍 创建task 信息的函数。 kal_bool task_test_create(comptask_handler_struct **handle){ static const comptask_handler_struct task_test_handler_info = { task_test_main, /* task entry function *原创 2010-07-26 16:38:00 · 4700 阅读 · 14 评论 -
MTK task 小结 5
今天继续昨天的,说一下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 接下来是发送 M原创 2010-07-28 02:25:00 · 6013 阅读 · 1 评论 -
MTK MMI event 小结 1
在MTK MMI 里面有各种event,最常见的跟交互相关的 按键 event,触摸屏 event。跟各种具体事件比如电话event,短信event,电量event,信号量event,timer event等等。 MTK 都有相应的处理方式,跟交互相关的 按键(KeyBrd.c)和触摸屏(TouchScreen.c) 各有一套自己的机子,timer event 已经在 MTK timer 小结 3 介绍过,还有一套机制就是处理各种其他事件,它主要分为普通事件和interrupt event,i原创 2010-07-28 17:49:00 · 2913 阅读 · 2 评论 -
MTK socket 小结 5
很久没有跟新了,自己的承诺都没有兑现,对不起各位关注支持我的,更对不起自己。对于有些问题,没有回答的话,麻烦你再提一下,我找不清楚哪些回答了,sorry。 上次说到Demo的socket 链接,先看HTTP请求。 当然要理解这个,得知道一个HTTP请求是什么样子的和HTTP协议的交互过程。要详细了解 可以看 RFC 标准文档。简单来说,HTTP 协议是请求应答模式,客户端发一个请求,服务器短发一个答复。客户端说:要xxx网页,服务器就把xxx网页返回给你。交互就需要一个规范,这个就是请求和原创 2010-11-01 17:37:00 · 4235 阅读 · 0 评论