ubuntu下使用skyeye对u-boot进行源码级调试

2023-10-06 20:19

本文主要是介绍ubuntu下使用skyeye对u-boot进行源码级调试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习嵌入式linux编程一个很好的切入点就是先学习u-boot,u-boot的coding stytle与linux完全一样,而且程序注释丰富,很容易上手,如果能把u-boot完全理解了再转向linux,可以达到事半功倍的效果。可是u-boot发展到现在兼容了很多平台,代码量已经非常大了,程序调用从一个文件夹转到另一个文件夹,转来转去的,如果单纯的看代码的话,一会就头大了。那么可不可以像windows下调试程序一样通过一种方法单步调试u-boot呢,网上很容易找到的有两种方法:一种方法是使用ads+axd来进行源码级调试,这种方法应该是可行的,可是我还没有验证过,因为我手头一没有仿真器,二没有开发板;另一种方法是使用BDI调试,BDI是个啥我现在还没整明白,只知道这东西巨贵,实用性不高。我下面介绍的方法是纯软件的解决方案,不涉及任何硬件,使用的工具及版本如下:
代码:
1、skyeye                            1.2.6-rc1
2、arm-linux-gcc                            2.95.3
3、arm-linux-gdb                            6.8
4、arm-linux-insight                      6.8
5、u-boot                                       1.1.4
host使用的是ubuntu-8.04

本方法是在假定您已经搭好arm-linux交叉编译环境及arm-linux-gdb+insight调试环境的基础上进行的,没搭好的可以参照我之前发的帖子搭一下, http://forum.ubuntu.org.cn/viewtopic.php?f=97&t=159051

一、编译安装skyeye
假定我的工作目录是~/workspace,下载skyeye-1.2.6_rc1.tar.bz2至工作目录
代码:
kanson@kanson:~/workspace$ tar -jxvf skyeye-1.2.6.tar.bz2
kanson@kanson:~/workspace$ cd skyeye-1.2.6_rc1
kanson@kanson:~/.../skyeye-1.2.6_rc1$ ./configure
kanson@kanson:~/.../skyeye-1.2.6_rc1$ make
kanson@kanson:~/.../skyeye-1.2.6_rc1$ sudo cp skyeye /usr/bin

这样就可以在任何目录使用skyeye了
二、配置u-boot-1.1.4
代码:
kanson@kanson:~/workspace$ tar -jxvf u-boot-1.1.4.tar.bz2
kanson@kanson:~/workspace$ cd u-boot-1.1.4
kanson@kanson:~/.../u-boot-1.1.4$ make smdk2410_config
kanson@kanson:~/.../u-boot-1.1.4$ make

编译时会出现两个错误,解决方法如下:
引用:
make[1]: *** No rule to make target `hello_world.srec', needed by `all'. Stop.
make[1]: Leaving directory `/home/mort/src/targa/u-boot/u-boot-TOT/examples'
make: *** [examples] Error 2
有如下的解决方法:
打开 examples/Makefile 
119 $(LIB): .depend $(LIBOBJS)
120 $(AR) crv $@ $(LIBOBJS)
121 
122 %: %.o $(LIB)
123 $(LD) -g $(EX_LDFLAGS) -Ttext $(LOAD_ADDR) \
124 -o $@ -e $(<:.o=) $< $(LIB) \
125 -L$(gcclibdir) -lgcc
126 %.srec: %
127 $(OBJCOPY) -O srec $< $@ 2>/dev/null
128 
129 %.bin: %
130 $(OBJCOPY) -O binary $< $@ 2>/dev/null
把126行和129行改为:
%.srec: %.o
%.bin: %.o
继续make
在make的过程中,出现:
isystem /usr/local/arm/bin/../lib/gcc-lib/arm-linux/3.2/include -pipe -DCONFIG_ARM -D__ARM__ -march=armv4 -mtune=arm7tdmi -msoft-float -mabi=apcs-gnu -Uarm -Wall -Wstrict-prototypes -c -o hello_world.o hello_world.c
cc1: invalid option `abi=apcs-gnu'
有如下的解决方法:
出错的文件是/cpu/s3c44b0/下的config.mk:将
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
改成:
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu),)
继续make,顺利make出u-boot.bin、u-boot、u-boot.srec

u-boot.bin是不带调制信息的二进制文件
u-boot.bin是包含调制信息的elf文件,也是本方案要使用的文件
u-boot.srec好像是moto的一种文件格式,just forget it
三、仿真前准备工作
创建仿真工作目录
代码:
kanson@kanson:~/.../u-boot-1.1.4$ mkdir skyeye
kanson@kanson:~/.../u-boot-1.1.4$ cd skyeye

创建skyeye配置文件skyeye.conf
代码:
kanson@kanson:~/.../skyeye$ vi skyeye.conf

内容如下:
代码:
#skyeye config file sample
cpu:arm920t
mach:s3c2410x
#all peripherals I/O mapping area
mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000
mem_bank: map=I, type=RW, addr=0x19000300, size=0x00000020
#physical memory
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00080000, file=./u-boot, boot=yes
mem_bank: map=M, type=RW, addr=0x30000000, size=0x04000000

load_addr:base=0x30000000, mask=0xFFFFFF


将u-boot文件拷入skyeye文件夹,执行如下命令
代码:
kanson@kanson:~/.../skyeye$ skyeye

输出内容如下:
代码:
**************************** WARNING ********************************** 
If you want to run ELF image, you should use -e option to indicate 
your elf-format image filename. Or you only want to run binary image, 
you need to set the filename of the image and its entry in skyeye.conf. 
*********************************************************************** 

Your elf file is little endian. 
arch: arm 
cpu info: armv4, arm920t, 41009200, ff00fff0, 2 
mach info: name s3c2410x, mach_init addr 0x806c5c0 
Your elf file will be load to: base address=0x30000000,mask=0xffffff 
uart_mod:0, desc_in:, desc_out:, converter: 
SKYEYE: use arm920t mmu ops 
Loaded RAM   ./u-boot 
ERROR: s3c2410x_io_write_word(0x4c000000) = 0x00ffffff 
ERROR: s3c2410x_io_write_word(0x4c000008) = 0x00048032 


U-Boot 1.1.4 (Oct 27 2008 - 11:34:51) 

U-Boot code: 33F80000 -> 33F9873C  BSS: -> 33F9C814 
RAM Configuration: 
Bank #0: 30000000 64 MB 
Flash: 512 kB 
*** Warning - bad CRC, using default environment 

In:    serial 
Out:   serial 
Err:   serial 
ERROR: s3c2410x_io_write_word(0x1900030a) = 0x00000000 
SMDK2410 #


表明编译生成的u-boot文件可用,CTRL+C退出skyeye,重新执行如下命令进入skyeye的debug模式
代码:
kanson@kanson:~/.../skyeye$ skyeye -d

输出内容如下:
代码:
**************************** WARNING ********************************** 
If you want to run ELF image, you should use -e option to indicate 
your elf-format image filename. Or you only want to run binary image, 
you need to set the filename of the image and its entry in skyeye.conf. 
*********************************************************************** 

Your elf file is little endian. 
arch: arm 
cpu info: armv4, arm920t, 41009200, ff00fff0, 2 
mach info: name s3c2410x, mach_init addr 0x806c5c0 
Your elf file will be load to: base address=0x30000000,mask=0xffffff 
uart_mod:0, desc_in:, desc_out:, converter: 
SKYEYE: use arm920t mmu ops 
Loaded RAM   ./u-boot 
debugmode= 1, filename = skyeye.conf, server TCP port is 12345


表明skyeye已经进入debug模式等待host端进行连接

再打开一个shell,运行arm-linux-insight(前提是已经安装好了arm-linux-gdb、arm-linux-insight)
代码:
kanson@kanson:~/.../skyeye$ arm-linux-insight u-boot

打开arm-linux-insight,在File-->Target Settings中的设置为
代码:
Connection
Target: Remote/TCP
Hostname:为空
Port:12345

关闭对话框,连接目标板『Run-->Connect to target』,提示连接成功后即可进行单步调试了,
好像不能调试汇编文件(start.S),不知道什么原因,有高手知道为什么麻烦告诉我一下,但可以直接在board.c文件中的start_armboot函数上加断点

这篇关于ubuntu下使用skyeye对u-boot进行源码级调试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/153936

相关文章

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H