学习ARM开发(10)

/* 用循环调用所有初始化函数 */
        for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr)
        {
                if ((*init_fnc_ptr)() != 0)
                {
                        /* 当每个函数初始化失败时,就会挂机在这里。 */
                        hang();
                }
        }
上次说到在函数指针数组里,不断地调用所有初始化函数进行初始化,下面就来仔细地分析一下,它们到底是做什么的,做什么样的初始化,怎么样为后面做好运行的准备工作。看到第一个初始化函数,就是CPU初始化(cpu_init),这个函数是在cpu/s3c44b0/cpu.c里,它的作用就是进行S3C44B0初始化工作。看到这个函数内容如下:
/*
CPU初始化。
蔡军生 2005/07/23
*/
int cpu_init (void)
{
        /* 清空缓冲区 */
        icache_enable();

return 0;
}

它在里面调用了函数icache_enable(),它就是用来初始化S3C44B0的缓冲区,并且启用CPU缓冲区。因为CPU在加电之后,它的初始化值是不启用内部的8K缓冲区的,必须由程序进行设置。接着看看那个调用的函数又是怎么样初始化内部缓存区的呢?
/*
CPU内存的缓冲初始化。
蔡军生 2005/07/23
*/
void icache_enable (void)
{
        ulong reg;

/* 清空内存的缓冲区.  */
        s3c44b0_flush_cache();

/*
                初始化缓冲区,
                设置非缓冲区的起始地址和结束地址。
                第一个寄存器指明下面的地址不要缓存,低16位是起始地址,
                高16位是结束地址。并且空间大小都是以4K为界。
                0x0000:0000 - 0x0C00:0000
         */
        NCACHBE0 = 0xC0000000;
        NCACHBE1 = 0x00000000;

/*
                设置SYSCFG寄存器启用8K缓冲区。
        */
        reg = SYSCFG;
        reg |= 0x00000006; /* 8kB */
        SYSCFG = reg;
}

在这个函数里,第一个先调用函数是进行缓冲区清0的工作,它有一些特别的地方,如下:
/*
CPU的内部缓冲初始化。
蔡军生 2005/07/23
*/
static void s3c44b0_flush_cache(void)
{
        volatile int i;
        /* 清空缓冲区,每次要按4个32位来读写,所以要加16. */
        for( i = 0x10002000; i < 0x10004800; i += 16 )
        {
                *((int *)i)=0x0;
        }
}

它用一个for循环进行内部的缓冲区初始化,由于S3C44B0决定每次读写都是按16字节进行的。因此,这里的i就是不断地加16个字节。不过,这里为什么不清除0x10000000到0x10001fff区域呢?这个我也没有搞清楚,等我有空试试清除有没有问题!
到现在为止,缓冲区已经清空,就要设置那些内存区域是不要进行缓存的。因为不是所有内存都需要进行缓冲的,比如读取外面的IO,就不需要进行缓冲;读取FLASH也不需要。因此,设置第一个非缓冲区的起始地址为NCACHBE0 = 0xC0000000,这个值里的低16位是起始地址0x0000,它的32位地址就是从0x00000000开始。它的高16位是结束地址0Xc000,它的32位地址就是从0Xc0000000结束。最后就是通过设置SYSCFG寄存器的[2:1]位的值为11,就启用了8K内存数据和指令缓冲区。到这里为止,就已经设置好CPU的缓冲区初始化和启用。


让我们的产品超越日本产品!

学习ARM开发(10)相关推荐

  1. 学习ARM开发(3)

    学习ARM开发(3)上一次说到装好LINUX后,就要装开发环境了,因为编译在LINUX下,当然是用GCC,但这个GCC跟LINUX本身带的又不一样.目标代码是ARM,而LINUX带的,一般是I386的 ...

  2. 学习ARM开发01-09

    /***********************************  *作者:蔡军生  *出处:http://blog.csdn.net/caimouse/  ***************** ...

  3. 学习ARM开发(11)

    学习ARM开发(11) 昨天又是星期天,在家里又可以对那块开发板进行软件研究了. 由于前几次,把编译好的UBOOT写到FLASH老是运行不了.那么怎么办呢?思考了很久,也查看 了源程序,还是没有发现问 ...

  4. 学习ARM开发(4)

    学习ARM开发(4) 已经把CPU大体架构学会了,当然我之前已经学习过80X86的结构,所以对于像RISC的计算机,也能想像到它是什么样的东西.如果没有学习过<微机原理>,那最好去看看,或 ...

  5. 学习ARM开发(2)

    学习ARM开发(2) 今天是星期天,刚好在家里休息.又是学习ARM的大好时机了. 早上起得很早,因为都想着怎么样搞好这个ARM开发环境,总是心急的.搞得睡觉,也睡不好.立即把电脑打开,为了更加快点,把 ...

  6. 学习ARM开发(6)

    学习ARM开发(6) 上一次,说到要学习ARM汇编,好,现在就开始.目前我的引导程序是在UBOOT1.1.2上修改过来的,大家可以下载UBOOT的源程序,也许你们会问在那里有下呢?这个问题不用我回答了 ...

  7. 学习ARM开发(1)

    #1  学习ARM开发(1) 做任何事情之前,一定要想好目标.没有目标的事情是做不好的,也做不成.我的目标就是学习ARM开发,当然是深入的学习. 目标如下 : 1.学习ARM开发环境. 2.学习ARM ...

  8. 博通Broadcom SDK源码学习与开发10——Cable Modem IPv6地址

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 1. 相关 ...

  9. 学习ARM开发(15)

    使用GCC来开发ARM,就一定遇到编译器的问题.比如遇到编译C代码各种警告和错误.像我昨天就遇到了几个警告,那么就来看看这几个警告是什么引导的呢? 警告如下: armlib/memory.c: 91 ...

最新文章

  1. div模拟textarea自适应高度
  2. iptables下开放ftp连接端口
  3. 看完源码记不住,是我记性太差了吗?
  4. teechart绘制实时曲线_关于PIII曲线
  5. php伪静态限制网页播放视频,php伪静态后html不能访问怎么办
  6. sql怎么注销当前登录状态_4种方法教你获取Oracle数据库当前会话/进程的session id...
  7. python数据分析案例分析题_7个python案例中的数据思维
  8. WindowsServerAppFabric1.1安装失败、配置失败、1603错误码解决方案
  9. gbox推荐源_分享一批自己用的软件源 gbox软件源
  10. 自制麦克纳姆轮遥控小车
  11. Android 音视频编解码 MediaCodec
  12. js做个随机点名的小游戏
  13. 如何注册公司邮箱?公司邮箱邮件这样写98%的人都爱看
  14. DSS 启动关闭脚本
  15. 十年内将被人遗忘的15种技术:硬盘和鼠标
  16. 尤雨溪:Vue3.0 官宣彻底抛弃 IE 浏览器
  17. 第五届蓝桥杯C/C++本科B组(真题试做)(1~5)
  18. Python的数据分析可视化十种技能总结
  19. springmvc临时不使用视图解析器的自动添加前后缀
  20. 腾讯视频网页版无法打开的问题

热门文章

  1. padStart与padEnd方法
  2. OFDMA正交频分技术
  3. Transfomer详解
  4. Windows Shellcode开发[2]
  5. OPC (OLE for Process Control)
  6. 《计算机操作系统(计算机)》
  7. SQL——基础语句练习
  8. 健康大数据管理与服务类毕业论文文献都有哪些?
  9. WSUS服务器不能下载补丁的最终解决办法
  10. 荣耀十连续点击android版本9,华为荣耀V10开发者选项如何设置