uboot移植到Keil(mdk-arm)笔记



--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
}


  uboot移植到Keil(mdk-arm)笔记_第1张图片


定义__ARM__ __KERNEL__,增加--gnu命令行参数,支持gnu编译器的扩展


  uboot移植到Keil(mdk-arm)笔记_第2张图片


增加--no_remove定义,不删除没有被引用的代码,
如.u_boot_cmd section中的数组和do_开头的函数

uboot移植到Keil(mdk-arm)笔记_第3张图片
生成bin文件


 

















你可能感兴趣的:(汇编,image,command,cmd,嵌入式,import)