ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:21.49KB ,
资源ID:11786989      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11786989.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌入式调试与优化技术论文.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

嵌入式调试与优化技术论文.docx

1、嵌入式调试与优化技术论文南 阳 理 工 学 院嵌入式调试与优化技术学院(部): 软件学院 _ 专 业: 软件工程 _ _学 号: 1215135242 _班 级: 12级移动(4)班 学 生: 彭文鑫 _指导老师: _ 许_豪 _完成日期: _ 2014年6月7日 _目录 1.在LINUX上的CDB 1.1 GDB的功能简述 1.2 GDB运用所 1.3 GDB调试的实 2.进程间的通信 2.1进间信的概 2.2管道2.3 消息队列2.4信号量2.5共享内存 2.6信号 致谢 嵌入式调试与优化技术摘要在过去的几十年里,嵌入式工程师在开发和调试中已经越来越依赖于跟踪缓存的帮助。但随着100MHz

2、频率以上的高速RISC处理器的普及,片内Cache、RAM和FLASH存储器逐渐变得越来越普遍。越来越多的处理器总线活动将无法在外部管脚上观测。这样,传统的收集跟踪信息的方法就不再可行了。在过去的几年里,通过微处理器生产厂商和开发工具厂商之间的密切合作,开发出了各种基于跟踪缓存调试方法的新技术。这些技术通常的做法是使仿真器通过特殊的跟踪端口只捕获与跟踪有关的信息,通常这个跟踪端口是处理器提供的一个标准窄位宽处理器接口(只需要少量的管脚数目)。这些与跟踪有关的信息只要包含让仿真器判定代码执行流程的信息就足够了。许多情况下,数据读写活动也包含在其中。掌握了这些可以判定代码执行流程的信息后,不需要收

3、集处理器总线活动的全部信息,仿真器就可以再现处理器执行的复杂历史记录。这种跟踪方法,相对于在线仿真器,一般称之为在线调试器。关键词GDB调试;进程;内存优化1在LINUX上的CDB调试1.1GDB的功能简述 GDB 是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。UNIX 下的软件全是命令行的,这给程序开发提供了极大的便利,命令行软件的优势在于,他们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能。于是 UNIX 下的软件比 windows 下的软件更能有机的结合,各自发挥各自的长处,组合成更为强筋的功能。而 wind

4、ows 下的图形软件基本上各自为营,互相不能条用,很不利于各种软件的相互集成。在这里并不是要和 windows 做个什么比较,所谓“寸有所长,尺有所短”,图形化工具还是有不如命令行的地方。用 GDB 调试程序GDB 概述GDB 是 GNU 开源组织发布的一个强大的 UNIX 下调试程序工具。或许各位比较喜欢那种图形界面方式的,像 VC,BCB 等 IDE 的调试,但如果你是在 UNIX 平台下作软件,你会发现 GDB 这个调试工具有比 VC,BCB 的图形化调试器更强大的功能。1.2 GDB运用所需的常用命令 1、常看源码:list(l) 行号 当前行号的正偏移 当前行号的负偏移 :哪个文件的

5、哪一行 函数名 :文件的哪个函数 程序运行时语句在内存中的地址 2、设置断点:break(b) n指定函数断点 指定行号断点 当前行号的正负偏移 :哪个文件的哪一行 运行中的内存地址 不带参数,下一条指令停止处 .在运行中,当条件满足时停止。 Eg.breakifi=100 /当i=100时,立即停止break foo if i=100 /断点设置在foo中,断点条件是i-100, 一点在函数foo中,i的值等于100,被停止。 3、查看信息:infoinfobreak查看断点信息 info locals 打印出当前函数中所有局部变量及其值infostack查看栈中信息 info frame

6、更详细的栈层地址信息infoargs查看参数信息inforegisters/infoall -registers查看(所有)寄存器信息infosources查看项目的源代码信息4、维护breakpoint:disable/enable/clear/delete disable(dis) 【breakpoints】 【range.】 如果没有参数,则停止所有的断点, enable 【breakpoints】【range】 clear / 清楚已定义的停止点 delete breakpoints ranga. 删除指定的断点5、恢复程序运行:continue(c)6、until和finish un

7、til 跳出循环比较有用 help finish Execute until selected stack frame returns. Upon return, the value returned is printed and put in the value history. finish 用来跳出函数比较有用。 help until Execute until the program reaches a source line greater than the current or a specified location (same args as break command) wi

8、thin the current frame1.3GDB调试的实例叙述 1: 对于在应用程序中加入参数进行调试的方法: 直接用 gdb app -p1 -p2 这样进行调试是不行的。需要像以下这样使用: #gdb app (gdb) r -p1 -p2 或者在运行run命令前使用set args命令: (gdb) set args p1 p2 可以用show args 命令来查看2. 加入断点: break break break +offset break -offset (在当前行号的前面或后面的offset行停住。) break filename:linenum 在源文件filename

9、的linenum行处停住。 break filename:function 在源文件filename的function函数的入口处停住。 break . if .可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置 break if i=100,表示当i为100时停住程序。3. 查看运行时的堆栈: 使用bt命令4. 打印某个变量的值: print val5. 单步: n 继续运行:cstep单步跟踪,如果有函数调用,他会进入该函数。next同样单步跟踪,如果有函数调用,他不会进入该函数。很像VC等工具中的step over。后面可以加count也可以不加,

10、不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。set step-modeset step-mode on打开step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码。set step-mod off关闭step-mode模式。finish运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。until 或 u当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。 6.在中执行shell命令:在gdb环境中,你可以执行UNIX的shell的命令,使用gdb的shell命令

11、来完成:eg. shell make 7. 运行环境 可设定程序的运行路径。 show paths 查看程序的运行路径。 set environment varname =value 设置环境变量。如:set env USER=hchen show environment varname 查看环境变量。8.观察点(WatchPoint) 观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程 序。我们有下面的几种方法来设置观察点: watch 为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。 rwatch 当表达式(变量)expr被

12、读时,停住程序。 awatch 当表达式(变量)的值被读或被写时,停住程序。 info watchpoints 列出当前所设置了的所有观察点。9. 维护breakpoint clear 清除所有的已定义的停止点。 clear func 清除所有设置在函数上的停止点。 delete breakpoints range. 删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7)。其简写命令为d。 比删除更好的一种方法是disable停止点,disable了的停止点,GDB不会删除,当你还需要时,enable即可,就好像回收站

13、一样。 disable breakpoints range. disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止 点。简写命令是dis. enable breakpoints range. enable所指定的停止点,breakpoints为停止点号。10、程序变量查看文件中某变量的值:file:variablefunction:variable可以通过这种形式指定你所想查看的变量,是哪个文件中的或是哪个函数中的。例如,查看文件f2.c中的全局变量x的值:gdb) p f2.c:x查看数组的值有时候,你需要查看一段连续的内存空间的值。

14、比如数组的一段,或是动态分配的数据的大小。你可以使用GDB的“”操作符,“”的左边是第一个内存的地址的值,“”的右边则你你想查看内存的长度。例如,你的程序中有这样的语句:int *array = (int *) malloc (len * sizeof (int);于是,在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:p *arraylen如果是静态数组的话,可以直接用print数组名,就可以显示数组中所有数据的内容了。11.输出格式一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中

15、的位的情况。要做到这样,你可以使用GDB的数据显示格式:x 按十六进制格式显示变量。d 按十进制格式显示变量。u 按十六进制格式显示无符号整型。o 按八进制格式显示变量。t 按二进制格式显示变量。a 按十六进制格式显示变量。c 按字符格式显示变量。f 按浮点数格式显示变量。(gdb) p i$21 = 101(gdb) p/a i$22 = 0x65(gdb) p/c i$23 = 101 e(gdb) p/f i$24 = 1.41531145e-43(gdb) p/x i$25 = 0x65(gdb) p/t i$26 = 11001012.进程间的通信 2.1进程间通信的概述 进程间的通

16、信,它的数据空间的独立性决定了它的通信相对比较复杂,需要通过操作系统。以前进程间的通信只能是单机版的,现在操作系统都继承了基于套接字(socket)的进程间的通信机制。这样进程间的通信就不局限于单台计算机了,实现了网络通信。 进程的通信机制主要有:管道、有名管道、消息队列、信号量、共享空间、信号、套接字。 2.2管道 它传递数据是单向性的,只能从一方流向另一方,也就是一种半双工的通信方式;只用于有亲缘关系的进程间的通信,亲缘关系也就是父子进程或兄弟进程;没有名字并且大小受限,传输的是无格式的流,所以两进程通信时必须约定好数据通信的格式。管道它就像一个特殊的文件,但这个文件之存在于内存中,在创建

17、管道时,系统为管道分配了一个页面作为数据缓冲区,进程对这个数据缓冲区进行读写,以此来完成通信。其中一个进程只能读一个只能写,所以叫半双工通信,为什么一个只能读一个只能写呢?因为写进程是在缓冲区的末尾写入,读进程是在缓冲区的头部读取,他们各自 的数据结构不同,所以功能不同。2.3消息队列消息队列是存放在内核中的消息链表,每个消息队列由消息队列标识符标识,于管道不同的是,消息队列存放在内核中,只有在内核重启时才能删除一个消息队列,内核重启也就是系统重启,同样消息队列的大小也是受限制的。 2.4信号量 信号量也可以说是一个计数器,常用来处理进程或线程同步的问题,特别是对临界资源的访问同步问题。临界资

18、源:为某一时刻只能由一个进程或线程操作的资源,当信号量的值大于或等于0时,表示可以供并发进程访问的临界资源数,当小于0时,表示正在等待使用临界资源的进程数。更重要的是,信号量的值仅能由PV操作来改变。 2.5共享内存 共享内存就是分配一块能被其他进程访问的内存。共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。首先说下在使用共享内存区前,必须通过系统函数将其附加到进程的地址空间或说为映射到进程空间。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到 进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需

19、要某种同步机制,互 斥锁和信号量都可以。采用共享内存通信的一个显而易 见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而 共享内存则只拷贝两次数据1:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就 解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存 中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。 2.6信号

20、 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息。信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源。信号分为可靠信号和不可靠信号,实时信号和非实时信号。进程有三种方式响应信号1.忽略信号2.捕捉信号3.执行缺省操作。参考文献1嵌入式软件调试技术 主编:罗克露 编著:陈云川 电子工业出版社2 嵌入式LINUX内存使用与性能优化 编著:史子旺 叶超群 蔡建宇 机械工业出版社致谢本文是在许老师的热情关心和指导下完成的,并得到同学的帮助和支持

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1