先说一个事:我会在最后把移植好的uboot,内核,分别做一个补丁文件,以后如果用到相同的uboot以及内核都可以直接下载我这个补丁进行打补丁操作就可以直接用~

上一个移植uboot续集,我们解决了无法写flash的问题,现在该去测试norflash写功能的完整性!
在串口中依次输入:
md.b 30000000
md.b 80000
mw.b 30000000 12345678
erase 80000 8ffff
cp.b 30000000 80000 10000
md.b 80000
md.b 30000000
cmp.b 30000000 80000 10000 (比较内容是否一样)显示如下:

内存和flash里的内容不一样,这是怎么回事呢?再试验一下把内存另一个地址的内容拷贝到flash(80000~90000地址之间)中:
erase 80000 8ffff
cp.b 32000000 80000 10000
cmp.b 32000000 80000 10000 显示如下:

很奇怪,这里又显示两个地方的内容是一样的!!!
经过分析内存的分布以及启动的流程,发现是在uboot启动过程调用第二阶段代码没有重新设置栈(具体过程就不分析,需要了解uboot的启动流程,以后讲解),下面直接给出解决办法:
在start.s中需要重新设置栈:
在调用第二阶段代码之前重新设置栈,加上这一句:ldr sp, base_sp /* 重新设置栈lyy */如下:

/* unsigned int的值存在r0里,正好给board_init_r */
    ldr r1, _TEXT_BASE
    ldr sp, base_sp             /* 重新设置栈lyy */

    /* 调用第二阶段的代码 */
    bl  board_init_r

在上面与下面代码类似的地方加上下面的代码:

/*lyy*/

.globl base_sp
base_sp:
    .long 0

在board.c中的board_init_f函数里最后加上:

base_sp = addr_sp; /*lyy*/

在board_init_f函数里最前面加上

extern ulong base_sp;  /*lyy*/

然后重新烧写编译启动测试:

成功了,完美!!!
哈哈哈!!!终于搞定了这个BUG。开心~

想获得各种学习资源以及交流学习的加我:
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题