编译测试:

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. (转载)ubuntu创建新用户并增加管…

    问题导读: 1.adduser与useradd有什么区别? 2.那种方式会自动创建组.用户组等信息? 3.如何新建用户具有管理员权限? $是普通管员,#是系统管理员,在Ubuntu下,root用户默认 ...

  2. 创建Git版本库

    什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史,或 ...

  3. linux 自动备份数据库

    首先在你的项目合适的地方建立一个执行备份数据库的脚本 下面我建立一个叫 mysqlBackups.sh 的脚本内人如下: #!/bin/sh # Database info DB_NAME=" ...

  4. 案例:Standby RAC遭遇ORA-1157,1111,1110导致实例crash处理

    案例:Standby RAC遭遇ORA-1157,1111,1110导致实例crash处理 环境:RHEL 6.5 + Oracle RAC 11.2.0.4 + Dataguard 今天在实验环境的 ...

  5. 从入门到放弃,.net构建博客系统(二):依赖注入

    文章目录:<从入门到放弃,.net构建博客系统> 从入门到放弃,.net构建博客系统(一):系统构建 从入门到放弃,.net构建博客系统(二):依赖注入 上一篇中有讲到项目启动时会进行io ...

  6. 安卓Service完全解析(中)

    摘要: 版权声明:本文出自汪磊的博客,转载请务必注明出处. 在上一篇中我们学习了Android Service相关的许多基础但是重要的内容,基本涵盖大部分平日里的开发工作.今天我们继续学习一下稍微高级 ...

  7. linux 编译安装详解

    相信大家大多都听过linux 的编译安装,但它到底是怎么把源代码变为自己电脑里可以应用的软件哪?今天,小编就以httpd 为例详细讲解一下. 什么是编译安装--编译:将源代码变为机器可执行的代码文件. ...

  8. shell编程之数组

    bash 编程只支持一维数组,不支持多维,类似c语言,数组下标从0开始,下标可以是整数,也可以是表达式 数组的定义 在shell中用括号来表示数组,中间用空格来隔开 主要有两种种定义形式: arr=( ...

  9. HTML-CSS相关(2)

    [CSS常用文本属性] 1,字体.字号类: ① font-weight:字体粗细. bold-加粗 noemal-正常 lighter-细体 也可以使用100-900数值,400表示normal,70 ...

  10. 一步步学习操作系统(2)——在STM32上实现一个可动态加载kernel的"my-boot"

    如果要做嵌入式Linux,我们首先要在板子上烧写的往往不是kernel,而是u-boot,这时需要烧写工具帮忙.当u-boot烧写成功后,我们就可以用u-boot附带的网络功能来烧写kernel了.每 ...