展讯平台软件调试介绍Spreadtrum7/21/2009培训目的¾能够使用展讯提供的调试工具对开发中的问题进行调试¾能够分析几种常见ASSERT主要内容展讯调试工具简介调试方法展讯调试工具简介主要的调试工具有: ¾Dloader¾NVEditor¾Channel Server¾Logel¾Phone Tester¾DSP Log Dloader(1功能:下载程序设置界面:双击可以选择下载文件路径选择端口选择项目选择下载速率制作打包文件选择是否下载Nand Flash下载配置:大小页选择分区策略选择分区策略¾始终分区¾出现不兼容分区时停止下载¾出现不兼容分区,使用Flash中原有分区进行下载¾出现不兼容分区,使用FDL中的分区方式进行分区注:此配置项只对NAND FLASH有效备份信息配置:将NV保存到本地选择需要保留的信息正在下载:下载成功:下载失败:Dloader(4打包文件特别说明:展讯升级工具中使用打包文件来进行升级操作,打包文件中不仅包含了所有的下载文件,还包含了下载项目的地址信息,这样可以降低产线升级工具配置出错的可能性,同时简化了操作。
打包文件的制作方法:DloadeR 在配置好所有的配置项后,点击左图中的按钮,然后按照提示即可完成打包文件的制作。
点击这个按钮进行打包操作展讯调试工具简介¾Downloader¾NVEditor¾Channel Server¾Logel¾Phone Tester¾DSP Log功能:•对fixed NV参数进行读取,编辑,保存,下载•擦除NV•从手机中读出NV Item修改某项数据:选择菜单[File\save image]保存并生成二进制数据文件:选择菜单[File\Save to phone]直接下载到手机中——手机需要在下载模式如果需要保留校准参数需要选择上获取手机NV数据:选择菜单[File\LoadFromPhone(boot mode]来获取数据在下载模式下从保留区域处获取下载的nvitem数据。
某些nvitem可能会被修改并被存储到数据区,如果需要获取这些最新的数据,则用LoadFromPhone(normal mode。
此时手机应在正常开机状态,并且没有进入deep sleep。
读Flash:选择菜单[Facility\Read Flash](NAND Flash选择Read NAND Flash。
手机需要在下载模式。
该地址为下载模式下flash的地址空间,地址一定要是有效地址。
擦除某区域的Flash:选择菜单[Facility\Erase Flash ](Nand Flash选择Erase Nand Flash。
手机需要在下载模式展讯调试工具简介¾Downloader¾NVEditor¾Channel Server¾Logel¾Phone Tester¾DSP Log功能:¾管理其它工具与手机通讯。
它通过Socket与其它工具通讯,通过串口与手机连接。
¾消息存储转发¾消息字节顺序转换¾消息记录运行ChannelServer.exe :变绿代表成功连接串口或虚拟串口端口号波特率设置由于展讯平台使用大端,这里要勾上单击右下角托盘中的ChannelServer 小图标,在弹出的对话框中的进行配置(成功后,小图标变绿色展讯调试工具简介¾Downloader¾NVEditor¾Channel Server¾Logel¾Phone Tester¾DSP LogLogel(1功能:¾实时诊断和监控手机运行状况,解决、分析问题¾Trace 功能,Layer 3的空中消息,应用窗口的消息流¾手机出错时的信息的收集、记录¾回放功能消息包的解析线程间的消息利用SCI_TRACE_XXX打印的字符串先将手机与Channel Sever连接上,打开Logel,连接Channel Server Logel(2 展讯调试工具简介¾Downloader¾NVEditor¾Channel Server¾Logel¾Phone Tester¾DSP Log功能:¾读写内存/寄存器值¾RF校准¾Audio设置注意:使用PhoneTester时,如果手机进入DeepSleep,操作会失败;有的平台中,使用的是Mobile Tester,功能与使用方法都同Phone Tester类似。
点击使之与channel server相连寄存器/内存地址需读取的大小如果寄存器的读取, mode应设为DWORD展讯调试工具简介¾Downloader¾NVEditor¾Channel Server¾Logel¾Phone Tester¾DSP Log功能:抓取DSP Log使用之前,需要在NV中将DSP Log打开: DownloadParam/log_switch_struct设置为0x1选择菜单[Action\Setting],设置串口参数,以及LOG文件保存路径•单击工具栏图标连接•单击图标开始抓取LOG•详细使用方法,请参考相应工具的使用手册主要内容展讯调试工具简介调试方法调试方法¾LOG¾分析断言(ASSERT信息¾通过PhoneTester实时查看寄存器、内存信息LOG (1利用平台提供的LOG接口,可以将字符串通过Logel工具在PC上打印出来,使得开发人员可以跟踪程序的运行,接口是SCI_TRACE_LOW使用LOG的注意事项:¾尽量避免在会频繁调用的函数或者循环中调用SCI_TRACE_LOW,会影响程序的效率¾某些栈空间很小的线程中,调用SCI_TRACE_LOW会导致堆栈溢出,要特别注意,一般如果栈空间小于1K Bytes 就不能调用了¾中断处理中不能调用SCI_TRACE_LOW需要特别说明的是log工具需要和软件版本配套。
调试方法¾LOG¾分析断言(ASSERT信息¾通过PhoneTester实时查看寄存器、内存信息在开发的过程中,合理的利用ASSERT检查程序的合法性是非常必要的。
例如,我们一般会在函数入口利用ASSERT检查参数合法性。
这是发生assert时弹出的assert提示窗口。
遇到ASSERT时需要保留的信息:¾Assert产生时连着Logel工具:①Assert时Logel会自动弹出Assert Frame,并显示提示信息, ChannelServer显示红色;②选择[Logel\Assert\Open Map File]打开相应的Map文件;③按照提示信息,依次输入1-8保存相应的信息;④关闭Assert Frame,信息会保存在\\Logel\Bin\History目录下的文件中,文件名中包含时间信息。
¾Assert产生时未连着Logel工具:①通过串口连接线将手机和PC相连,运行ChannelServer、Logel,并进行必要的设置;②点击[Logel\Assert\Open Assert Frame ],在弹出的Frame中反复输入字符‘0’,直至Frame中显示提示信息、ChannelServer显示红色;③按照上面的②、③、④步操作。
ASSERT Frame框选项:①Print help info②Print assert info,包括Assert时的软硬件版本信息,产生Assert的位置(文件名,行号,当前线程(或中断服务程序的信息③Print important registers,包括SVC, IRQ, ABORT, UNDEFINED模式下的R13,R14,SPSR,以及当前模式下的所有寄存器④Dump all memory to a file,内容包括External Ram,Internal Ram,Shared Memory,ARM Registers。
Dump完成之后会保存为*.mem文件。
⑤Print memory allocated info,列出通过动态分配、到当前还没有被释放的内存信息。
包括分配的序列号(No.,长度(Size,分配的位置(FileName (Line⑥Print memory pools info,列出各个内存池的使用信息⑦Print tasks info,列出各个线程的ID,控制块地址,当前运行地址,消息队列的使用情况⑧Print stack info,列出各个线程的堆栈使用情况⑨Print callback function list,列出所有线程的函数调用情况⑩Read memory,实时的读取输入地址的内存内容分析ASSERT需要的其他信息:¾相应的软、硬件版本¾产生断言条件(在什么环境下、如何操作的说明¾必须有相应的文件:*.bin, *.axf, *.map, *.mem¾Log信息也是需要的。
相对应的全部log文件Mem文件的使用:¾配合map文件可以对各个全局变量进行分析¾结合*.axf文件,载入ADS的AXD中进行分析¾通过Task Switch,可以查看Assert之前的一段时间内系统运行的情况,对分析有些任务长时间得不到运行的问题很有帮助分别介绍几类常见ASSERT的debug方法:¾普通ASSERT¾Queue Full¾Stack Overflow¾No Memory¾其他一些ASSERT普通ASSERT:指开发人员在程序中加的ASSERT。
该类ASSERT最容易分析,通过1: Print assert info,查看ASSERT产生的行号,通过8: Print callback function list,查看程序调用流程,再利用LOG信息,很容易判断出错误来源Queue Full ASSERT:¾第一步,查看6: Print tasks info,找出Queue Full的线程¾表面原因是线程的消息队列已满,内部原因大致有:•线程内部有死循环,导致线程无法处理消息通过LOG信息结合代码,推测出在运行哪段程序,检查相应代码是否存在死循环的可能•被其他线程抢占,或存在死锁,导致线程长时间得不到运行可以通过mem和Task Switch工具查看ASSERT前一段时间内的TASK以及中断的运行情况,判断出被抢占的原因,比如是由于优先级设置不合理造成,还是无法获得资源等等•线程消息队列大小设置过小增大Queue即可。