--luoqindong 2012-02-12
要用mdk-4.21来编译调试,用mdk-4.22调试不能设置断点
修改u-boot的连接文件u-boot.lds
u-boot.sct:
Load_region 0x33d00000 {
E_RO 0x33d00000 {
*(start +First)
.ANY (+RO )
}
E_RW +0 {
.ANY (+RW)
}
E_UBOOT_CMD +0 {
*(.u_boot_cmd)
}
E_ZI +0{
.ANY (+ZI)
}
}
分为3个region
E_RO 为code,E_RW为data,E_UBOOT_CMD存放uboot command数组,E_ZI为bss
修改start.S文件
因为mdk不像gcc能包含.h文件,所以start.S用到的config.h文件中的定义要copy到start.S中用equ重新定义
CONFIG_S3C2440
equ
1
CONFIG_TQ2440
equ
1
CONFIG_S3C2400
equ
0
CONFIG_S3C2410
equ
0
CONFIG_USE_IRQ
equ
0
CONFIG_SKIP_LOWLEVEL_INIT
equ
0
CONFIG_SKIP_RELOCATE_UBOOT
equ
0
; must be same as in tq2440.h
CFG_MALLOC_LEN
equ
0x30000
CFG_GBL_DATA_SIZE
equ
128
;/* 128 bytes for initial data */
CONFIG_STACKSIZE
equ
(32*1024)
;/* regular stack */
TEXT_BASE
equ
0x33d00000
重新定义:
import ||Image$$E_ZI$$ZI$$Base||
import ||Image$$E_ZI$$ZI$$Limit||
_bss_start
dcd
||Image$$E_ZI$$ZI$$Base||
_bss_end
dcd ||Image$$E_ZI$$ZI$$Limit||
cpu_init_crit中有一个调用lowlevel_init的语句:
bl
lowlevel_init
lowlevel_init是初始化sdram的,因为用keil调试的时候,keil已经用ini脚本文件初始化过sdram
然后再将u-boot的调试文件加载到sdram,所以用keil调试uboot的时候,不需要再次初始化sdram,
如果再次初始化sdram会导致sdram中的内容改变,导致不能调试。
start.S中其他的地方如#if和带有":"的标号也要修改,因为mdk的汇编支持的条件汇编是IF ELSE ENDIF,
支持的标号不带":"号。
修改lib_arm/board.c中的
static
void mem_malloc_init (ulong dest_addr)
{
mem_malloc_start = dest_addr;
mem_malloc_end = dest_addr + CFG_MALLOC_LEN;
//mem_malloc_brk = mem_malloc_start;
memset ((void *) mem_malloc_start, 0,
mem_malloc_end - mem_malloc_start);
_init_alloc(mem_malloc_start,mem_malloc_end);
}
unsigned __rt_heap_extend(unsigned size, void **block)
{
return 0;
}
malloc需要用_init_alloc初始化和重新定义__rt_heap_extend,
在
RealView Libraries and Floating Point Support Guid->The C and C++ Libraries->Tailoring storage management->Support for malloc
中有说明
重新定义global_data.h文件中的:
//#define DECLARE_GLOBAL_DATA_PTR __global_reg(5) gd_t *gd;
#define DECLARE_GLOBAL_DATA_PTR extern gd_t *gd;
因为度过将gd指针用__global_reg(5) 放在r8中,后面通过反汇编调试发现
r8有时候会被保存到stack中,然后r8中的内容被修改,而后面的代码又需要
用到gd指针。
将include/asm/system.h及其他地方的嵌入式汇编改成mdk下的嵌入式汇编
如mdk下的嵌入式汇编:
__asm
{
mrs
tmp, cpsr
bic
tmp, tmp, #128
msr
cpsr_c, tmp
}
定义__ARM__ __KERNEL__,增加--gnu命令行参数,支持gnu编译器的扩展
增加--no_remove定义,不删除没有被引用的代码,
如.u_boot_cmd section中的数组和do_开头的函数
生成bin文件