用的是uboot2010.6版本 运行到start_armboot里的memset就不运行了 我在arch/arm/cpu/arm920t/u-boot.lds加入(否则调不到lowlevel_init.s)
.text :
{
arch/arm/cpu/arm920t/start.o (.text)
board/samsung/smdk2410/lowlevel_init.o (.text)
arch/arm/lib/board.o (.text)
board/samsung/smdk2410/smdk2410.o (.text)
arch/arm/cpu/arm920t/s3c24x0/timer.o (.text)
...
用nm看了编译好的uboot可执行文件 memset里面有调用的位置也对应该是从flash到ram过程中出错了 这个问题有时出现有时就没有
代码
void start_armboot (void)
{
init_fnc_t **init_fnc_ptr;
char *s;
#if defined(CONFIG_VFD) || defined(CONFIG_LCD)
unsigned long addr;
#endif
/* Pointer is writable since we allocated a register for it */
gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t));
/* compiler optimization barrier needed for GCC >= 3.4 */
__asm__ __volatile__("": : :"memory");
memset ((void*)gd, 0, sizeof (gd_t));
//while(1);
gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
memset (gd->bd, 0, sizeof (bd_t));
------解决方案--------------------
唉,objdump反编译看看,注意ldr加载的值是否可访问……
如果片上有mmu的,要注意当前mmu是开是关,关的话高于物理地址的ldr都会直接死掉……
我编译的uboot直接tftp到板上运行,也是到board_init_f走不动。反编译后发现有几个ldr访问的地址是0xc开头的……妮妹的start.S一开始就关了MMU,这还不直接死掉,无法调试,搞了大半天才发现……