以下是从安富利工程师的技术支持的邮件中摘抄的,在此再次对他们表示感谢。

在我们面对客户单板的时候,fsbl阶段的调试多少会有些问题,在这个过程中怎么快速定位客户的问题,并将有效的信息反馈给希望能帮助到你的人是决定解决问题时间长短的一个重要因素,在这里我写下一些我个人的调试经验,希望对你们有帮助,即使你不打算亲自去用这里面写的东西,也请将你转发给你的客户。我不希望听到看到收到关于问题的描述是只是仅仅是一句:客户的单板上电后没有任何反应。在这种情况下你要像了解女\男朋友一样去了解我们的芯片,我们的代码、我们的工具。如果你不能理解我这篇文章,那只能接受马伊琍式的悲剧,等待第三方的出现。

首先在我们的fsbl工程中是有调试开关的,在src/fsbl_debug.h中增加FSBL_DEBUG_INFO的宏定义,这样就将fsbl中所有的调试信息打开,启动过程中会有各种打印信息。

如果很不幸你的fsbl工程已经将这个调试宏配置了,系统启动后还是没有任何打印,在进一步调试之前你先要确定以下几个事情:

1:BOOT.BIN是否正确烧入flash中或保存在SD卡中

2:XPS硬件工程中的串口是否和硬件实际设计一致

3:波特率的设置有没有问题、串口线是否正常

当你通过一系列的交叉实验确认上述一切正常,那只能往更低层进行分析了,因为这个时候有可能是在芯片的BootROM运行阶段就出错了。将你的JTAG线连上单板,确认它正常工作后,我们可以继续。

首先我会在xmd里面通过connect arm hw命令连接到芯片,如果一切正常,你会看到下面的信息:

OK,这个时候已经连接到芯片上了,接下来应该干什么?要知道该做什么跟我们想知道什么是息息相关的,这个时候我们最想知道的是处理器到底运行得怎样的,处理器运行的怎么样通过什么东西能体现的最直接?当然是CPU的那些通用寄存器,那怎么查看这些通用寄存器?当然是用rrd的命令:

通过rrd,你可以看到当前的PC指针指向的位置,为什么是0xfffffe1c这个位置?不为什么,因为我还没有将fsbl通过JTAG下载。那我们继续吧,通过dow命令来下载fsbl的elf文件。

通过dow加载fsbl成功后,你可以再通过rrd命令看现在CPU的寄存器的值:

你可以看到pc已经被设置到0地址了,随时准备运行,只等你的发令枪响起来,OK,那我们继续,执行run命令:

OK,你的fsbl已经跑起来了,这个时候你的问题发生了,只要不发生人力不可抗的事故,基本上你还是可以通过stop命令将运行的CPU打住的:

你看到没有,CPU稳稳的停在了0x0000cd30的位置。当然我这里是正常情况,也许你那边根本就不是这个地方,但是只要是在dow命令那张图中的其中一个段中的地址,你还是有机会查看到CPU运行到什么位置的。比如我这里0x0000cd30会对应fsbl工程里面哪行代码呢?让我们回到SDK中fsbl的工程目录,找到Binaries里面对应的elf文件,猛烈双击它,在右边的窗口你就可以看到反汇编的结果:

我们在打开的反汇编结果里面查找cd30,这样很快就可以找到对应的C代码行了:

当然像上面这些正常情况下的调试都很顺利,也许你面对的情况是将BOOT.BIN文件烧入到外部存储器之后,系统上电什么反应都没有,即使你的fsbl里面也加了打印。这个时候我们就要关注一下以下问题:

fsbl是否被BootROM正常加载到OCM里面了,如果正常加载到了OCM里面,那就是fsbl执行阶段的问题,如果没有正常加载到OCM里面,那就是BootROM执行阶段的问题。

OK,我们先看看怎么判断fsbl是否被BootROM正确加载到OCM里面去了没?

很简单,如果fsbl正常加载了,那OCM里面的数据不会是空的,它里面会是BootROM读取进来的代码和数据,就像下面这样:

如果没有被BootROM正常加载,那上面的数据就是全0.

OK,接下来分析一下如果没有被BootROM加载到OCM里面的情况,此时一般都是BootROM访问外设出了问题。再OK一下,我们需要有个方法来确认是什么问题。在我们的芯片里面有一段slcr寄存器,这里面有个记录复位原因的寄存器REBOOT_STATUS,别被这个名字忽悠到,这里面确实有跟复位相关的信息,但更重要的是我们可以从它的低16位获取到本次启动失败的原因:

通过mrd命令将该寄存器的值读出来:

是个2是不是,2就对了,因为在UG585里面的的Debug Status章节里面的BootROM Error Output Codes里面写着2就是成功的。不2就有问题,你只需要根据这里面值就可以大致判断出问题所在。

如果你看到了这里说明你是位好同志,请给我发邮件,我会建议领导给你加薪。

ZYNQ fsbl阶段的调试方法的更多相关文章

  1. Linux环境下段错误的产生原因及调试方法小结(转)

    最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation F ...

  2. Linux环境下段错误的产生原因及调试方法小结

    转载自http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之 ...

  3. Linux内核调试方法总结【转】

    转自:http://my.oschina.net/fgq611/blog/113249 内核开发比用户空间开发更难的一个因素就是内核调试艰难.内核错误往往会导致系统宕机,很难保留出错时的现场.调试内核 ...

  4. 【转】【调试技巧】Linux环境下段错误的产生原因及调试方法小结

    本文转自:http://www.cnblogs.com/panfeng412/archive/2011/11/06/segmentation-fault-in-linux.html 1. 段错误是什么 ...

  5. [LED]如何配置LCD背光和LED,调试方法

    [DESCRIPTION] 如何配置LCD背光和LED,调试方法 [SOLUTION]LCD背光和LED配置文件alps/custom/<proj name>lk/cust_leds.ca ...

  6. 【转】Linux内核调试方法总结

    目录[-] 一  调试前的准备 二  内核中的bug 三  内核调试配置选项 1  内核配置 2  调试原子操作 四  引发bug并打印信息 1  BUG()和BUG_ON() 2  dump_sta ...

  7. Linux内核调试方法总结

    Linux内核调试方法总结 一  调试前的准备 二  内核中的bug 三  内核调试配置选项 1  内核配置 2  调试原子操作 四  引发bug并打印信息 1  BUG()和BUG_ON() 2   ...

  8. Linux环境下段错误的产生原因及调试方法小结【转】

    转自:http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之 ...

  9. 嵌入式linux应用程序调试方法

    嵌入式linux应用程序调试方法 四 内存工具 五 C/C++代码覆盖.性能profiling工具 四 内存工具 您肯定不想陷入类似在几千次调用之后发生分配溢出这样的情形. 许多小组花了许许多多时间来 ...

随机推荐

  1. 关于post请求超出最大长度

    这是因为asp.net默认限制最大上传文件大小为4096kb,而我上传了6000kb+所以超出了限制,需要修改项目的web.config文件即可解决,可以将最大文件长度设置为你需要的长度,我这里设置为 ...

  2. 利用.net的内部机制在asp.net中实现身份验证

    知识点: 在ASP.NET中,任何页面都是继承于System.Web.UI.Page,他提供了Response,Request,Session,Application的操作.在使用Visual Stu ...

  3. openssl 升级

    openssl version -a rpm -q --changelog  openssl | grep CVE bash -version #!/bin/bash if [[ $EUID -ne ...

  4. 解决ideviceinstaller未安装的问题

    在Mac上,使用Appium时提示: Could not initialize ideviceinstaller; make sure it is installed and works on you ...

  5. 入侵本地Mac OS X的详细过程 转自https://yq.aliyun.com/articles/22459?spm=5176.100239.blogcont24250.10.CfBYE9

    摘要: 本文从提升权限漏洞的一系列巧妙的方法来绕过受保护的Mac OS X.有些已经被处于底层控制,但由于它们存在着更多的认证和修补程序,我们不妨让这些提供出来,以便需要的人学习它们.虽然我不只是要利 ...

  6. Oracle定时计划快速使用

    Oracle定时计划快速使用 前言: SQL Server中有相关的定时计划,可以直接打开sql server 的任务管理器进行配置,可以方便.快速实现定时执行相应任务.相应的Oracle也有对应的定 ...

  7. kali-dmitry 域名信息收集

    DMirty:用来收集以下信息: 1. 端口扫描 2. whois主机IP和域名信息 3. 从Netcraft.com获取主机信息 4. 子域名 5. 域名中包含的邮件地址 1.使用方法: Deepm ...

  8. 崽崽帮www.zaizaibang.com精选14

    [行走贵州]爽爽贵阳,乐活天堂! 北京儿童医院将建遗传代谢病专科医院 [山东十大最难懂方言]原来青岛话还是很好懂滴 ❤如果南宁的儿童医院长这样…… 成都三所小学入围中国百强小学名单 [乐湖新闻]学习中 ...

  9. 常用Web Service汇总(天气预报、时刻表等)

      现成的Web Service中有很多很好用的,比如天气预报,IP地址搜索,火车时刻表等等.本文汇总的一些常用Web Service,希望对大家有所帮助. AD: ================= ...

  10. Debian MySQL 卸载和安装 PHP安装

    如果是apt-get安装的 sudo apt-get --purge remove mysql-serversudo apt-get --purge remove mysql-clientsudo a ...