树莓派的JTAG口 没有直接调出来。需要用代码控制芯片开启。
http://sysprogs.com/VisualKernel/tutorials/raspberry/jtagsetup/
强烈建议使用arm-none-eabihf-gdb。比树莓派官方提供的要稳定。不会crash。ubuntu下面的下载命令是
sudo apt-get -o Dpkg::Options::="--force-overwrite" install gdb-arm-none-eabi
否则会出问题。
我用树莓派官方的arm-linux-gnueabihf-gdb手工调试可以。用eclipse的zylincdt插件调试uboot2016的时候就crash.之前版本的uboot都可以
可以在uboot中cmd执行的里面写入下面的代码
void SetGPIOFunction(int GPIO, int functionCode)
{
int registerIndex = GPIO / 10;
int bit = (GPIO % 10) * 3;
unsigned* m_pAltFunctionRegisters=0x20000000+0x200000;
unsigned oldValue = m_pAltFunctionRegisters[registerIndex];
unsigned mask = 0b111 << bit;
printf("sizeof(unsigned)=%d m_pAltFunctionRegisters=%p *=%p\n",sizeof(unsigned),m_pAltFunctionRegisters,m_pAltFunctionRegisters[registerIndex]);
printf("Changing function of GPIO%d from %x to %x -->index=%d %x\n", GPIO, (oldValue >> bit) & 0b111, functionCode,registerIndex,((oldValue & ~mask) | ((functionCode << bit) & mask)));
m_pAltFunctionRegisters[registerIndex] = (oldValue & ~mask) | ((functionCode << bit) & mask);
printf("_start_addr________________=%p\n",SetGPIOFunction);
}
#define GPIO_ALT_FUNCTION_4 0b011
#define GPIO_ALT_FUNCTION_5 0b010
void enable_jtag_raspberry()
{
printf("begin enable jtag_raspberry\n");
SetGPIOFunction(22, GPIO_ALT_FUNCTION_4);
SetGPIOFunction(4, GPIO_ALT_FUNCTION_5);
SetGPIOFunction(27, GPIO_ALT_FUNCTION_4);
SetGPIOFunction(25, GPIO_ALT_FUNCTION_4);
SetGPIOFunction(23, GPIO_ALT_FUNCTION_4);
SetGPIOFunction(24, GPIO_ALT_FUNCTION_4);
printf("end enable jtag_raspberry\n");
}
在uboot的main.c的main_loop函数里面的for循环之前执行
enable_jtag_raspberry开启jtag调试
JTAG接线如下
我自己的T板子
T型板
从P7-P2依次是黄 泥 红 绿蓝橙
黑色接3.3灰色接GND
下载JLINK的ubuntu开发包
https://www.segger.com/downloads/jlink
下载使用手册
https://www.segger.com/downloads/jlink/UM08001_JLink.pdf
1 直接使用JLinkExe调试
直接运行./JLinkExe
输入connect 回车。显示输入arm类型。根据你的arm选择类型
我的是arm11
接下来选择调试口。选择J
再输入-1检测JTAG链位置
在输入速度。我选择的是100 KHZ
这样就接上了
接下来输入jlink的指令就可以调试了。
初始的寄存器是这样的
2使用gdb来调试
直接执行服务端 指定调试口为jtag device为arm 11
./JLinkGDBServer -if Jtag -device arm11
可以看到gdb在等待链接。端口为2331
target 为arm11
接下来就是gdb来连接
我这里用的树莓派的gdb
执行./arm-linux-gnueabihf-gdb
然后输入target remote:2331
发现两边都有反应了。gbdserver和gdb
接下来可以在gdb命令行里面开始调试了
除开使用ddb的调试命令。还可以通过monitor来执行 jlink支持的一些命令。
具体命令查看3.3.3
J-Link software and documentation package
Supported remote (monitor) commands
注意zylincdt和eclipse Mars是匹配的。也就是最多支持4.5版本。
3 使用eclipse调试uboot
首先配置eclipse的zylin插件
在eclipse的 help->install new software里面填写插件路径
zylincdt - http://opensource.zylin.com/zylincdt
选择cdt插件。点击下一步安装。
安装时候eclipse会在右下角有进度条,不要中途关闭了。我之前就是没注意这个右下角的进度条。以为没有安装成功。直接关闭重来。装了几次,才发现这个问题。
安装好了以后,会在项目->Debug as->Debug configuration里面看到这个插件
uboot在eclipse里面的配置和编译就不多说了。重点说一下eclipse jlink配置
在Zylin Embedded debug(Natinve)里面邮件新建一个调试选项
Main选项卡里面 Project可选。填写名字
c/c++ Application里面选择需要调试的文件。我们这里选择编译出来的u-boot。也就是uboot elf文件
debugger选项里面
stop on start up at 填写_start。也就是初始中断在在start.S里面
GDB debugger填写树莓派gbd工具的位置
其他留空
在Commads选项卡中填写gbd初始化的命令。
我这里是
target remote localhost:2331
monitor reset
monitor sleep 10
load
break _start
还可以写一些其他的配置命令。
jlink很重要的是speed的控制。如果speed不合适的话很容易出问题。
monitor reset
monitor speed 4000
load
symbol-file
monitor reg cpsr=0xd3
monitor reg pc=0x8000
break *0x8000
(如果没发中断在特定的位置,可能是没有符号表。用readelf查看是否有符号信息,在uboot的makefile编译选项中添加特定的编译指令)
source选项卡内。填写源码搜索目录。也就是uboot的源码目录
点击apply 应用。然后点击debug就开始调试了
eclipse的console里面可以看到前面command的作用
已经断点短再start.s里面了。接下来可以f5 单步。f6步过 等等调试了
想要在某些地方下断点。可以直接双击源码目录的line行号。或者右边反汇编窗口的行号
下断点
下完断点后按F8 resume 执行到断点就会停下来
F5步入
F6步过
除了直接操作eclipse的调试。也可以手工通过输入命令来执行调试。输入的位置在就在console页面下
1调试内核的时候speed 很重要。因为如果speed有问题。cpu可能停不下来。
因此调试内核或者uboot的时候如果cpu停不下来。第一是考虑speed的问题。
第二是考虑代码是不是跑飞了
跑飞了可以通过 暂停 和stop 来操作。
也可以通过monitor halt来操作。
调试uboot的时候使用break xxxx为何无效?
因为uboot对于代码进行了搬移。所以断点还是原来旧的代码地方,还需要到定位的新的地方去bp才行。
这里树莓派调试内核的command是
填写在Zylin Embedded的commands选项里面的是
target remote localhost:2331
monitor reset
monitor sleep 10
monitor speed 4000
monitor reg cpsr=0xd3
load
monitor speed auto
首先设置下载速度是4000KHZ 这样下载内核的时候就快一些。
load以后设置speed为auto。貌似是2000。这样就好调试了
2内核符号很重要。编译内核的时候一定要记得加上DEBUG编译选项。我这里是通过直接修改.config做到的
CONFIG_DEBUG_INFO是最主要的。如果这个配置不打开。eclipse无法找到调试符号,比如文本和行号等等。
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_INFO_REDUCED=n
CONFIG_GDB_SCRIPTS=n
CONFIG_DEBUG_INFO_SPLIT=n
CONFIG_DEBUG_INFO_DWARF4=n