学习ARM开发(10)

发布者:BlissfulCharm最新更新时间:2024-11-14 来源: cnblogs关键字:ARM开发 手机看文章 扫描二维码
随时随地手机看文章

/* 用循环调用所有初始化函数 */
        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开发 引用地址:学习ARM开发(10)

上一篇:学习ARM开发(11)
下一篇:学习ARM开发(9)

推荐阅读最新更新时间:2026-03-14 14:20

消息称软银系深化与 OpenAI 合作,Arm 将为后者开发 CPU
10 月 14 日消息,外媒 The Infomation 在最新报告中指出,OpenAI 不仅与博通合作开发定制 AI XPU 也与 Arm 有着定制 CPU 方面的合作,而这是软银系与 OpenAI 深化合作关系的一部分。 Arm 提供的定制 CPU 将同博通提供的 AI XPU 一道为 OpenAI 建立完整的自有芯片堆栈。Arm 有望从中获得数十亿美元的收入,并正式跻身定制 ASIC 解决方案供应商行列。 而在同时,软银承诺对 OpenAI 追加数百亿美元规模的投资并为 OpenAI 的数据中心基建提供资金支持;软银还将从今年起每年从 OpenAI 处购买价值数十亿美元的 AI 技术,其中部分能加速 Arm 的芯片开发周期
[嵌入式]
ARM体系结构_嵌入式概述及开发环境的构建
一、嵌入式介绍 1.什么是嵌入式系统   嵌入式系统(Embedded system),是一种“完全嵌入受控器件内部,为特定应用而设计的专用计算机系统”,它为控制、监视或辅助设备、机器或用于工厂运作的设备。与个人计算机这样的通用计算机系统不同,嵌入式系统通常执行的是带有特定要求的预先定义的任务。由于嵌入式系统只针对一项特殊的任务,设计人员能够对它进行优化,减小尺寸降低成本。嵌入式系统通常进行大量生产,所以单个的成本节约,能够随着产量进行成百上千的放大。   嵌入式系统是用来控制或者监视机器、装置、工厂等大规模设备的系统。国内普遍认同的嵌入式系统定义为:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本
[单片机]
<font color='red'>ARM</font>体系结构_嵌入式概述及<font color='red'>开发</font>环境的构建
嵌入式开发学习(4)<ARM汇编指令集详解>
数据传送指令:   MOV 两个寄存器之间传递。例 MOV r1,r0,将寄存器r0中的内容赋值给r1。   MVN 同MOV用法一样,区别是MOV是原值传递,而MVN是按位取反后传递。 算数运算指令:   ADD SUB RSB ADC SBC RSC 逻辑指令:   AND ORR EOR BIC   BIC的用法:BIC r0,r1,#0x1f,将r1中的数的bit0到bit4清零后赋值给r0;为什么是bit0到bit4呢,这个是由#0x1f来决定,#0x1f有五个bit位是1。如写成#0xf,就有四个bit位是0。 比较指令:   CMP CMN TST TEQ 比较指令用来比较两个寄存器中的数。特点:比较指令不用后加S后
[单片机]
学习ARM开发(23)
三个任务准备与运行结果 下来看看创建任务和任运的栈空间怎么样的,以及运行输出。 Made in china by UCSDN(caijunsheng) Lichee 1.0.0 (Mar 12 2006 - 20:51:12) Lichee RTOS code: 0C100000 - 0C1021EC BSS: - 0C102228 上面这句说明执行代码开始位置和结束位置,以及全局数据的结束位置。 Init Finish! 这里就是初始化任务完成。 pTask=C102234 这里就分配第一个IDLE任务内存位置。 pTask- pStackStart=C10225C 这个是任务的栈底的位置。 pTask- pSt
[单片机]
学习ARM开发(2)
天是星期天,刚好在家里休息。又是学习ARM的大好时机了。 早上起得很早,因为都想着怎么样搞好这个ARM开发环境,总是心急的。搞得睡觉,也睡不好。立即把电脑打开,为了更加快点,把家里两台电脑都打开,用一台比较快的电脑装LINUX。目前因为两台电脑都已经安装WINDOWS系统,又装了很多软件。为了没有什么风险,就装了VMWARE软件,就是虚拟机软件,这个软件的虚拟速度确实快很多,它跑图形的操作系统也不慢。如果BOCHS,一运行图形的操作系统,就会很慢,因此放弃了这个自由软件。如果我的电脑速度也很快,比如用AMD64位的最新CPU或许用BOCHS也不慢。哈哈。。。。。 装好VMWARE软件,然后就是在里面安装LINUX,那么用什么LIN
[单片机]
学习ARM开发(6)
上一次,说到要学习ARM汇编,好,现在就开始。目前我的引导程序是在UBOOT1.1.2上修改过来的,大家可以下载UBOOT的源程序,也许你们会问在那里有下呢?这个问题不用我回答了,用GOOGLE,直接找u-boot,就可以找到了。 由于这个引导程序是从u-boot1.1.2修改过来的,所以还是采用uboot的编译工具,它就是arm-linux-tools-20031127.tar.gz,这个可以uboot的网站下载,然后在linux下安装好,就可以编译引导程序。 编译命令主要: make clean 是清空所有临时文件,一般是用来清空目录,用来重新编译程序。 make XXXX_config 是编译本引导程序,XXXX是自
[单片机]
学习ARM开发(7)
上一次,学习到第一段代码,这次接着学习第二段代码,而第二段代码主要作用于保存数据的。 /* ************************************************************************* * * 启动代码。 * * 如果不作内存初始化,就只建立堆栈,重新定位代码到RAM位置。 * 然后就可以跳到第二阶段的代码运行了。 * * * ************************************************************************* */ /* 保存变量的数据区 */ _TEXT_BASE: .word TEXT_BASE
[单片机]
学习ARM开发(8)
上一次看了数据区,这次要看从引导那里跳到这里执行时,运行什么东西了。 /* * 实际运行的复位代码。从一开始运行的代码,就跳到这里运行。 */ reset: /* * 设置cpu运行在SVC32模式。 */ mrs r0,cpsr bic r0,r0,#0x1f orr r0,r0,#0x13 msr cpsr,r0 具体分析如下: /* * 实际运行的复位代码。从一开始运行的代码,就跳到这里运行。 */ reset: /* * 设置cpu运行在SVC32模式。S3C44B0共有7种模式。 */ mrs r0,cp
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved