37.调试---裸板调试

jtag

JTAG的调试原理_代码就是生产力!-CSDN博客_jtag调试原理

arm裸板驱动总结(makefile+lds链接脚本+裸板调试) - 诺谦 - 博客园

opencd

跟我一起学OpenOCD(一) - 知乎

OpenOCD的调试_子曰小玖的博客-CSDN博客_openocd 命令

gdb:

LINUX下GDB的使用方法(简单说说)_longfan的博客-CSDN博客_gdb
一.点亮LCD

配置好硬件让LED闪烁,在需要看现象的地方插入LED闪烁的语句

二.串口打印

通过寄存器来初始化串口,裸板下注意cpu时钟,可能还没设置时钟以达到高速,所以需要设置好匹配的波特率。

使用位置无关码初始化串口,在需要打印的地方根据需要插入下面的打印函数,调用时还是使用位置无关码。字符串S不能太过复杂,否则会把S放入只读数据段先先保存,但sdram可能还没有初始化,只读数据段里都是乱码。

/*
 * 发送一个字符
 */
void putc(unsigned char c)
{
    /* 等待,直到发送缓冲区中的数据已经全部发送出去 */
    while (!(UTRSTAT0 & TXD0READY));
    
    /* 
        向UTXH0寄存器中写入数据,UART即自动将它发送出去 
        串口的机制,往FIFO写,自动发送
    */
    UTXH0 = c;
}

void puts(char *s)
{
	int i = 0;
	while (s[i])
	{
		putc(s[i]);
		i++;
	}
}

void puthex(unsigned long val)
{
	/* val = 0x1234ABCD */
	unsigned char c;
	int i = 0;
	
	putc('0');
	putc('x');

	for (i = 0; i < 8; i++)
	{
        /*
        右移只提取一位数,如0x12345678-->0x00000001
        c是字符型数值,数值是它的ASCII码
        */
		c = (val >> ((7-i)*4)) & 0xf; 
		if ((c >= 0) && (c <= 9))
		{
			c = '0' + c;
		}
		else if ((c >= 0xA) && (c <= 0xF))
		{
            /*A到F的ascii是连续的*/
			c = 'A' + (c -  0xA);
		}
		putc(c);
	}

三.JTAG

JTAG位于CPU内部,当CPU收发引脚上的数据时,都会通过JTAG单元.使用JTAG可以实现程序调试

JTAG可以控制cpu,设置硬件断点(有限个)和软件断点(无数个)

JTAG可以访问外设寄存器,自然可以把程序下载到内存里

使用的控制软件是openocd

JTAG需要配合反汇编

四。gdb可以进行源码级别的调试

知道调试有这么一个工具就好,使用时看手册

使用gdb的前提
a. 程序必须已经重定位好,位于它的链接地址
a.1 如果程序的链接地址是SDRAM, 使用openocd初始化SDRAM
a.2 使用arm-linux-gdb/arm-elf-gdb下载程序

b. 链接脚本必须把text,rodata,data,bss等分开存放
c. 被调试的程序为ELF格式,内含调试信息(即编译时有-g选项)