编译测试:

1.将写好的uboot复制到linux下面

2.make编译,然后将错误的地方修改,生成boot.bin

(编译出错的解决方案:http://www.cnblogs.com/lifexy/p/7326172.html)

3.通过make生成的反汇编来查看代码是否正确

4.通过oflash烧写到板子nand flash上

5.查看串口是否数据打印 

发现串口无数据,发现两处错误:

5.1在init.C中define定义 没有加大括号,没有定义volatile型


例如:

#define NFCONF       *((unsigned long *)0x4E000000)

需要改为: #define NFCONF      (*((volatile unsigned long *)0x4E000000) )


5.2 在init.C中nand_read_addr()函数出错,代码如下:

void nand_read_addr(unsigned int addr)
{
volatile int i;
NFADDR=( addr>>)&0xff; //A7~A0
for(i=;i<;i++);
NFADDR=( addr>>)&0x0f; //A11~A8
for(i=;i<;i++);
NFADDR=( addr>>)&0xff; //A19~A12
for(i=;i<;i++); NFADDR=( addr>>)&0xff; //A27~A20
for(i=;i<;i++); NFADDR=( addr>>)&0xff; //A28
for(i=;i<;i++);
}

上面之所以错是因为nand flash是2048B一页,这里的写的一页是A11~A0,其值=4096,已经属于两页大小了

应该改为:

void nand_read_addr(unsigned int addr)
{
unsigned int col = addr % ;
unsigned int page = addr / ;
volatile int i;
NFADDR=(col>>)&0xff; //A7~A0
for(i=;i<;i++);
NFADDR=(col>>)&0x0f; //A10~A8
for(i=;i<;i++);
NFADDR=(page>>)&0xff; //A18~A11
for(i=;i<;i++);
NFADDR=(page>>)&0xff; //A26~A19
for(i=;i<;i++);
NFADDR=(page>>)&0xff; //A27
for(i=;i<;i++);
}

优化改进(加快内核启动时间)

1 提高CPU频率

将CPU频率设为最大值400MHZ(内核启动时间7S变为6S,因为HCLK和PCLK频率没有改变)

然后分频系数FCLK:HCLK:PCLK需要设置为1:4:8

因为HCLK最高133MHZ,这里需要设置为100MHZ

PCLK最高50MHZ,这里需要设置为50HZ

如下图所示,得出 CLKDIVN寄存器需要等于0X5即可

通过下图看出,提高CPU频率需要设置MPLLCON中MDIV、PDIV、SDIV

通过下图得出,取400MHZ时,设置MDIV为0X5C,PDIV为0x1,SDIV为0x1

所以改进代码如下:

#define S3C2440_MPLL_400MHZ     ((0x5c<<12)|(0x01<<4)|(0x01))  //设置FCLK=400MHZ
/* 2.设置时钟(必须设为异步总线模式) */
ldr r0,=CLKDIVN
mov r1,# /*FCLK:HCLK:PCLK=1:4:8*/
str r1,[r0]
mrc p15, , r1, c1, c0 /* 读出控制寄存器 */
orr r1, r1, #0xc0000000 /* 设置为“asynchronous bus mode” */
mcr p15, , r1, c1, c0, /* 写入控制寄存器 */ ldr r0,=MPLLCON
ldr r1,= S3C2440_MPLL_400MHZ //使用复杂的数不能用mov,需要用ldr
str r1,[r0]
2.开启ICAHE(内核启动时间6S变为1.5S)
CAHE介绍:

通过高速缓存存储器来加快对内存的数据访问,在CAHE中有ICAHE(指令缓存)和DCAHE(数据缓存)
ICAHE: 指令缓存,用来存放执行这些数据的指令
DCAHE:用来存放数据,需要开启MMU才能开启DCAHE
在没开启ICAHE之前,CPU读取SDRAM地址数据时,每次都需要先访问一次地址值,在读数据.
当开了ICAHE后,第一次读取SDRAM地址数据时,ICAHE发现缓存里没有这个地址数据,然后将SDRAM中需要读取的那部分一大块内存数据都复制在缓存中,后面陆续读取数据就不会再访问SDRAM了,直到CPU没有找到地址数据后ICAHE再从SDRAM中重新复制 

通过CP15协处理器来开启ICAHE

(CP15协处理器操作用法:  http://www.cnblogs.com/lifexy/p/7203786.html)

从上面链接中可以找到ICAHE控制位在CP15的寄存器C1中位12(如下图), 然后通过MRS和MSR向该位12置1,开启ICAHE

所以代码如下(放在SDRAM初始化之前)

   mrc p15, , r0, c1, c0,                      //将 CP15 的寄存器 C1 的值读到 r0 中
orr r0, r0, #(<<) //将r0中位12置1
mcr p15,, r0,c1,c0, //开启ICAHE

第2阶段——编写uboot之编译测试以及改进(3)的更多相关文章

  1. 第2阶段——编写uboot之硬件初始化和制作链接脚本lds(1)

    目标: 1.关看门狗 2.设置时钟 3.初始化SDRAM (初始化寄存器以及清除bss段) 4.重定位 (将nand/nor中代码COPY到链接地址上,需要初始化nandflash,读flash) 5 ...

  2. 第2阶段——编写uboot之启动内核和制作Makefile(2)

    目标: 1   添加头文件setup.h和serial.h 2   写main函数   2.1 帮内核设置串口0, (内核启动会打印出启动信息) 2.2把内核读入到SDRAM 2.3设置参数(参考u- ...

  3. Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码

    Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本文主要是记录一写我在学习MapReduce时的一些 ...

  4. mvn编写主代码与测试代码

    maven编写主代码与测试代码 3.2 编写主代码 项目主代码和测试代码不同,项目的主代码会被打包到最终的构件中(比如jar),而测试代码只在运行测试时用到,不会被打包.默认情况下,Maven假设项目 ...

  5. (五)u-boot2013.01.01 for TQ210:《移植前的准备及u-boot初编译》

    移植前的准备 移植前,要做的事情是搭建开发环境以及对U-boot源码的获取.首先说一下开发环境: 1.此次U-boot移植的硬件平台是天嵌的TQ210开发板: CPU:板载核心是S5PV210(Cor ...

  6. day111:MoFang:邀请好友流程&生成邀请好友二维码&第三方应用识别二维码&本地编译测试&记录邀请人信息

    目录 1.邀请业务逻辑流程图 2.邀请好友-前端 3.邀请好友-后端接口(生成二维码) 4.前端获取后端生成的二维码 5.前端长按页面,保存图片到相册 6.客户端通过第三方识别微信二维码,服务端提供对 ...

  7. gcc编译的四个阶段:预处理,编译,汇编,链接

    1:gcc编译的四个阶段:预处理,编译,汇编,链接 #vi file.c #gcc -E file.c -o file.i//-E查看且预处理后停止编译,-o生成目标文件,-i表示已预处理 #gcc  ...

  8. 实现如下类之间的继承关系,并编写Music类来测试这些类。

    实现如下类之间的继承关系,并编写Music类来测试这些类. package com.hanqi.test; public class Instrument { //输出弹奏乐器 public void ...

  9. (九)uboot配置编译、源码分析

    一.X210官方uboot配置编译实践1.找到官方移植好的uboot(BSP概念)(1)源头的源代码是uboot官网下载的.这个下载的源代码可能没有你当前使用的开发板的移植,甚至找不到当前开发板使用的 ...

随机推荐

  1. 使用 Router 实现的模块化,如何优雅的回到主页面

    使用 Router 实现的模块化,如何优雅的回到主页面 版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有. 未经允许,不得转载. 一.前言 现在越来越多的 App ...

  2. git中常用的指令

    1.初始化仓库 git init2.设置用户名与邮箱 git config --global user.name 'name' git config --global user.email 'emai ...

  3. Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求

    Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 >>>>>>>>>>>>>>&g ...

  4. java.lang.NoSuchMethodError:android.content.Context.getDrawable

    今天在开发的时候,这个代码在源码中是可以看到的,但是在android 4.3手机上面会报错,具体错误信息和代码如下: setBackgroundDrawable(context.getDrawable ...

  5. 准备 macvlan 环境 - 每天5分钟玩转 Docker 容器技术(54)

    除了 overlay,docker 还开发了另一个支持跨主机容器网络的 driver:macvlan. macvlan 本身是 linxu kernel 模块,其功能是允许在同一个物理网卡上配置多个 ...

  6. Vue过渡效果之CSS过渡

    前面的话 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果.本文将从CSS过渡transition.CSS动画animation及配合使用第三方CSS动画库(如animate. ...

  7. shell /bin/bash^M: bad interpreter错误解决

      错误原因之一很有可能是你的脚本文件是DOS格式的, 即每一行的行尾以\r\n来标识, 其ASCII码分别是0x0D, 0x0A.可以有很多种办法看这个文件是DOS格式的还是UNIX格式的, 还是M ...

  8. C/C++ 知识点---链表操作

    1.单链表单链表的结点类型node定义: typedef struct linknode { int data; struct linknode *node; }node; <1>.建立单 ...

  9. ASP.NET MVC 创建 Area 以及使用

    此博客全乘抄袭,只为以后自己能再次用到 参考链接 http://www.cnblogs.com/willick/p/3331519.html ASP.NET MVC允许使用 Area(区域)来组织We ...

  10. CentOS 7 服务器配置--安装Java和Tomcat

    一 安装 JAVA (jdk_8u121_linux_x64) #查看是否安装了OpenJDK #检查是否安装了JAVA java -version rpm -qa | grep java #卸载已安 ...