第七期 OpenOCD配置分析 《路由器就是开发板》

原创 2016年08月28日 18:58:05
        这一节我们来说说OpenOCD。刚开始接触嵌入式硬件时只知道写程序,觉得调试根本不需要,随着时间的积累和问题复杂度的提升,才发现调试对于一个系统的重要性。生活中很多这样的例子,调试,永远都是事物良性发展过程中必不可少的一个环节,两个人过日子遇到了矛盾,静下来沟通就是调试,总不能一言不合就分手。在设计一个产品或者一个流程时,都要充分的考虑到调试因素,这样系统在运行过程中一旦出现了问题,可以及时的追溯。OpenOCD就是这样一个工具,配合JTAG调试协议,可以对硬件设备进行指令集级别和寄存器级别的调试。
        了解一个新软件最好的方式就是读官方的Manual。当然,不一定非得从Manual开始,可以从一些实例开始,或者基于母语的博客或者论坛,但想掌握得更彻底,还是得找官方的文档,解铃还须系铃人。如果软件的设计思想过于复杂,Manual读一遍是不管用的。往往盘旋式的前进会收到更好的效果,也就是带着问题读Manual,解决了问题;再遇到一些问题时,再读一遍Manual,就这样反复几遍也就逐渐掌握了,所谓的一万小时理论也是基于此。
为了让大家知道官方Manual的重要性,我还是基于对Manual的翻译来讲OpenOCD的配置和使用。http://openocd.net/ 可以下载到OpenOCD的一切。OpenOCD的文档做得比较有条理。
        OpenOCD是Dominic Rath大神写论文时得到的灵感,在此奉劝还没写毕业论文的诸位认真的选题和创作。
        The Open On-Chip Debugger (OpenOCD) aims to provide debugging, in-system programming and boundary-scan testing for embedded target devices.
        刚一开始可能还摸不清OpenOCD的运作模式,毕竟它不是一款图形化得软件,而是基于command line 的交互方式。而且OpenOCD运行后直接就是一个Daemon,我第一次运行时还真有点懵。这种软件还是得靠动手操作实例来掌握。
        使用OpenOCD开发项目,我们需要做的不止是将调试器连接到开发板,我们还需要配置OpenOCD让它知道我们的调试器和开发板的型号,可以使用OpenOCD连接GDB,然后使用例如Eclipse或者其它图形化的工具。
先来理解一个概念--TAP:
        Test Access Ports (TAPs) are the core of JTAG. TAPs serve many roles, including:
          *Debug TargetA CPU TAP can be used as a GDB debug target.
          *Flash ProgrammingSome chips program the flash directly via JTAG. Others do it indirectly, making a CPU do it.
          *Program DownloadUsing the same CPU support GDB uses, you can initialize a DRAM controller, download code to DRAM, and then start running that code.
          *Boundary ScanMost chips support boundary scan, which helps test for board assembly problems like solder bridges and missing connections.

        通俗点讲,TAP就是一个调试链,通常一个芯片就是一个TAP,但是一个芯片往往包含多个IP核,比如,ARM+DSP或者ARM+FPGA或者ARM+ASIC,所以在这个chain里面通常会包含多个可调试对象,比如使用scan_chain命令显示的信息,可以看到omap5912下面包括3个可调试成员。


        OpenOCD启动时将配置文件作为参数.
        openocd.exe -f jlink.cfg -f openocd-ralink.cfg 命令就是将jlink.cfg和openocd-ralink.cfg两个配置文件作为配置参数,下面针对Openocd-ralink.cfg 每行做一个分析:

<span style="font-size:14px;"><span style="font-size:18px;">################################################################
set  _CHIPNAME rt3052  #定义变量
set  _ENDIAN little		#定义变量

#daemon configuration
telnet_port 4444    #定义telnet 端口 4444
gdb_port 3333		#定义GDB端口 3333

#jtag_speed 0
adapter_khz 500      #适配器频率设置
set _CPUTAPID 0x1335024F   #设置 _CPUTAPID 变量
adapter_nsrst_delay 100		#设置 nsrst信号延迟
jtag_ntrst_delay 100		#设置 ntrst 信号延迟

 #配置一个新的TAP 命名为 rt30xx
jtag newtap rt30xx cpu -irlen 5 -ircapture 0x1 -irmask 0x1f -expected-id 0x1305224f     

#为rt30xx的TAP建立一个cpu 叫 rt30xx.cpu  类型为mips_m4k little_endian	
target create rt30xx.cpu mips_m4k -endian little -chain-position rt30xx.cpu     

#对建立好的cpu进行配置 reset-halt-post 事件时的处理方法
rt30xx.cpu configure -event reset-halt-post {
	#set memory
	mww 0x10000300 0xD1825272
	sleep 10
	mww 0x10000304 0xE0120600
	halt
}

#对建立好的cpu进行配置 reset-init 事件时的处理方法
rt30xx.cpu configure -event reset-init {
	halt
	#set memory
	mww 0x10000300 0xD1825272
	sleep 1 
	mww 0x10000304 0xE1110600
	sleep 10000                         ;# wait for lock
	halt
	sleep 1
	flash probe 0
}

#用户自定义函数 ralink_init 对CPU进行初始化
proc ralink_init { } {
	halt
	sleep 10
	mww 0x10000300 0xD1825272
	sleep 1
	mww 0x10000304 0xE0120600       ;# Set Memory 32Mbyte in 32Bit(16MBx16bitx2)
	sleep 1                         ;# wait for lock
}

#用户自定义函数 erase_uboot 将flash中U-Boot 区域擦除
proc erase_uboot { } {
flash probe 0
flash erase_sector 0 0 4
}

#用户自定义函数 flash_uboot 将U-Boot写入flash
proc flash_uboot { } {
ralink_init
sleep 1
flash probe 0
flash write_bank 0 uboot.bin 0x0
}

#用户自定义函数 flash_uboot 将U-Boot写入flash
proc run_uboot { } {
ralink_init
sleep 1
load_image uboot.bin 0x200000
resume 0x200000
}

# setup working area somewhere in RAM
#rt30xx.cpu configure \
#	-work-area-phys  0xa0600000 \
#	-work-area-size 65536 \
#	-work-area-backup 0

rt30xx.cpu configure -work-area-phys 0x00000000 -work-area-size 0x0010000  -work-area-backup 0
#rt30xx.cpu configure -work-area-phys 0xa0600000 -work-area-size 0x20000  -work-area-backup 0
#rt30xx.cpu configure -work-area-phys 0x00600000 -work-area-size 0x40000
# serial SPI capable flash
# flash bank <driver> <base> <size> <chip_width> <bus_width>

#定义flash配置
flash bank rt30xx.flash cfi 0xbf000000 0x1000000 2 2  rt30xx.cpu
#flash probe 0
###########################################################</span></span>
        从上面的配置文件可以看出配置文件的几个配置要素
        1. Daemon Configuration
        2. Adapter Configuration
        3. Reset Configuration
        4. Tap Declaration
        5. CPU Configuration
        6. Flash Configuration
        7. Project-Specific Utilities
        将这个几个要素作为线索读官方手册里相应的内容,就能有一个系统的了解。
        下面关注一下 OpenOCD 的相关命令 当利用telnet 或者 GDB 登录成功后,就可以通过自定义函数或者命令操作,将一些常用的命令列出来,方便查询。
        1 Daemon Commands
                1.1.exit  #退出
                1.2.help#显示帮助信息
                1.3.sleep (msec)#暂停 xx 毫秒
                1.4.shutdown#关闭
                1.5.debug_level  #设置和显示 debug 级别
        2 Target State handling
                2.1.reg#显示寄存器信息
                2.2.halt (ms)   #暂停
                2.3.resume (address)#重新运行
                2.4.step#单步运行
                2.5.reset (run halt init)   #重启
        3 I/O Utilities
                3.1.meminfo   #显示内存信息
        4 Memory access commands
                4.1.mdw    #Memory Display Word
                4.2.mdh    #Memory Display HalfWord
                4.3.mdb    #Memory Display Byte
                4.4.mww    #Memory Write Word
                4.5.mwh    #Memory Write Halfword
                4.6.mwb    #Memory Wirte Byte
        5 Image loading commands
                5.1.dump_image  #从内存中copy镜像
                5.2.fast_load#加载镜像到内存
                5.3.fast_load_image#加载镜像到内存
                5.4.load_image#加载镜像到内存
        6 Breakpoint and Watchpoint commands
                6.1.bp [address len [hw]]#显示BreakPoint信息
                6.2.rbp address# Remove BreakPoint
                6.3.rwp address#Remove Date Wathpoint  on address
                6.4.wp  #显示WatchPoint信息
        7 Misc commands
                7.1.scan_chain   #扫描并显示TAP信息

        OpenOCD的内容就说这么多,关键还是多实践,多阅读文档,OpenOCD的优势就是开源,支持N种调试器。充分的理解和掌握整个开发过程中的调试方法,是项目稳定进行的可靠保障,很多未知问题都得通过底层调试才能分析出来。
---------------------------------------------------------------------------
SDK下载地址:   https://github.com/aggresss/RFDemo

版权声明:本文为aggresss原创文章,未经博主允许不得转载。 作者:aggresss@gmail.com 举报

相关文章推荐

openocd0.6.0的安装与配置

1. openocd0.6.0安装 1.1. 源码下载     下载代码主要有两种方式:     1.从openocd的官网(http://openocd.berlios.de/web/...

Ubuntu环境下使用OpenOCD调试目标平台

硬件环境:HP CQ45 308 操作系统:KUbuntu12.04 LTS 32bit 目标平台:LM3S811最小系统         OpenOCD最早接触应该是在半年前了,当时买了OpenJ...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

OpenOCD介绍以及上手

Versaloon支持AVR和AVR32的方式是模仿JTAGICE mkII,所以使用上相对简单很多,只是使用官方的开发环境即可。但Versaloon对ARM的支持是通过OpenOCD来实现,Open...
  • bytxl
  • bytxl
  • 2015-12-03 15:06
  • 1081

基于ubuntu下stm32开发环境搭建(ubuntu+st-link+libopencm3)

转自http://www.ithao123.cn/content-8230435.html [摘要:媒介 玩8位、16位、32位单片机之类的开辟海内根基上皆是用windows操纵体系,用的是keil...

OpenOCD - Using JLink For ubuntu and Windows 7(Cygwin)

OpenOCD is an open-source project  aiming providing a online debugger, originating from a thesis. f...

用openocd+jtag并口小板调试qq2440

*关于openocd    openocd是一个开源的调试工具,支持一些主流的CPU,不过目前来看,支持ARM是比较多的。其主页为http://openocd.berlios.de/ . 目前open...

[转]用OpenOCD、GDB、Insight 调试U-BOOT

终于在网上看找到这个U-BOOT调试方法了,还没来得急自手试,先放在这,找个时间试试,这里一个主要难点可能就是,怎么使OpenOCD连上开发板了,想先拿QQ2440来试,再拿工作板 Star8132开...
  • da895
  • da895
  • 2011-01-18 22:11
  • 4711

第六期 Wiggler调试路由器 《路由器就是开发板》

JTAG接口的调试器有很多种,一般都很贵RMB四位数的也有,尤其是MIPS的开发板不想ARM市场那么广,所以调试器的价格确实很贵,对于学习研究来说当然还是本着开源共享的原则,所以我们需要探索一条开源免...

第四期 JTAG接口和TTL接口 《路由器就是开发板》

这一节我们来进行一些准备工作,主要两个任务:1.制作JTAG接口作为CPU硬件级别调试,2.引出TTL线,作为console接口。 这是一个门槛,首先要求你有一点焊接经验,至少能精美的焊接DIP封装的...

第二十期 U-Boot添加web failsafe功能《路由器就是开发板》

这一期我们在U-Boot上搭建一个简易的web serbver,实现http方式的更新功能,web server是基于uIP实现,已经有前辈在这方面完成了需求,所以我这里向大家推荐两个github的r...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)