先说一个事:我会在最后把移植好的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_BASEldr 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语言,数据结构等技术问题