37.调试---裸板调试
jtag
JTAG的调试原理_代码就是生产力!-CSDN博客_jtag调试原理
arm裸板驱动总结(makefile+lds链接脚本+裸板调试) - 诺谦 - 博客园
opencd
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选项)