MTK-调试TRACE小结

合集下载

MTK task 简单总结(速成版)..

MTK task 简单总结(速成版)..

MTK task 小结1MTK 的基本执行单元是task,从操作系统的角度来理解,task 有些像线程而不是进程,进程之间的地址空间是相互隔离的,说白点就是进程之间的全局变量是不相互干扰的。

而线程之间则是用同一个地址空间,MTK的task之间的地址空间也是共同的,也就是说在MTK 编程里,定义了一个全局变量,那么在任何一个task里面都能引用,(这里只是举个例子,在实际编程过程中最好不要用全局变量,实在没有办法避开,那么全局变量也要分模块化,进行封装)。

所以说,MTK 的task 更像线程,MTK 用的是实时操作系统nucleus,是非抢占式操作系统,也就是当高优先级的task 在运行时,低优先级的task是得不到运行时间的,除非等高优先级的task 因为种种原因挂起。

MTK 还有一个跟task 想关的概念叫module,它跟task 之间的关系是:一个task 可以对应多个module。

task 主要表示是一个执行单元,module 主要是用于传递消息,在MTK 中,消息传递是module 为单位src_mod – > des_mod,而不是以task为单位。

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 **handle){/*----------------------------------------------------------------*//* Local Variables *//*----------------------------------------------------------------*/static comptask_handler_struct mmi_handler_info ={MMI_task, /* task entry function */MMI_Init, /* task initialization function */NULL,NULL, /* task reset handler */NULL, /* task termination handler */};/*----------------------------------------------------------------*//* Code Body *//*----------------------------------------------------------------*/*handle = &mmi_handler_info;return KAL_TRUE;}这个函数的结构,是MTK 创建task的基本结构,系统初始化时,会调用该函数。

MTKtrace信息说明

MTKtrace信息说明

MTK trace工具使用补充说明本文档主要介绍如果查看trace信息,以帮助在手机上的调试,trace_demo文件夹中的例子代码可以参照。

(下面截图不清楚的话请见附件的图片。

依次是图1,图2,图3)一、平台自己打印的一些信息:1.1、当前编译该mrp文件的SDK版本号该trace信息显示的是当前编译该mrp文件的SDK版本号。

1.2、内存消耗:该trace信息显示的是当前的内存消耗量,由于加载图片或申请内存的时间不同,内存消耗量也是实时变化的,trace信息显示的是当前的内存消耗量,该信息可以查看应用是否有内存泄露等问题。

例子代码中刚进入是没有加载图片的,再选择开始后,加载图片并且显示图片,所以这两个时候的内存消耗是不同的。

1、下图是没有加载图片时候的内存消耗:2、下图是加载图片后的内存消耗:Trace信息说明:VM_LOG:mem top =325232,left =426288,never use =411800(单位是B)mem top是栈顶内存的峰值,left 是当前剩下的内存,never use是还未使用的内存。

这里mem top并不是该游戏消耗的内存峰值,它只是手机栈顶的峰值,所以当前游戏消耗的内存峰值是手机内存减去never use,就是游戏在当前的内存峰值。

简单描述如下:游戏消耗内存峰值= 手机内存—never use;Left表示当前剩余内存,它包括游戏中自己释放的内存和never use。

1.3其他打印消息其他打印消息包括手机IMEI号、IMSI号等其他一些信息。

二、自己调试时候打印信息该类信息能帮助我们在手机上调试应用,并能尽快定位问题。

例子代码中有这类信息,就是用mrc_printf();打印出来的信息,例如在trace_KeyEvent函数中,我打印了mrc_printf("g_main_menu_focus = %d", g_main_menu_focus);在你按键响应后就能打印出g_main_menu_focus的确定值。

MTK平台开发总结(全)

MTK平台开发总结(全)

MTK平台开发总结(全)声明:前阶段进行了近两个月的MTK平台上层开发,由于缺乏技术支持,对于整个平台的认识都是通过简略的文档和浅薄的经验摸索出来的。

其间整理了一些文档。

由于联发科提供的PDF全部是英文,有些名词难以翻译准确,只能凭单方理解和嵌入式开发的词汇习惯进行意译,还请谅解。

系列文章均出自原创,肤浅可笑之处,望海涵。

(一)窗体的重画通过观察可以发现,每个窗体模板都调用这样一个函数:dm_redraw_category_scree n()。

这个函数便是显示窗体的函数。

它内部的实现是这样的:获得该窗体所包含的组件及它们的属性,再根据组件的类型和属性,调用不同的接口,逐一绘制各组件。

详细流程如下图所示:由上面的流程可见,无论是窗体所包含的组件,还是组件的属性,都是根据模板ID获取的。

那么现在摆在面前的有两个问题:一、模板ID是如何传递到这个函数中的;二、模板ID和窗体组件、组件的属性,是如何关联到一起的。

我们逐一解决这两个问题。

一、模板ID是如何传递到这个函数中的模板ID,是Sho wCateg ory..Screen()过程中,所显示的界面的编号,千万不要与EntryNe wScree n(scrID,…) 函数中传入的窗口ID相混淆。

它们以―MMI_‖为前缀,被定义在枚举型结构MMI_CATEGORY_ID_L IST中,又通过结构体d m_data_struct和它的全局结构体变量g_dm_data,在应用程序中被广泛使用。

先看看结构体dm_data_struct的定义:typedef struct{S32 s32ScrId;S32 s32Cat Id;S32 s32fl ags;}其中,s32ScrId是当前窗口ID,也就是我们使用EntryNe wScree n()时传入的那个参数;而s32Cat Id才是模板ID;最后的flag,是模板需要显示软键盘、清屏等动作时,所置的标志变量,它在上面提到的那个dm_redraw_category_scree n()函数中被判断。

MTK个人笔记

MTK个人笔记
5、MTK工程里面的语言种类,其宏控制和字串ID可以在Res_SSC.c里面的PopulateSSCRes()里面查看。
6、查看进入MTK手机工程模式的指令可在CustResDef.h里,对应值为:SSC_ENGINEERING_MODE。
7、打包命令:armar -r *.a(或者*.lib) *.obj,解包命令:armar -x *.a,执行时都要先运行到obj或者库文件目录下。
22、Idle界面里面的触摸屏函数实现,是通过屏幕模板ShowCategory33Screen实现的,在wgui_categories_idlescreen.c里函数ShowCategory33Screen_ext里有注册,如:
wgui_register_category_screen_control_area_pen_handlers(wgui_cat033_pen_down_handler, MMI_PEN_EVENT_DOWN);注册点下触摸时的响应函数,然后我们可以在此响应函数里设置我们需要的屏幕位置的响应函数。
20、函数TurnOnBacklight(GPIO_BACKLIGHT_SHORT_TIME);用于把手机从背光中开启出来高亮屏幕一小段时间,参数也可换成GPIO_BACKLIGHT_PERMANENT(长久。
21、函数ForceSubLCDScreen(mmi_msg_start_msg_sub_anm)用于强制开启小屏幕提醒界面的,里面的参数只是举例,是提示有新短信收到的,在该函数里还需要调用屏幕模板来实现小窗口,这里用的是ShowCategory304Screen,然后会设置SetSubLCDExitHandler(mmi_msg_callback_msg_sub_anm);停止小窗口。

MTK平台个人笔记精髓

MTK平台个人笔记精髓

MTK平台个人笔记精髓关于MTK Simulator1.MTK simulator的工程文件是 PixtelMMI.dsw。

2.打开PixtelMMI.dsw,检查文件default_Fmrdo.c、default_mmi_pro、default_mmi_settings.c、default_version.c文件是否存在工程文件中,上述文件存放目录:项目所在目录\custom\app\MILAN_BB。

3.在调试运行过程中会提示某些DLL文件无法连接,这是VC没有安装。

DLL文件所在目录:VC安装盘\VC98\DEBUG。

把缺失的文件复制到window安装目录下的System32目录里。

4.运行MTK Simulator,选取Simulator,会运行MMINWSimulator;在MMINWSimulator菜单中,选取Menu Messages,会弹出一个Send Event窗口,窗口里有一个Events列表,列表里有不同用途种类的Events;如果需要启动手机,选取BootUp Events,点击OK按钮,MTK Simulator模拟开机过程。

关于调试语句的说明kal_print语句:该语句只能打印字符串信息。

Trace_out语句:该语句可以输出格式化字符串。

ASSERT语句:断言语句。

Trace语句:可以输出格式化字符串。

关于MTK Target的编译连接批处理命令: Milan.bat 。

●概述在windows下,打开dos编辑窗口(开始->运行->cmd),找到工程代码所在根目录,如:E:\MTK6217 输入编译批处理命令:格式:make[custom="projectName"]"project" "action"["modules"]Example: make custom=mtk6217 gprs newModules:用于对单个模块进行编译的选项。

MTK驱动调试相关总结

MTK驱动调试相关总结

MTK驱动调试相关总结 2010-12-14 Ver:1.11 SIM卡2 T卡3 FLASH4 按键KEY5 IO配置6 ADC配置7 EINT配置8 FM驱动9 BT驱动10 TOUCHSCEEN驱动11 LCM驱动12 Sensor驱动13 背光灯、按键灯、振动器、PWM14 跑马灯15 移动传感器、四方传感器16 MP4、3GP播放17 音量参数、EQ参数、音频功放开关18 SMS、电话本等容量设置19 耳机插入、拔出检查、耳机按键处理20 充电器或USB插入、拔出检查、识别21 RF 配置22参考文档附录默认系统平台为MT6253,code版本:09B.W10.12.MP。

版本变更记录:Andy 2010.12.10 Ver:1.0Andy 2010-12-14 Ver:1.11 SIM卡F910(MT6253)SIM卡插槽与系统SIM卡号映射关系drv\src\switchControl_al.c// andy 2010.05.31 SIM卡插槽映射 __DRV_DUAL_SIM_INVERSE__//kal_bool sim_physicalSlotChanged;#ifdef __DRV_DUAL_SIM_INVERSE__kal_bool sim_physicalSlotChanged = KAL_TRUE ;#elsekal_bool sim_physicalSlotChanged = KAL_FALSE;#endif定制支持的SIM电压:Customer_sim_voltage_support.c/* For customer define ME support voltage of SIM *//* For 1.8V Tech. ME use ME_18V_30V *//* For 3.0V ONLY ME use ME_30V_ONLY *//* For 1.8V ONLY ME use ME_18V_ONLY */#define SIM_VOLTAGE_SUPPORT ME_18V_30Vsim_env SIM_GetCurrentEnv(void){(SIM_VOLTAGE_SUPPORT);return}MT6253的“4.3 SIM Interface”,介绍了SIM卡接口的情况。

详细分析MTK校准调试原理及方法

详细分析MTK校准调试原理及方法


• •
GSM900_MAX_RX_LOSS = 5.000,5.000,5.000,5.000,5.000,5.000,5.000,5.000,5.000,5.000,5.000,5.0000, GSM900_MIN_RX_LOSS = -1.000,-1.000,-1.000,-1.000,-1.000,-1.000,-1.000,-1.000,-1.000,1.000,-1.000,-1.0000,
MTK-atedemo工具的基本使用
• 校准初始化文件(*.ini): 在校准的时候,需要有个初始值,然后对 此初始值进行校准,校准到需要的值上去。 此初始化文件就是在校准的时候把此文件 的内容写入到手机中去。 如果把此文件正确的写入到手机相应的内 存中去,就需要Database
MTK-atedemo工具的基本使用
MTK-atedemo工具的基本使用
• 校准设置文件以及校准check限制条件 (*.CFG文件): 主要是对手机校准的时候起作用,使得校 准按照此文件内的内容去执行,比如在哪 个信道、哪个功k,如果一 旦超出check限制条件就算此校准Fail。
校准原理
• 对应的具体原理图:
校准原理
• RX校准:包括两部分:RX Gain和信道补 偿 • 信道补偿主要是因为在高、中、低信道的 时候RX Gain会有一定的差异,因此需要一 定的补偿来弥补这种差异,免得在高、低 信号的值接近甚至超出规范的范围。 • 但是在产线具体生产的时候由于RX校准的 信道补偿计算量比较大,比较耗时,一般 不做这项校准。
基本问题分析
基本问题分析
基本问题分析
• TX问题: 此问题在校准的时候主要表现为功率校准 不到所需要的范围内,在*.CFG文件中有如 下限制:

MTK开发心得完整版

MTK开发心得完整版

一、开发环境设立以下表述中提到的相关压缩包或安装文件到华禹ftp服务器下载,部分文件要到群共享里面下,那里是最新的。

华禹ftp服务器:IP:220.113.15.15,帐号为,密码为study-bbs0304P1300的QQ群号:15762255P1300_Build_Guide.rar-------------------------来自ftp服务器,“华禹\MTK相关部分”目录下手机开发板C语言开发视频.rar--------------来自ftp服务器,“华禹\MTK相关部分”目录下huayu109_ads1.2.rar------------来自ftp服务器,“华禹\旋风001手机模块\1.工具类”目录下huayu102_ADS12_Patch_Windows.rar-----------------------------------------------------------同上huayu106_perlzip.rar---------------------------------------------------------------------------------同上huayu108_Source Insight3.5.rar--------------------------------------------------------------------同上huayu101_p1300软件使用工具及开发指南.rar------------------------------------------------同上huayu201_P1300_V1.7_Release.rar------------------------------------------------文件来自群共享huayu203_P1300_V1.7_Release_patch.rar----------------------------------------文件来自群共享FlashTool_v3.0844.00.rar------------------------------------------------------------文件来自群共享huayu501_MTK界面开发说明.rar-------------------------------------------------文件来自群共享1、开发主机要求及所需工具:操作系统:Windows 2000, WinXP. 推荐Windows 2000 with SP2 or later.编译器:ADS (Arm Developer Suite) v1.2 [Build 842]Perl解析:ActivePerl, 推荐使用ActivePerl 5.6.1版本仿真工具:MTK PC Simulator跟踪工具:Catcher_L1 v3.10.01,从串口输出调试信息,只做普通UI应用的话,大致不会用到,用PC仿真工具就好了烧录工具:FlashTool_UI v3.1.05 或FlashTool_v3.0844.00其他:PL2303_Driver_XP2K v204102,这是下载线用到的USB串口驱动,以前机器上装过PL2303驱动的,建议改用这个,否则可能会有蓝屏的问题。

MTK学习笔记总结

MTK学习笔记总结

可以通过 tools\chk_env 查看是否搭建成功。
make custom=** make custom=** make custom=** make custom=**
gprs new gprs remake %1 gprs update %1 gprs new_modis
全部重新编译 编译修改部分 更新资源 new 后生成 modis 工程
MSYS
1.0.10
MSYS 工具是 Minimal GNU(POSIX)system on Windows 的简称,是一个小型的 GNU 环境,包括基本的 bash,make 工具等等,是 Windows 下最优秀的 GNU 环境。
7zip
3.13 7zip 压缩工具(7za.exe),在编译过程中,程序会调用它解压缩图片资源。
// 正常模式开机
mmi_bootup_entry_animation()
// 开机动画
mmi_pwron_entry_animation_screen()
// 开机动画界面
gui_start_timer(force_stop_time, mmi_pwron_force_terminate_display) // 设置强制关闭动画计
口中就可以了解到是否打了 SP6 补丁了。
Source Insight
因为 MTK 源文件代码量相当的惊人,用其他的编译器来查看代码修改代码会相当 3.5
的不方便,这里强烈推荐该软件,必定会让你的开发事半功倍。
Xoreax IncrediBuild
3.30b
可以在 CMD 和 VC6 下面让读者搭建自己的分布式编译系统,让编译变的更快捷, 必须再 Microsoft Visual C++安装后再安装。

MTK平台驱动调试笔记

MTK平台驱动调试笔记

分类:LINUX一、【一】调试串口的设置驱动的调式过程经常需要通过trace工具看log的,trace前需要修改手机串口,有以下三种方法设置串口1 通过手机进入工程模式设置2 修改代码,修改Nvram_user_config.c中的NVRAM_EF_PORT_SETTING_DEFAULT[]3.通过META工具修改在连上meta:左上角选中NVRAM Editor,在跳出的对话框里选择other LID,再选择NVRAM_EF_PORT_SETTING_LID,接下来read from nvram,对话框右边就会出现串口的设置情况,对调tst_port_ps(输入0)和ps_port(输入99)的值,二【【二】关于gpio口Gpio的初始化在文件gpio_drv.c里,可以用MTK提供的工具配置也可以用代码在程序里直接操作,二者的选择要看有没有定义宏__CUST_NEW__工具初始化时要注意配置codegen.dws,该文件里配置的只是对gpio口的初始化,并不是所有的gpio口都要设置成工作时的模式,尤其是当作时钟和蓝牙部分的gpiio口,初始化时就设置成工作模式的话会造成电机电流过大的。

代码初始化时DRV_WriteReg()、DRV_Reg对gpio口寄存器操作,分别定义gpio口的模式,和方向(0:输入;1:输出),对单个gpio口操作用到以下函数(以gpio25为例):GPIO_ModeSetup(25, 0);设置GPIO25为模式0GPIO_InitIO(1,25);初始化GPIO25方向为输出GPIO_WriteIO(0, 25 );设值GPIO25输入低电平0三、【三】键盘设置1)键盘定义Keypad_def.c如果定义CUST_NEW,工具中的键盘定义对应在改文件里的KEYPAD_MAPPING(keypad_drv.h);2)硬件键盘定义与软件mmi键盘的对应nKeyPadMap[](Keybrd.c)3)工程模式键盘测试函数EntryFMKeypadTest()修改键盘测试时界面显示的键的名称1. 做好上面的第一第二两步2. FactoryModeSrc.c开始部分定义添加的键所要显示的名称,值,分别应用到keypad_layout[](确定要显示的位置),keypad_value[]3.在EntryFMKeypadTest()函数中的数组IdleScreenDigits[]里添加要显示的键4)如果要设置一个键不管在什么界面下都起作用的话(如手电筒开关或则其他需求)就需要在键盘的事件响应函数static voidKeyEventHandler(KEYBRD_MESSAGE *eventKey)里设置,根据键值条用相应的响应函数,不过该函数及时在锁屏状态下也会执行的,需要根据需要添加条件语句四、关于LCDlcm背光驱动分为两种控制方式:1. pwm这个是通过调占空比来调节亮度的持续信号;2. PFM这个是通过脉冲的个数来控制LCM背光亮度。

MTK平台驱动调试介绍

MTK平台驱动调试介绍

驱动调试的基本流程
代码审查
对驱动代码进行审查,确保其正确性和可维 护性。
集成测试
将驱动程序与其他系统组件集成,进行系统 级测试。
单元测试
对驱动模块进行单元测试,确保其功能正常。
性能优化
根据测试结果,对驱动程序进行性能优化和 调整。
03
MTK平台驱动调试技术
调试工具与环境配置
调试工具
使用常见的调试工具,如GDB、LLDB等,进行驱动代码的调 试。
MTK平台的发展历程
1 2 3
起始阶段
MTK平台最初是为了满足手机市场的需求而开发, 随着智能手机的兴起,MTK平台逐渐成为主流处 理器之一。
高速发展阶段
随着移动互联网的普及,MTK平台不断推出高性 能、低功耗的处理器,逐渐占据了中低端智能手 机市场。
创新阶段
近年来,MTK平台在人工智能、物联网等领域不 断创新,推出了多款具有特色的处理器,进一步 扩大了应用领域。
THANKS
感谢观看
MTK平台的应用领域
智能手机
平板电脑
MTK平台是智能手机领域的主流处理器之 一,广泛应用于中低端手机市场。
基于MTK平台的平板电脑具有高性能、低 功耗的特点,满足了用户对于娱乐、办公 等方面的需求。
智能电视
IoT设备
MTK平台的智能电视解决方案为用户提供 了丰富的视听体验,成为智能电视市场的 主流选择之一。
MTK平台驱动调试 介绍
目录
• MTK平台简介 • MTK平台驱动调试概述 • MTK平台驱动调试技术 • MTK平台驱动调试案例 • 总结与展望
01
MTK平台简介
MTK平台的定义与特点
定义
MTK平台是一种基于ARM架构的嵌 入式处理器平台,由MediaTek公司 开发。

MTK_sensor驱动与调试小结

MTK_sensor驱动与调试小结

dataTemp = IIC_Read16bit(0xC8); WaitTime_ms(1); i++;
if(i>waittime) { AMOIT(" the sensor change mega mode fail!-----\n"); break; } } AMOIT1("------i=%d-----\n",i);
6、
Micron sensor mtd9111 系列的带 ISP 的 2M sensor 在 ISP 中默认了一 组寄存器, 能够在 reset 后不用 IIC 写任何寄存器就能输出图象, 这个 时候 sensor 的 input clock 是 output clock 的两倍,前期可以用这个方 法来验证硬件和软件供电, 复位等是否正确, 当后端接受的图象 engine 只能用 mclk 来同步工作时候,必须要正确配置接收的采样频率,否
lower power 模式下的输出
full power 模式下的输出 证明 corelogic 不能接受 lower power mode 的 sensor 输出。
由于输出的时钟频率 preview 与 capture 固定,CMOS sensor 暴光原理是 行暴光,暴光时间等于行暴光时间,line time=hsync time +hblank time。130 万象素的的 sensor 为例,preview 的时候输出 VGA,hsync time=640*k, K 为 shutter width(快门时间)。 而 capture 的时候 hsync time=1280*k, 在 k 不变的情 况下,hsync time 发生了巨大的变化,这样暴光时间也发生了巨大的变化, 现象是拍照的时候的图片明显过曝。 不过 micron 给出了一个可以改变 shutter width 的寄存器,通过改变这个寄存器能够调整综合暴光时间,这样就能解 决这个问题,在老化测试的时候经常出现暴光不对,就是因为这个寄存器没 写入或写入后 sensor 没有反映造成的,由于 preview->capture->preview 中间 的转化值都是用软件来实时计算出来的,所以无论是 iic 读或者写,还是环 境亮度引起 sensor 亮度计算错误,都会影响到暴光,维护这段代码的时候要 特别小心。如果遇到拍照的时候与 preview 的图像质量差别很大,请从这段 代码开始查。

MTK-校准常见问题说明

MTK-校准常见问题说明

WCDMA常见校准错误代码及解决措施
WCDMA FAIL 错误代码
WCDMA_FHC_AGC_CHECK_FAILED = 325,326,327,328 可能原因:WCDMA AGC异常 1. CFG中WCDMA的Path loss范围较窄 2. 接收通路异常 解决措施: 1. CFG中WCDMA的Path loss范围较窄,与研发确认调整范围 BAND1_MAX_RX_LOSS = 7.000,7.000,7.000,7.000,7.000,7.000,7.000,7.000,7.000,7.000,7.000,7.000,7.000,7.000,7.000
GSM常见校准错误代码及解决措施
GMS FAIL 错误代码
GSM_NSFT_TX_MEASURE_FAILED = 1731 GSM_EDGE_NSFT_TX_MEASURE_FAILED = 1746 可能原因: 1. GSM/EDGE TX 指标异常 GSM:Burst Match, Avg Ferr, Max Peak Perr,Switching Spectrum, Modulation Spectrum EDGE:EDGE 95P EVM,EDGE EVM PK,EDGE MAGERR PK,EDGE MAGERR RMS ,EDGE PhaseErr PK ,EDGE PhaseErr RMSPerr,Switching Spectrum, Modulation Spectrum ) 1. CFG中GSM/EDGE的指标范围较窄 解决措施: 1. 主板GSM TX 通路异常,需要维修 2. CFG中GSM/EDGE的TX指标范围较窄,与研发确认调整范围
WCDMA常见校准错误代码及解决措施
WCDMA FAIL 错误代码

MTKtask简单总结(速成版)..

MTKtask简单总结(速成版)..

MTK task 小结1MTK的基本执行单元是task,从操作系统的角度来理解,task有些像线程而不是进程,进程之间的地址空间是相互隔离的,说白点就是进程之间的全局变量是不相互干扰的。

而线程之间则是用同一个地址空间,MTK的task之间的地址空间也是共同的,也就是说在MTK编程里,定义了一个全局变量,那么在任何一个task里面都能引用,(这里只是举个例子,在实际编程过程中最好不要用全局变量,实在没有办法避开,那么全局变量也要分模块化,进行封装)。

所以说,MTK的task更像线程,MTK用的是实时操作系统nucleus,是非抢占式操作系统,也就是当高优先级的task在运行时,低优先级的task是得不到运行时间的,除非等高优先级的task因为种种原因挂起。

MTK还有一个跟task想关的概念叫module,它跟task之间的关系是:一个task可以对应多个module。

task主要表示是一个执行单元,module主要是用于传递消息,在MTK中,消息传递是module为单位src_mod -> des_mod,而不是以task为单位。

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_ha ndler_struct **ha ndle){/* *//* Local Variables */static comptask_ha ndler_struct mmi_ha ndler_i nfo ={MMI_task, /* task en try fun ctio n */MMI_I nit, /* task ini tialization fun ctio n */NULL,NULL, /* task reset han dler */NULL, /* task term in ation han dler */};/* *//* Code Body *//* */*ha ndle = &m mi_ha ndler_i nfo;return KAL_TRUE;}这个函数的结构,是的结构体MTK创建task的基本结构,系统初始化时,会调用该函数。

trace调试技巧

trace调试技巧

trace调试技巧在软件开发过程中,使用trace调试是非常常见的。

trace调试是一种通过在代码中插入跟踪信息来诊断程序运行过程中的问题的方法。

下面我会从多个角度来介绍一些trace调试的技巧。

首先,要正确使用trace调试,我们需要在代码中插入足够的跟踪信息。

这些信息可以是变量的值、函数的执行顺序、条件语句的判断结果等。

通过在关键位置插入trace语句,我们可以更清晰地了解程序的运行情况。

其次,要注意trace信息的输出方式。

在调试过程中,我们可以选择将trace信息输出到控制台、日志文件或者特定的调试工具中。

选择合适的输出方式可以帮助我们更方便地查看和分析trace 信息。

另外,要善于利用条件trace。

有时候我们并不需要在每次程序运行时都输出trace信息,这时可以通过条件语句来控制trace 信息的输出,比如只在特定条件下输出trace信息,这样可以减少不必要的输出,同时也更方便地定位问题。

此外,要注意trace信息的格式化。

为了方便阅读和分析,我们可以对trace信息进行适当的格式化,比如添加时间戳、调用栈信息等,这样可以更清晰地了解程序的执行流程。

最后,要善于利用调试工具。

现在有很多强大的调试工具可以帮助我们进行trace调试,比如Visual Studio的调试器、GDB、Xcode等。

这些工具提供了丰富的功能,比如设置断点、单步执行、查看变量值等,能够极大地提高我们的调试效率。

总的来说,trace调试是一种非常有效的调试方法,通过合理地插入trace信息、选择合适的输出方式、使用条件trace、格式化trace信息和善于利用调试工具,我们可以更快速、更准确地定位和解决程序中的问题。

希望以上介绍的技巧能够对你有所帮助。

MTK入门相关知识总结

MTK入门相关知识总结

MTK编译过程1.1. 编写目的本文编写的目的主要是为了从整体上理解MTK的编译过程,以便能够较快的处理编译中遇到的问题,同时为以后可能的优化编译过程提供参考。

1.2. 简介MTK的编译过程主要是在windows命令行下通过MakeFile文件来执行相应的perl脚本或c程序,将资源包生成c源程序,并与相应模块的c程序生成.o,.lib或.obj的中间代码,最终生成在手机上使用的.bin 文件和在模拟器上使用的mmiresource.dll资源文件。

1.3. 编译命令1.4. 编译相关的文件编译用到的文件主要放在make文件夹中。

各个文件的简要说明如下:1.5. 编译指令1、new功能:全新开始构建整个工程的ARM版,包括图片、声音、字符串等资源都要重做。

在构建工程过程中,清除所有的目标文件,库文件,日志文件等。

New指令还会自动创建必要的目录、移除临时文件和中间脚本、更新日志文件。

过程简要说明:new->cleanall->sysgen->ckscatter->mmi_feature_check->asngen->codegen->asnregen->operator_check_lit->$(B TLD_BIN_FILE)->update。

依赖指令:new依赖的其他指令最多,其中包括cleanall,sysgen,ckscatter,mmi_feature_check,asngen,codegen,asnregen,operator_check_lite,update.用途:new指令是最彻底也是耗时最长的一个动作,一般得到一个新的MTK发布版本后由项目负责人要做一次。

使用示例:C: BIRD25_GEMINI_07BRelease>make BIRD25_GEMINI_07B gprs new。

2、update功能:update是重新更新整个工程的ARM版,该动作会扫描工程中文件和库的依赖关系,若依赖关系有变化会建立新的依赖关系,随后根据新的依赖关系重新编译链接有改动的部分。

MTK驱动调试经验

MTK驱动调试经验

MTK6735M项目F100驱动调试报告一配置EMMC按照硬件的选择配置新的flash,因为第一版都是按照MTK认证列表使用,所有一般如果不行有两个可能:1配置不正确,需要确定alps\bootable\bootloader\preloader\tools\emigen\MT6735下的flash 配置文件的时序是否正确,修改配置文件alps\bootable\bootloader\preloader\custom\f100\inc的文件custom_MemoryDevice.h2需要硬件配合查看是否EMMC元器件未能贴好,造成不能烧录二调试LCD调试步骤:1确定LCD的连接方式;1确定dws配置正确;2确定电源是否正确;3确定配置参数的读写方式类型,包括:LCM_setting_table模式读写:struct LCM_setting_table{unsigned cmd;unsigned char count;unsigned char para_list[64];};LCM_setting_table_V3模式读写:typedef struct{unsigned char id;unsigned char cmd;unsigned char count;unsigned char para_list[128];}LCM_setting_table_V3;4确定开关机的时序和读取初始化参数的方法;5确定DSI的配置是否正确,此配置函数为static void lcm_get_params(LCM_PARAMS*params)6如果做屏兼容,需要配置.compare_id=lcm_compare_id,此项为读取LCD ID进行判断;调试碰到问题:1参数的读写方式不正确,造成屏花屏,换一种读写方式正确;2suspend时未能写正确,在待机时出现kernel crash,需要特别注意;3未能配置lcm_compare_id,造成做屏兼容时未能自动识别;4TE的配置需要特别注意,此引脚MTK的补丁默认TE中断不开;三调试TPTP连接的接口为I2C模式调试步骤:1确定dws配置正确;2确定中断,电源正确;3确定I2C读写正确;4确定报点没有断点,TP没有坏点;5配置虚拟按键时注意键值范围;调试碰到问题:调试的TP为GT9157,出现很奇怪的问题,就是I2C的初始化读写没有报错,但是读写数据就是不成功,最后查找到问题为:I2C加了下拉的防静电电阻,造成实际上的下拉,但是根据规格书配置要求,必须要做上拉处理,否则容易出现读写不正常,所有此处造成I2C没有正常工作;三调试sensor system调试步骤:一accelerometer1确定dws配置正确;2确定中断,电源正确;3确定I2C读写正确;4确定好旋转的方向;调试碰到的问题:调试accelerometer出现没有报点,然后换了驱动就可以了,判断为原驱动内的读取x.y.z的方式不对;二alsps1确定dws配置正确;2确定中断,电源正确;3确定I2C读写正确;4确定好旋转的方向;调试碰到的问题:调试光感出现距离不对的问题,调试距离判断参数,成功;四调试camera调试步骤:1确定主副摄像头的型号,在配置文件配置好,添加好驱动代码;(注意:需要配置alps\device\huaying\f100里的ProjectConfig.mk,此文件为主要配置文件,配置alps\kernel-3.10\arch\arm64\configs里的f100_debug_defconfig)2确定dws配置正确;3确定摄像头的开关机的时序,按照摄像头的规格书来配置;4根据硬件配置好MCLK;5确定好是否支持AF,闪光灯功能;五调试Audio调试步骤:1按照驱动开发资料进行驱动配置,确定好是内置功放还是外置功放;2配置好音频功放的输入时序,按照喇叭的功率进行配置,外置功放配置路径为alps\kernel-3.10\sound\soc\mediatek\mt_soc_audio_v3\mt_soc_codec_63xx.c3按照硬件配置mic为单/双;六调试HEADSET调试步骤:按照驱动开发资料配置即可。

MTK编程小结

MTK编程小结

MTK编程小结:域名解析域名解析对于网络编程而言,硬编码IP到客户端,定是下下策,为此,我们需要域名解析功能。

MTK对此有类似的解决之道,即soc_gethostbyname,下面将它的用法简单叙述如下soc_gethostbyname( kal_bool is_blocking,//是否为阻塞式调用,手机平台一般不会支持阻塞式调用的???? module_type mod_id,??//调用该函数的模块id,也即将来接收消息的模块???? kal_int32 request_id,//用于区分是那个请求之用,我们自定义的id值,标示不同的应用???? const kal_char *domain_name,//域名???? kal_uint8 *addr,//ipv4的ip地址,将来也许会有ipv6的???? kal_uint8 *addr_len,//数据长度???? kal_uint8 access_id,//这个访问控制id,我没有使用给它赋值为0好了???? kal_uint32 nwk_account_id //手机gprs帐户id,做过手机的人自然会明白???? )//补充,调用这个函数不需要建立socket,而且是我们建立tcp/ip连接之前,必须完成一个必备步骤实例代码如下:typedef void (* mf_funcOnGetHostByName)(mf_u32 hAddr,mf_u32 nAddr);static mf_funcOnGetHostByName mf_dnsFunc = NULL;#define MF_DNS_APPID 1static void MF_dns_event(void * inMsg){app_soc_get_host_by_name_ind_struct *dns_ind;if( inMsg ){??dns_ind = (app_soc_get_host_by_name_ind_struct*) inMsg;??if (dns_ind->result == KAL_TRUE)??{?? mf_u32 ipAddr = 0;?? switch (dns_ind->request_id)?? {????case MF_DNS_APPID:???? ClearProtocolEventHandler(MSG_ID_APP_SOC_GET_HOST_BY_NAME_IND);???? kal_prompt_trace(MOD_ENG,"MF_getHostByName??ip: %d, %d, %d, %d", dns_ind->addr[0], dns_ind->addr[1], dns_ind->addr[2], dns_ind->addr[3]);???? MF_memcpy(&ipAddr, dns_ind->addr,dns_ind->addr_len);???? if( mf_dnsFunc )??????mf_dnsFunc(MF_ntohl((mf_u32)ipAddr),ipAddr);???? mf_dnsFunc = NULL;???? break;?? }else if( mf_dnsFunc ){??mf_dnsFunc(0,0);}}mf_bool MF_getHostByName(mf_s8 * server_domain,mf_u32 * hAddr,mf_u32 * nAddr, mf_funcOnGetHostByName func){kal_int8 ret = MF_FALSE;static kal_uint8 addr_len=0;kal_uint32 nwk_account_id = mf_skt_account;static kal_int16 sDNSHandle = MF_DNS_APPID;static kal_uint32 ipAddr;mf_dnsFunc = func;ret = soc_gethostbyname(KAL_FALSE,??????????????????MOD_MMI,????????????????????(kal_int32)sDNSHandle,????????????????????(const kal_char *)server_domain, ????????????????????(kal_uint8*)&ipAddr,????????????????????(kal_uint8*)&addr_len,????????????????????(kal_uint8)0,????????????????????nwk_account_id);????if (ret == SOC_SUCCESS){??kal_uint8 *ptr;??ptr = (kal_uint8*)&ipAddr;??kal_prompt_trace(MOD_ENG,"MF_getHostByName??ip: %d, %d, %d, %d", ptr[0], ptr[1], ptr[2], ptr[3]);??if(hAddr)?? *hAddr = MF_ntohl((mf_u32)ipAddr);??if(nAddr)?? *nAddr = (mf_u32)ipAddr;??return MF_TRUE;????}else if(ret == SOC_WOULDBLOCK){??SetProtocolEventHandler(MF_dns_event, MSG_ID_APP_SOC_GET_HOST_BY_NAME_IND);kal_prompt_trace(MOD_ENG," MF_getHostByName , ret %d", ret);return ret;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MTK的模拟器调试说没技巧也是对的,说有技巧也不错.因为模拟器的技术与其说是MTK经验,不如说是VC经验.
由于模拟器能在没有样机的情况做大量的UI方面的开发,同时模拟器具有快捷,所见即所改等优点,因此,受到很多开发老手的青睐.熟练掌握模拟器使用技巧,对于提高工作效率,节省资源具有很积极的意义.
7.Alt+8打开汇编指令窗口,这个窗口用处不是很大,学习汇编的话,还是有用处的.一般情况下,如果第三方的库文件出了问题,也就只能使用这个窗口调试了.普通情况下,如果错误定位在C标准库文件的汇编代码上,只有一种可能,就是你的调用出错了.
调试占了研发的很大一部分时间,调试的基本技术就这样,一般情况下是综合运用,灵活掌握,以期快速解决问题,稳定代码.剩下Байду номын сангаас是经验积累的问题了.
a.如何使用断点快速定位到问题点呢?如果我们发现,拨号窗口显示出了问题,但我们对代码不熟,不知道拨号窗口的代码在哪个文件,哪一行,我们就可以在EntryNewScreen函数上打断点,当进入拨号时他就会停下来,这时我们能过堆栈窗口信息就可以很轻松的找到这个窗口的实现函数。详细研究代码,就可以找到解决方法.
MTK调试入门之一
曾有朋友让我写一些调试技巧方面的文章.调试对于软件是十分重要的,但却不是一篇二篇文章能讲清楚的.有很多调试技巧都是零零碎碎的东西,用的时候能很容易使用,但要写出来时,却还是比较麻烦的.
MTK的调试一般来说可以分为仿真调试与手机调试.这两种调试对于研发新功能,修改BUG,研究算法都是十分重要的.当然,这两种调试也有差异,有时会出现在模拟器运行正常,在手机却运行失败,或者相反,这就突出了软件模拟环境与硬件手机环境的差别.原因可能是各种各样的,比如可能是有些硬件软件没有办法模拟,有些新功能对硬件依赖强,不能模拟,新软件的有些函数只能在手机上运行,没有写相应的模拟器代码.等等原因都会导致两者差异.这里不一一赘述,大家知道模拟器和手机有差异就行了.
5.WATCH窗口,按Alt+3打开,由于变量窗口自动显示的变量有时不是我们需要的,这时就可以把我们需要查看的变量拖放到该窗口研究,结合断点使用,并且这里也支持表达式取值,真是太棒了.
6.内存窗口,Alt+6打开内存窗口,内存窗口可以显示一块内存的内容,这是很有用的,比如我们要跟踪短信内容,有一个短信内容的指针,把该指针输入WATCH窗口,只能看到该指针指向的第一个值,要看其他的,会很麻烦,你只能输入表达式,但你把该指针输入内存窗口,就不必这样费事了
工欲善其事,必先利其器.欲了解模拟器调试,就要先了解VC使用.VC调试过程中经常使用的快捷键如下:
vc++断点的使用:按F9(设置断点),F5调试,F10单步调试,shift+F5退出调试F10单语句执行,F11单指令执行,Ctrl+F10执行至光标处;F9按行设置/取消断点, Alt+F9可按行,按数据或按消息设置断点;调试时,按Alt+3打开跟踪窗口,Alt+4打开变量窗口,Alt+5打开寄存器窗口,Alt+6打开内存窗口,Alt+7打开堆栈窗口,Alt+8打开汇编指令窗口;
3.堆栈调试,Alt+7打开堆栈窗口.该窗口中我们可以看到函数之间的调用关系,这是十分有用的,一般都是结合断点使用,定位BUG和研究代码十分有用.由于上面有例子,这里就不举了
4.变量窗口,Alt+4打开变量窗口,该窗口会自动显示断点代码处使用的变量及其值,阅读代码解决BUG时使用,单步执行时经常参考该窗口数据
c.在生成MODIS时,会遇到大量不认识的函数,如果少于50个,全部建成void xxx(){}类型的空函数.如果多于一百个,尝试查找这些函数的来源,如果是相关SP的,就再次补充关掉相关SP.当然如果你不怕麻烦,也可以把这一百个函数建成空函数.一般来说,把所有第三方功能和与MTK无关的功能关掉的话,不能识别的函数一般不会超过十个.
经过这样三步,一般情况下你都能得一个差不多可以使用的模拟器.有了模拟器,你就可以进行下面的工作了.如果你仍然无法获得模拟器,建议咨询你的项目领导,如果你的领导也无法解决,说明这个软件组是一个组员变动很快,或者说缺乏条理性的部门,当然也有可能这个部门的程序员都是一些MTK的顶尖层高手,他们的程序从来不需要调试.总之这是会让人疯狂的部门.
第六步:启动Modis->开机->Option->Luanch Catcher&NS,这样就可以进行模拟操作并从catcher中得到日志;
注意:老版本的Catcher下出现NS不能控制的情况。
make WMD6225_GEMINI GPRS gen_modis
cd modis
第三步:再切换到 D:\X
执行 make Prj_Name GPRS codegen_modis
第四步:最后转到modis目录,
执行 modiscodegen.pl ..\make\Prj_Name_GPRS.mak
第五步:开始使用Modis仿真--运行D:\X\modis\Modis.dsw,编译工程;
createmodis.pl ..\make\WMD6225_GEMINI_GPRS.mak
cd ..
make WMD6225_GEMINI GPRS codegen_modis
cd modis
modiscodegen.pl ..\make\WMD6225_GEMINI_GPRS.mak
注:
MTK Modis 使用简介
Modis PC仿真, 要进行如下操作:(假设工程路径为D:\X)
第一步:在如下目录中D:\X
执行 make Prj_Name GPRS gen_modis
第二步: 转到modis目录 D:\X\modis执行 createmodis.pl ..\make\Prj_Name_GPRS.mak
1.只要你有源代码,拥有一个模拟器是一件很容易的事.当然,有些情况下,这对于初入MTK的人来说,也是困难的,特别是在一些代码管理不善,公司人员众多,员工流动频繁的公司,你永远想象不出他们的代码会有多糟.不过一般情况下,我到一个新公司,都会试着去使用他们的代码编译得到模拟器,不管他们的代码多么糟,我总能快速的编出模拟器来.只要三个步骤:
1.在MTK平台,我们最常使用的TRACE函数是kal_prompt_trace函数,这个函数是系统提供给我们的用于在catcher里调试错误的.在这个函数不能使用的场合,有时我们会使用函数system_print或者dbg_printf,这两个函数可以不使用catcher的情况,使用WIN自带的工具超级终端来调试程序.有时驱动的朋友会自己用函数PutUARTBytes写自已TRACE函数,这些函数可以使用超级终端调试,如下,就是别人写的一个TRACE函数.打印某一块数据的内容,常常TRACE内存数据,指定地址,指定大小
d.研究代码也可以使用断点,比如MTK代码里使用有很多函数指针封装,例如gui_print_text指针,你想研究他的实现过程,但由于是指针,你找不到他的函数体,这时你就可以在数据断点中,把指针gui_print_text输入进去,重启模拟器时,他就会定位到ui_print_text函数处.
兹举这四个例子吧,断点可以使用于你需要调试的任何场合,但过多的断点会影响你查找问题的速度,等熟练使用时,就可以有针对性的对某些变量和函数打断点以解决问题.这是一个积累的过程
模拟器调试具有直观,快速,追踪方便能优点,受到很多MMI开发者的喜欢.而有关模拟器的调试,其他也就是VC调试功能的使用.由于国内软件教育重编程,算法,轻调试,所以很少有系统的调试方书的书.在开发过程中,我也见过许多人压根就不使用模拟器,他们认为模拟器也就是在没有手机的时候使用.详细讲解模拟器的调试就放到以后,因为模拟器断点,内存,堆栈,变量各个方面的调试,详细写来都可以成一篇文章.这里先讲一个手机调试的TRACE使用.以前曾写过一篇DUMP调试的文章.通过出错的DUMP信息查找错误.有兴趣的朋友可以参考. Detail_RD.Blog_blogercn_19169.html
a.在编译模拟器前请关掉所有SP的宏,这是很重要的,很多SP都不提供在模拟器下运行的库,所以一个项目SP越多,在模拟器下,他无法识别的函数也会越多
b.在编译过程中遇到错误,可以把所有与显示无关的代码全部使用#ifdef WIN32宏括起来,把所有不认识的类型使用typedef int xxx;重定义.把一些不能识别的宏定义使用WIN32括起来重定义一下
C.断点可以用来研究全局变量被意外修改问题,我们打开断点对话框,选第二个选项卡,把需要跟踪的变量打进去,当每次变量变化时,VC都会停下来等我们调试.也可以设置条件,假设某全局变量U8 g_XXX, 其值等于5时会出错,但你不知道这个全局变量在什么地方被什么代码赋值为5,这时就可以设置数据断点,在第二选项卡上面的对话框里输入g_XXX == 5,当其值为5时就会停下来.
2.如果你顺利到到一个模拟器,那么就可以开始调试了.首先说一下断点,VC中的断点分三大类,一类是本地断点,一类是数据断点(也称之为条件断点,有人称之为高级断点),还是一类是消息断点;这三类断点分别对应于快捷键"ALT+F9"打开的对话框中三个选项卡.由于消息断点是用于跟踪WIN的消息,所以在MTK中用不着.在模拟器中一般我们只使用本地断点与数据断点.本地断点和数据断点在BUG调试中举足轻重,熠熠生辉。熟练掌握断点技巧,可以使工作事倍功半。可能有些人会使用断点,但却不知道断点在模拟器中有什么妙用.断点有两个最常使用也的作用,一是跟踪代码执行情况,二是观察断点处局部变量值的变化.这两个功能应用最多.但他在MTK模拟器中还有两个隐含的用途,一就是快速定位文件,MTK本身的源代码大约有差不多上万个文件,而加入SP后,代码大约已经超过了万数.在这里面查找文章,查找函数,是一件很困难的事,这时就需要使用断点了.你在代码阅读工具SI中可以很轻松的利用"CTRL+O"打开文件,也可以使用"F7"快速定位到函数,但在VC中却没这么方便,不过你可以使用断点,比如想在VC中打开某个文件wgui_categories_CM.c,只要VC中使用"ALT+F9",在break at编辑框里输入{,E:\JMT_1120\plutommi\mmi\GUI\GUI_SRC\wgui_categories_CM.c,} .4693,按F5执行DEBUG后VC就能自己定位到这个文件wgui_categories_CM.c的4693行。这是文件断点,也可以打函数断点,比如文件wgui_categories_CM.c的4693行对应的是函数ShowCategory16Screen,也可以直接在break at编辑框里输入ShowCategory16Screen,使用F5键DEBUG时,函数运行到拨号界面时,就会停下来供你调试。本地断点就是这样使用的。那么本地断点有什么用呢?或者说有什么特殊用途呢?简单举几个例子吧,但断点可以应用于解决十分多的问题中,不要因为我的例子束缚了你的想象力.
相关文档
最新文档