学习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)
下一篇:最后一页

推荐阅读最新更新时间:2024-11-14 11:24

移植qtopia到ARM开发
前言: 说实话,以前只作过51,而且用的是汇编,C都没有怎么用过。最近才有机会接触到linux,说起来也算是落后分子了。多亏北理论坛里各位大侠的帮忙,还算顺利的把qtopia移植到了ARM开发板上。现整理了下文,抛砖引玉,希望能对大家有所帮助,当然也希望大家多提宝贵意见,mail to ahha1998@126.com即可。当然更希望大家的经验也能告诉我 一、所用的资源: 硬件:华恒HHARM9328MXL-R1 软件:cross-2.95.3.tar.bz2 qt-embedded-2.3.10.tar.gz qt-x11-2.3.2.tar.gz qt-x11-3.3.4.tar.gz qtopia-free-2.1.1.
[单片机]
嵌入式linux开发 (十八) 内存管理(2) ARM内存管理
硬件对内存的管理 armv7v8 ARM是统一编址的,也就是外设和(内存A)进行统一的编址,共同形成了4G物理地址空间(32位为例子)。 内存控制器属于外设,内存属于(内存A). 一个soc内部及外扩的内存都属于(内存A). 存储器架构 哈佛架构 cortex-M cortex-A MPU MMU 的概念定义及实现定义 MPU: The memory protection unit (MPU) is used to manage the CPU accesses to memory to prevent one task to accidentally corrupt the memory or resources
[单片机]
ARM将推新一代mbed OS 5.5,加速物联网产品开发
  以 ARM 的Cortex-M作为核心,不少 物联网 开发者都会将其作为首选进行产品开发, ARM 也因应此推出mbed平台服务,包含系统底层的mbedOS以及云端平台mbedCloud,协助开发者加速软硬整合进行开发。 ARM 在此次Computex展会期间,也顺势向媒体公开新一代mbedOS5.5即将上线,除了针对前代产品进行改善之外,也增加了部分新功能。下面就随嵌入式小编一起来了解一下相关内容吧。   ARM预计将在6月16日发布最新的mbedOS5.5版本,将会针对前一代版本进行改善并加入新功能。   虽然ARM并非第一个推出 物联网 平台或OS的厂商,但因这套平台只要采用Cortex-M的产品都能在上面运作,因此对
[嵌入式]
ARM开发板系统移植-----u-boot的编译
本文和另外两篇姊妹篇都是为了说明如何裁剪出适合在mini2440 开发板上运行的Linux系统,以记录自己的学习成果。其中本文先介绍了嵌入式系统的软件组成部分,然后介绍编译出适合在mini2440开发板上运行的uboot的方法步骤。 说明:笔者使用的开发平台---RetHat linux系统,开发板---Friendly mini2440 在开始讲述系统移植的具体方法之前,先大致了解一下嵌入式系统的软件组成:    从上面这个图可以看出,嵌入式系统的软件组成主要包括bootloader、内核以及根文件系统。当然还有bootloader传给内核的参数列表以及没画出来的应用软件。其中bootloader在开发板一上电就会被硬
[单片机]
<font color='red'>ARM</font><font color='red'>开发</font>板系统移植-----u-boot的编译
Eclipse开发调试ARM裸机程序(二)LED_从ARM到GNU
就不对着数据手册说有寄存器了,主要说说ARM汇编和GNU汇编的区别,以前用RVDS2.2用的汇编程序都真ARM汇编。到用eclipse用的是编译u-boot或者内核的arm-linux-gcc,这次用的汇编要用GNU汇编,编译时交给arm-linux-gcc来做剩下的工作。 原来的一个RVDS2.2下的汇编LED程序是这样的: WTCON EQU 0x53000000 ;看门狗控制寄存器地址 GPBCON EQU 0x56000010 ;GPB控制寄存器 GPBDAT EQU 0x56000014 ;GPB数据寄存器 AREA Init,CODE,READONLY ;声明代码段 ENTRY ;表示程
[单片机]
Eclipse<font color='red'>开发</font>调试<font color='red'>ARM</font>裸机程序(二)LED_从<font color='red'>ARM</font>到GNU
2020 Arm开发者大会10大亮点
本文来源:Hackster.io,作者:Ish Ot Jr. 2020年10月6日至8日,Arm举行在线的DevSummit(开发者大会),这也是Arm将TechCon更名为DevSummit的首次大会。除了全球流行所要求的虚拟化之外,新的大会反映了Arm的转变:从过去15年中以硬件为主的TechCon转变为以软件为中心的活动。由于Arm自身的硬件和软件工程师的内部比例已经从4:1下降到1:1,他们也必须努力参与社区转变,以吸引Arm生态系统在2020年触及的广大开发者。 Arm CEO Simon Segars 开发者是关键 在活动初期,我最喜欢的一个时刻是Mark Hambleton(Arm开源软件副总裁)的
[物联网]
2020 <font color='red'>Arm</font><font color='red'>开发</font>者大会10大亮点
arm开发经验!(连载3)
/*  *********************************************************************************************************  *                                               Programming Arm  *  *  *                             (c) Copyright 1992-2008, 西安交通大学  *                                          All Rights Reserved  *  *      
[单片机]
ARM开发(9)基于STM32的简单四则运算计算器
一 计算器原理: 1.1 本实验实现基于STM32的简单四则运算计算器 1.2 实验思路:理解计算器原理(按键扫描,字符实时显示,运算表达式计算,浮点数转字符串,字符串结果显示) 1.3 开发环境 : MDK5 库函数版本开发 JLINK仿真 STM32F103VBT6芯片 二 实验步骤: 2.1 key.h代码: #ifndef __KEY_H #define __KEY_H #include sys.h #define KEY_NULL 0 // no key #define KEY_0 40 // value 0 #define KEY_1 41
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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