bootloader---18.加速读取过程
2016-08-29 13:58
176 查看
1. 虽然现在可以引导内核了,但是读取内核(2M)时间太长,大约需要17-18秒,这样算下来1s才能读取100多K,这太不合理了!所以首先想到的是nand flash的读取函数有问题,查了半天没有查出问题。那么既然nand flash 读取数据没有问题,那么是不是传输的某个阶段有问题了呢?从这个思路入手,噢,发现原来是cache没有打开。
2. main.c 开启icache 与 dcache
点击(此处)折叠或打开
#include "uart.h"
#include "nand.h"
#define C1_IC (1<<12) /* icache
off/on */
#define C1_DC (1<<2) /* dcache
off/on */
/* read co-processor 15, register
#1 (control register) */
static unsigned long read_p15_c1 (void)
{
unsigned long value;
__asm__ __volatile__(
"mrc p15, 0, %0, c1, c0, 0 @ read control reg\n"
: "=r" (value)
:
: "memory");
return value;
}
/* write to co-processor
15, register #1 (control register) */
static void write_p15_c1 (unsigned long value)
{
__asm__ __volatile__(
"mcr p15, 0, %0, c1, c0, 0 @ write it back\n"
:
: "r" (value)
: "memory");
read_p15_c1 ();
}
static void cp_delay (void)
{
volatile int i;
/* copro seems to need some delay between reading and writing */
for (i = 0; i < 100; i++);
}
/* It makes no sense to use the dcache if the
MMU is not enabled */
void dcache_enable (void)
{
unsigned long reg;
reg = read_p15_c1 ();
cp_delay ();
write_p15_c1 (reg | C1_DC);
}
void icache_enable (void)
{
unsigned long reg;
reg = read_p15_c1 (); /* get control
reg. */
cp_delay ();
write_p15_c1 (reg | C1_IC);
}
extern int boot_zImage(unsigned long from, unsigned long size);
void main(void)
{
uart_init(); //初始化串口
nand_init();
icache_enable();
dcache_enable();
uart_printf("now boot the kernel\n");
boot_zImage(0x200000, 0x200000);
}
3. 烧到板子上发现,现在读取速度有提升,读取内核(2M)的时间由原来的17-18秒,减少到3-4秒。把这个bootloader与烧录的bootloader相比,还是有差距。烧录的bootloader跟本不需要等,刷一下子就进入内核引导了!这怎么可能?该初始化的都初始化了,该enable的都enable了。难道还有什么猫腻?查啊查,查啊查,始终查不出什么问题来。偶然发现自带的bootloader里面有优化选项 -Os,而我自己的没有打开任何的优化选项,默认是-O0.
4. 将Makefile 加入 OPTFLAGS= -Os,试一下,也是刷一下子进入内核引导了。
5. 问题己经解决,但是-Os与-OO对nandflash的读取速度影响怎么会这么大呢?有时间研究一下。
myboot_loader_mod.rar
(将后缀rar改为tar.gz)
2. main.c 开启icache 与 dcache
点击(此处)折叠或打开
#include "uart.h"
#include "nand.h"
#define C1_IC (1<<12) /* icache
off/on */
#define C1_DC (1<<2) /* dcache
off/on */
/* read co-processor 15, register
#1 (control register) */
static unsigned long read_p15_c1 (void)
{
unsigned long value;
__asm__ __volatile__(
"mrc p15, 0, %0, c1, c0, 0 @ read control reg\n"
: "=r" (value)
:
: "memory");
return value;
}
/* write to co-processor
15, register #1 (control register) */
static void write_p15_c1 (unsigned long value)
{
__asm__ __volatile__(
"mcr p15, 0, %0, c1, c0, 0 @ write it back\n"
:
: "r" (value)
: "memory");
read_p15_c1 ();
}
static void cp_delay (void)
{
volatile int i;
/* copro seems to need some delay between reading and writing */
for (i = 0; i < 100; i++);
}
/* It makes no sense to use the dcache if the
MMU is not enabled */
void dcache_enable (void)
{
unsigned long reg;
reg = read_p15_c1 ();
cp_delay ();
write_p15_c1 (reg | C1_DC);
}
void icache_enable (void)
{
unsigned long reg;
reg = read_p15_c1 (); /* get control
reg. */
cp_delay ();
write_p15_c1 (reg | C1_IC);
}
extern int boot_zImage(unsigned long from, unsigned long size);
void main(void)
{
uart_init(); //初始化串口
nand_init();
icache_enable();
dcache_enable();
uart_printf("now boot the kernel\n");
boot_zImage(0x200000, 0x200000);
}
3. 烧到板子上发现,现在读取速度有提升,读取内核(2M)的时间由原来的17-18秒,减少到3-4秒。把这个bootloader与烧录的bootloader相比,还是有差距。烧录的bootloader跟本不需要等,刷一下子就进入内核引导了!这怎么可能?该初始化的都初始化了,该enable的都enable了。难道还有什么猫腻?查啊查,查啊查,始终查不出什么问题来。偶然发现自带的bootloader里面有优化选项 -Os,而我自己的没有打开任何的优化选项,默认是-O0.
4. 将Makefile 加入 OPTFLAGS= -Os,试一下,也是刷一下子进入内核引导了。
5. 问题己经解决,但是-Os与-OO对nandflash的读取速度影响怎么会这么大呢?有时间研究一下。
myboot_loader_mod.rar
(将后缀rar改为tar.gz)
相关文章推荐
- TQ2440裸板学习笔记10--加速读取过程
- 18、Bootloader(2)--Bootloader与内核的交互,或者说传参
- bootloader 从开发板上电到main()函数执行之间的过程
- How to make brew faster 使用mirror 加速brew的安装过程
- Scala深入浅出实战经典:18,Scala中文件的读取、写入、控制台输入操作代码实战
- bootloader---14.nand flash 读取bootloader
- Oracle Enterprise Linux 6 安装报错及安装过程中文件读取流水
- caffe学习笔记18-image1000test200数据集分类与检索完整过程
- win7上R读取excel过程
- seq_file文件的内核读取过程
- A10/A20 Bootloader加载过程分析
- Linux系统引导过程(BIOS和Bootloader部分)
- linphone在android中,怎么读取音频之探索过程!终于找到它是怎么读声音的!
- 嵌入式系统的BootLoader技术浅析_启动过程
- STM32实现BootLoader过程
- Chromium硬件加速渲染的OpenGL命令执行过程分析
- 处理 input 上传图片,浏览器读取图片大小过程中遇到到的坑(兼容IE8\9)
- Android Studio加速构建过程的方法
- Windows读取文本文件后的显示过程
- ADFS部署过程中设置network service对证书的读取权限