Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2159685
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: LINUX

2012-06-01 16:43:12

1. 虽然现在可以引导内核了,但是读取内核(2M)时间太长,大约需要17-18秒,这样算下来1s才能读取100多K,这太不合理了!所以首先想到的是nand flash的读取函数有问题,查了半天没有查出问题。那么既然nand flash 读取数据没有问题,那么是不是传输的某个阶段有问题了呢?从这个思路入手,噢,发现原来是cache没有打开。
2. main.c 开启icache 与 dcache

点击(此处)折叠或打开

  1. #include "uart.h"
  2. #include "nand.h"

  3. #define C1_IC        (1<<12)        /* icache off/on */
  4. #define C1_DC        (1<<2)        /* dcache off/on */
  5. /* read co-processor 15, register #1 (control register) */
  6. static unsigned long read_p15_c1 (void)
  7. {
  8.     unsigned long value;

  9.     __asm__ __volatile__(
  10.             "mrc    p15, 0, %0, c1, c0, 0 @ read control reg\n"
  11.             : "=r" (value)
  12.             :
  13.             : "memory");
  14.     return value;
  15. }

  16. /* write to co-processor 15, register #1 (control register) */
  17. static void write_p15_c1 (unsigned long value)
  18. {
  19.     __asm__ __volatile__(
  20.             "mcr    p15, 0, %0, c1, c0, 0 @ write it back\n"
  21.             :
  22.             : "r" (value)
  23.             : "memory");

  24.     read_p15_c1 ();
  25. }


  26. static void cp_delay (void)
  27. {
  28.     volatile int i;

  29.     /* copro seems to need some delay between reading and writing */
  30.     for (i = 0; i < 100; i++);
  31. }

  32. /* It makes no sense to use the dcache if the MMU is not enabled */
  33. void dcache_enable (void)
  34. {
  35.     unsigned long reg;

  36.     reg = read_p15_c1 ();
  37.     cp_delay ();
  38.     write_p15_c1 (reg | C1_DC);
  39. }

  40. void icache_enable (void)
  41. {
  42.     unsigned long reg;

  43.     reg = read_p15_c1 ();        /* get control reg. */
  44.     cp_delay ();
  45.     write_p15_c1 (reg | C1_IC);
  46. }


  47. extern int boot_zImage(unsigned long from, unsigned long size);
  48. void main(void)
  49. {
  50.     uart_init();        //初始化串口
  51.     nand_init();

  52.     icache_enable();
  53.     dcache_enable();
  54.     
  55.     uart_printf("now boot the kernel\n");

  56.     boot_zImage(0x200000, 0x200000);
  57. }
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)
阅读(1782) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~