内存专题--各种RAM/ROM/Cache/Flash等内存概念与区别

本文全面介绍了内存技术的发展,包括DRAM、SRAM、SDRAM等多种内存类型及其特点,探讨了内存条技术,如SIMM和DIMM,以及内存的速率、容量和奇偶校验等关键参数。

内存,或内存储器,又称为主存储器,是关系到计算机运行性能高低的关键部件之一,无疑是非常重要的。为了加快系统的速度,提高系统的整体性能,我们看到,计算机中配置的内存数量越来越大,而内存的种类也越来越多。 

内存新技术 

计算机指令的存取时间主要取决于内存。对于现今的大多数计算机系统,内存的存取时间都是一个主要的制约系统性能提高的因素。因此在判断某一系统的性能时,就不能单凭内存数量的大小,还要看一看其所用内存的种类,工作速度。 

有关内存的名词 
关于内存的名词众多。为了便于读者查阅,下面集中进行介绍。 
ROM:只读存储器 
RAM(Random Access Memory):随机存储器 
DRAM(Dynamic RAM):动态随机存储器 
PM RAM(Page Mode RAM):页模式随机存储器(即普通内存) 
FPM RAM(Fast Page Mode RAM):快速页模式随机存储器 
EDO RAM(Extended Data Output RAM)扩充数据输出随机存储器 
BEDO RAM(Burst Extended Data Output RAM):突发扩充数据输出随机存储器 
SDRAM(Sychronous Dynamic RAM):同步动态随机存储器 
SRAM(Static RAM):静态随机存储器 
Async SRAM(Asynchronous Static RAM):异步静态随机存储器 
Sync Burst SRAM(Synchronous Burst Stacic RAM):同步突发静态随机存储器 
PB SRAM(Pipelined Burst SRAM):管道(流水线)突发静态随机存储器 
Cache:高速缓存 
L2 Cache(Level 2 Cache):二级高速缓存(通常由SRAM组成) 
VRAM(Video RAM):视频随机存储器 
CVRAM(Cached Vedio RAM):缓存型视频随机存储器 
SVRAM(Synchronous VRAM):同步视频随机存储器 
CDRAM(Cached DRAM):缓存型动态随机存储器 
EDRAM(Enhanced DRAM):增强型动态随机存储器 

各种内存及技术特点 
DRAM 动态随机存储器 
DRAM主要用作主存储器。长期以来,我们所用的动态随机存储器都是PM RAM,稍晚些的为FPM RAM。为了跟上CPU越来越快的速度,一些新类型的主存储器被研制出来。它们是EDO RAM、BEDO RAM、SDRAM等。 
DRAM芯片设计得象一个二进制位的矩阵,每一个位有一个行地址一个列地址。内存控制器要给出芯片地址才能从芯片中读出指定位的数据。一个标明为70ns的芯片要用70ns的时间读出一个位的数据。并且还要用额外的时间从CPU得到地址信息设置下一条指令。芯片制作技术的不断进步使这种处理效率越来越高。 

FPM RAM 快速页模式随机存储器 
这里的所谓“页”,指的是DRAM芯片中存储阵列上的2048位片断。FPM RAM是最早的随机存储器,在过去一直是主流PC机的标准配置,以前我们在谈论内存速度时所说的“杠7”,“杠6”,指的即是其存取时间为70ns,60ns。60ns的FPM RAM可用于总线速度为66MHz(兆赫兹)的奔腾系统(CPU主频为100,133,166和200MHz)。 
快速页模式的内存常用于视频卡,通常我们也叫它“DRAM”。其中一种经过特殊设计的内存的存取时间仅为48ns,这时我们就叫它VRAM。这种经过特殊设计的内存具有“双口”,其中一个端口可直接被CPU存取,而另一个端口可独立地被RAM“直接存取通道”存取,这样存储器的“直接存取通道”不必等待CPU完成存取就可同时工作,从而比一般的DRAM要快些。 

EDO RAM 扩充数据输出随机存储器 
在DRAM芯片之中,除存储单元之外,还有一些附加逻辑电路,现在,人们已注意到RAM芯片的附加逻辑电路,通过增加少量的额外逻辑电路,可以提高在单位时间内的数据流量,即所谓的增加带宽。EDO正是在这个方面作出的尝试。扩展数据输出(Extended data out??EDO,有时也称为超页模式??hyper-page-mode)DRAM,和突发式EDO(Bust EDO-BEDO)DRAM是两种基于页模式内存的内存技术。EDO大约1996年被引入主流PC机,从那以后成为许多系统厂商的主要内存选择。BEDO相对更新一些,对市场的吸引还未能达到EDO的水平。 
EDO的工作方式颇类似于FPM DRAM,EDO还具有比FPM DRAM更快的理想化突发式读周期时钟安排。这使得在66MHz总线上从DRAM中读取一组由四个元素组成的数据块时能节省3个时钟周期。 

BEDO RAM 突发扩充数据输出随机存储器 
BEDO RAM,就像其名字一样,是在一个“突发动作”中读取数据,这就是说在提供了内存地址后,CPU假定其后的数据地址,并自动把它们预取出来。这样,在读下三个数据中的每一个数据时,只用仅仅一个时钟周期,CPU能够以突发模式读数据(采用52ns BEDO和66MHz总线),这种方式下指令的传送速度就大大提高,处理器的指令队列就能有效地填满。现今这种RAM只被VIA芯片组580VP,590VP,860VP支持。这种真正快速的BEDO RAM也是有缺陷的,这就是它无法与频率高于66MHz的总线相匹配。 

SDRAM 同步动态随机存储器 
SDRAM 可以说是最有前途的一种内部存储器,当前这种RAM很受欢迎。目前市面上的绝大多数奔腾级主板和Pentium Ⅱ主板都支持这种内存。就像这种内存的名字所表明的,这种RAM可以使所有的输入输出信号保持与系统时钟同步。而在不久以前,这只有SRAM 才能办到。 
SDRAM与系统时钟同步,采用管道处理方式,当指定一个特定的地址,SDRAM就可读出多个数据,即实现突发传送。 
具体来说,第一步,指定地址;第二步,把数据从存储地址传到输出电路;第三步,输出数据到外部。关键是以上三个步骤是各自独立进行的,且与CPU同步,而以往的内存只有从头到尾执行完这三个步骤才能输出数据。这就是SDRAM高速的秘诀。SDRAM的读写周期为10至15ns。 
SDRAM基于双存储体结构,内含两个交错的存储阵列,当CPU从一个存储体或阵列访问数据的同时,另一个已准备好读写数据。通过两个存储阵列的紧密切换,读取效率得到成倍提高。1996年推出的SDRAM最高速度可达100MHz,与中档Pentium同步,存储时间短达5~8ns,可将Pentium系统性能提高140%,与Pentium 100、133、166等每一档次只能提高性能百分之几十的CPU相比,换用SDRAM似乎是更明智的升级策略。目前市场上的奔腾级以上的主板几乎都支持SDRAM。 
SDRAM不仅可用作主存,在显示卡专用内存方面也有广泛应用。对显示卡来说,数据带宽越宽,同时处理的数据就越多,显示的信息就越多,显示质量也就越高。以前用一种可同时进行读写的双端口视频内存(VRAM)来提高带宽,但这种内存成本高,应用受到很大限制。因此在一般显示卡上,廉价的DRAM和高效的EDO DRAM应用很广。但随着64位显示卡的上市,带宽已扩大到EDO DRAM所能达到的带宽的极限,要达到更高的1600×1200的分辨率,而又尽量降低成本,就只能采用频率达66MHz、高带宽的SDRAM了。 
SDRAM也将应用于共享内存结构(UMA),一种集成主存和显示内存的结构。这种结构在很大程度上降低了系统成本,因为许多高性能显示卡价格高昂,就是因为其专用显示内存成本极高,而UMA技术将利用主存作显示内存,不再需要增加专门显示内存,因而降低了成本。 

SRAM Statu RAM 静态随机存储器 
按产生时间和工作方式来分,静态随机存储器也分为异步和同步。在一定的纳米制造技术下,SRAM容量比其他类型内存低,这是因为SRAM需要用更多的晶体管存储一个位(bit),因而造价也贵得多。静态随机存储器多用于二级高速缓存(Level 2 Cache)。 
1. Async SRAM 异步静态随机存储器 
自从第一个带有二级高速缓存(Cache)的386计算机出现以来,这种老型号的属于“Cache RAM(缓存型随机存储器)”类型的内存就开始应用了。异步静态随机存储器比DRAM快些,并依赖于CPU的时钟,其存取速度有12ns、15ns和18ns三种,值越小,表示存取数据的速度越快。但在存取数据时,它还没有快到能够与CPU保持同步,CPU必须等待以匹配其速度。 
2. Sync Burst SRAM同步突发静态随机存储器 
在计算机界存在这样的争论:Sync Burst SRAM 和FB SRAM 谁更快些?诚然,在总线速度为66MHz的系统上,Sync Burst SRAM确实是最快的,但当总线速度超过66MHz时(比如Cyrix公司的6x86p200+型号),Sync burst SRAM就超负荷了,大大低于PB SRAM 传输速度。因此用现行的Pentium主板(总线速度为66MHz),我们应该采用Sync Burst SRAM,这样效率最高、速度最快。但目前的问题是:生产支持Sync Burst SRAM的主板供应商很少,所以能支持Sync Burst SRAM的主板的价格都很高。 
3. PB SRAM 管道突发静态随机存储器 
管道(Pipeline,或流水线)的意思是:通过使用输入输出寄存器,一个SRAM可以形成像“管道”那样的数据流水线传输模式。在装载填充寄存器时,虽然需要一个额外的启动周期,但寄存器一经装载,就可产生这样的作用:在用现行的地址提供数据的同时能提前存取下一地址。在总线速度为75MHz和高于75MHz时,这种内存是最快的缓存型随机存储器(Cache RAM)。实际上,PB SRAM可以匹配总线速度高达133MHz的系统。同时,在较慢的系统中,PB SRAM也并不比Sync Burst SRAM慢多少。 
应用PB SRAM,可达到4.5到8ns的“地址-数据”时间。 

L2 Cache 二级高速缓存 
现今解决CPU与主内存之间的速度匹配的主要方法是在CPU与DRAM间加上基于SRAM的二级高速缓存,这种内存系统可以承担85%的内存请求,而不需CPU增加额外的等待周期。 
在用DOS、Windows3.1、Windows3.2和WFW3.11(Windows for Workgroups)作为主要的操作系统时,确实没有必要设置高于256KB的L2 Cache。但自从Windows95操作系统推出以来,经测试,在系统的RAM只有16MB时,设置512KB的缓存比256KB的缓存更能大大提高系统的性能。 
再者,应用多媒体软件日益普遍,而以前的系统不能缓存大多数图形和视频信息,这使得CPU不断地与速度较慢的主内存打交道,降低了系统的性能,而增加CPU的二级高速缓存就能解决这个问题。 
目前,人们越来越倾向应用32位的操作系统。在多任务的操作系统中,增加L2 Cache直到2MB都具有实际意义,能够增强系统性能,这是因为应用程序越来越大,并且越来越多的程序在同一时间运行,当CPU在多任务之间切换时,如果Cache没有足够大的空间来装入所有被执行代码,就必须从速度非常慢的主内存器获得它所需的信息,多任务操作系统就不能充分发挥其作用。因此,在应用现代的操作系统时,在系统装入512KB的L2 Cachee是计算机系统发展的需要。 
基于以下特点,Sync Burst SRAM比Async SRAM更适合作二级高速缓存: 
(1)同步于系统时钟 
(2)突发能力 
(3)管道能力 
以上这些特点使得微处理器在存取连续内存位置时用同步SRMA比异步SRAM更快。目前,有些RAM供应商提供的3.3V异步的SRAM的“时钟到数据时间”(clock-to-data指开始加入时钟脉冲到数据输出的时间)为15ns,而采用类似技术的同步SRAM的“时钟到数据时间”甚至不到6ns。 
随着总线速度的增加,性能价格比最佳点的SRAM技术是从异步到同步,再到管道同步的。 
但目前只有少数供应商能提供采用同步的SRAM,所以在系统性能不是非常重要时,设计者在总线速度为50MHz到66MHz时采用“管道同步”技术的内存是一种明智的选择。 
有些内存设计方案把Cache、DRAM、SRAM结合起来,如CDRAM、EDRAM、CVRAM、SVRAM、EDO SRAM、EDO VRAM。也有些内存设计方案在存储器中增加了一些内置式微处理器,如智能RAM(Smart RAM)、3D RAM(用于3维视频信号处理的RAM)、RDRAM(Rambus DRAM)、WRAM(Windows RAM,一种采用双端口内存视频加速技术的内存)。内存的多样性可见一斑,不一而论。 

快闪存储器,快擦写存储器和铁电体随机存储器 
快闪存储器是1983年推出的电可擦非易失性半导体存储器,它采用一种非挥发性存储技术,即若不对其施加大电压进行擦除,可一直保持其状态,在不加电状态下可安全保存信息长达十年;它也具有固态电子学特性,即没有可移动部件,抗震性能好;同时,它具有优越的性能,它的存取时间仅为30ns。与以往的电可擦存储器EEPROM相比,快闪存储器的最大差别是采用了块可擦除的阵列结构,这种结构不仅使其有了快的擦除速度,而且具有了像EEPROM那样的单管结构的高密度,由此带来了低的制造成本和小的体积。快闪存储器兼有了ROM和RAM二者的性能及高密度,是目前为数不多的同时具备大容量、高速度、非易失性、可在线擦写特性的存储器。 
快闪存储器多用于系统的BIOS、Modem(调制解调器)和一些网络设备(Hub、路由器)。 
铁电体随机存储器也采用非挥发性存储技术,在生产中使用了铁氧体,它优越于快闪存储器的特点是其经过多次写操作后性能不退化,而快闪存储器存在退化问题。这使得铁电体随机存储器更具有广阔的前景。 

各种内存条及技术特点 
目前市场上计算机产品升级频繁。CPU已进入奔腾时代,与此同时,内存系列产品的技术与性能也逐渐更新提高。 
内存条的格式分30线、72线和168线。当今流行的内存条有EDO和SDRAM。现在的Pentium级以上的计算机在设计上均支持EDO和SDRAM内存条。 
衡量内存条技术的一个重要指标是DRAM芯片的存取时间,常见的有60ns、70ns、80ns,数值越小,速度越快。 

SIMM内存条 
SIMM内存条的全称为单列存储器模块,是一块装有3~36片DRAM的电路板。早期PC机的主存储器采用的是双列直插封装(DIP)的DRAM芯片,因其安装位置较大,不便于扩展,故现在普遍采用SIMM内存条,安装一条SIMM相当于安装原来的9片DIP型DRAM芯片。目前在SIMM内存条集成的多为EDO/FPM内存,其主要参数有: 
1.引脚数 
SIMM内存条上的引脚,俗称为“金手指”。使用时,内存条引脚数必须与主板上SIMM槽口的针数相匹配。SIMM槽口有30针、72针两种,相对应内存条的引脚有30线和72线两种。在72针系统中,有奇偶校验使用36位的内存条,无奇偶校验使用32位的内存条;在30针的普通系统中,有奇偶校验使用9位的内存条,无奇偶校验则使用8位的内存条。目前30针的SIMM内存条已被淘汰。 
2.容量 
30线内存条常见容量有256KB、1MB和4MB。72线内存条常见容量有4MB、8MB、16MB和32MB。30针引脚系统中,8位或9位内存条的数据宽度为8位,286、386SX、486SX CPU数据宽度为16位,因此必须成对使用;386DX、486DX CPU数据宽度为32位,因此必须4条一组使用。72针引脚系统中,32位或36位内存条的数据宽度为32位,适用于386DX、486DX和Pentium(586)微机,可以单条或成对使用。 
3.速率 
内存条的一个重要性能指标是速率,以纳秒(ns)表示,代表系统给予内存在无错情况下作出反应的时间。一般有60ns、70ns、80ns、120ns等几种,相应在内存条上标有“-6”、“-7”、“-8”、“-12”等字样。这个数值越小,表示内存条速度越快。只有当内存与主板速度相匹配时才能发挥最大效率。 
4.奇偶校验 
微机要求内存有奇偶校验,但没有奇偶校验也能运行。奇偶校验需要额外的内存芯片。选购内存条时常会听到2片、3片、真3片、假3片、8片、9片等说法,这是指内存条是否带奇偶校验。2片和8片内存条肯定不带奇偶校验;3片和9片内存条应该带奇偶校验,但有些生产厂商为了谋取更高利润,将坏的芯片作为奇偶校验,被称为假3片或假9片,假3片或假9片一般能正常使用,只是制造成本低。鉴别内存是否带奇偶校验比较简单,装好内存开机后执行BIOS SETUP程序,选择允许奇偶校验,如果机器可正常引导,则说明内存带奇偶校验,如果屏幕出现奇偶校验错的提示后死机,则说明内存不带奇偶校验。 

DIMM内存条 
在内存条模块生产技术上,新型的168线DIMM内存条模块为当今最流行的内存条,如下图所示。DIMM是指双在线模块,它与早期的SIMM单在线模块有着很大区别。 


它使内存条在长度增加不多的情况下将模块的总线宽度增加一倍。DIMM技术的另一个优点是能够制作非常小的32位模块。这就是所谓的SODIMM。它的尺寸仅是72针的SIMM模块的一半,因此许多笔记本电脑制造商均采用SODIMM作为内存条的标准模式。 
其实,无论是内存条技术的革新还是内存条模块的改造,最终目的还是适应 
广大电脑用户的多层次需求。世界著名的内存条生产厂商金士顿(Kingston)公司在其产品的生产上强调了专业性与针对性,根据每一种不同的系统进行特别设计。今后的市场是技术与服务并重的市场,优秀的技术革新与优质的服务保障会使计算机用户收益无穷。

没找到原文链接,只能附上转载链接:

https://blog.youkuaiyun.com/ljlujie/article/details/46011021

如果可能,一定附上原文出处;

详细分析“/* 1.14.0 */ /*===================================================================================================================================*/ /* Copyright DENSO Corporation */ /*===================================================================================================================================*/ /* Spansion Traveo ARM Cortex-FR5/R5F : statup_acr5f.asm */ /* */ /* Compiler : Greenhills ARM */ /* */ /* Usage of General Register : */ /* R0 : */ /* R1 : */ /* R2 : Copy, Fill Buffer for M_COPY, M_FILLZ */ /* R3 : Copy, Fill Buffer for M_COPY, M_FILLZ */ /* R4 : Copy, Fill Buffer for M_COPY, M_FILLZ */ /* R5 : Copy, Fill Buffer for M_COPY, M_FILLZ */ /* R6 : Copy, Fill Buffer for M_COPY, M_FILLZ */ /* R7 : Copy, Fill Buffer for M_COPY, M_FILLZ */ /* R8 : Copy, Fill Buffer for M_COPY, M_FILLZ */ /* R9 : Copy, Fill Buffer for M_COPY, M_FILLZ */ /* R10 : Auto variables for M_COPY, M_FILLZ */ /* R11 : Auto variables for M_COPY, M_FILLZ */ /* R12 : Auto variables for M_COPY, M_FILLZ */ /* R13 : = sp Stack Pointer */ /* R14 : = lr Link Register, Auto variables for M_COPY */ /* R15 : = pc Program Counter */ /*===================================================================================================================================*/ /*-----------------------------------------------------------------------------------------------------------------------------------*/ /* Version */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ #define STARTUP_ASM_MAJOR (1) #define STARTUP_ASM_MINOR (14) #define STARTUP_ASM_PATCH (0) /*-----------------------------------------------------------------------------------------------------------------------------------*/ /* Include File */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ #include "startup_acr5f_asmopt.h" /*-----------------------------------------------------------------------------------------------------------------------------------*/ /* Version Check */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ #if ((STARTUP_ASM_MAJOR != STARTUP_ASM_OPT_H_MAJOR) ||\ (STARTUP_ASM_MINOR != STARTUP_ASM_OPT_H_MINOR) ||\ (STARTUP_ASM_PATCH != STARTUP_ASM_OPT_H_PATCH)) #error "startup_acr5f.arm and startup_acr5f_asmopt.h : source and parameter files are inconsistent!" #endif /*-----------------------------------------------------------------------------------------------------------------------------------*/ /* external declaration of symbols */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ .export _start .export vd_g_StartupJumpRstvct .export vd_g_StartupMemFillz .import vd_g_StartupMpuInit .import vd_g_StartupPpuInit .import vd_g_StartupTcmInit .import vd_g_StartupFblEntryClearMark #if (defined(__STARTUP_XMPU_INIT_ENA__) && (__STARTUP_XMPU_INIT_ENA__== 1)) .import vd_g_StartupXMpuInit #endif #if (defined(__STARTUP_JTAG_INIT_ENA__) && (__STARTUP_JTAG_INIT_ENA__== 1)) .import vd_g_StartupJTAGInit #endif #if (defined(__STARTUP_INT_HNDLR_ENA__) && (__STARTUP_INT_HNDLR_ENA__ == 1)) .import vd_STARTUP_EXC_INIT .import vd_STARTUP_FIQ_INIT #endif .import u4_g_STARTUP_TCFLSH_ECC_INIT .import st_gp_STARTUP_SC_CPINI .import u1_g_STARTUP_NUM_SC_CPINI .import st_gp_STARTUP_SC_FILLZ .import u1_g_STARTUP_NUM_SC_FILLZ .import u4_g_STARTUP_BRI_BY_MCU_RST .import u4_g_STARTUP_BRI_BY_PDX_RST .import st_gp_STARTUP_SC_BRAM .import u1_g_STARTUP_NUM_SC_BRAM .import u4p_gp_STARTUP_STACK_INIT .import fp_g_vd_STARTUP_PRGM_MAIN .import u1_g_STARTUP_JMP_RV_NMI_CH /*-----------------------------------------------------------------------------------------------------------------------------------*/ /* local definitions */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ STARTUP_CPSR_MBIT_FIELDS EQU 0x1F STARTUP_CPSR_MBIT_USR EQU 0x10 STARTUP_CPSR_MBIT_FIQ EQU 0x11 STARTUP_CPSR_MBIT_IRQ EQU 0x12 STARTUP_CPSR_MBIT_SVC EQU 0x13 STARTUP_CPSR_MBIT_ABT EQU 0x17 STARTUP_CPSR_MBIT_UND EQU 0x1B STARTUP_CPSR_MBIT_SYS EQU 0x1F /* shares stack with USR mode */ STARTUP_CPSR_FIRQ_DIS EQU 0x40 /*-----------------------------------------------------------------------------------------------------------------------------------*/ STARTUP_ARM_SYSCTRL_INIT EQU 0x09ed287a /* Refer manuals/Platform/MCAL/Spa_Traveo/Startup_ARM_core_configuration.xlsx */ STARTUP_ARM_AUX_LO_INIT EQU 0x0021 /* Refer manuals/Platform/MCAL/Spa_Traveo/Startup_ARM_core_configuration.xlsx */ STARTUP_ARM_AUX_HI_ATCM_ECC_EN EQU 0x0e00 /* Refer manuals/Platform/MCAL/Spa_Traveo/Startup_ARM_core_configuration.xlsx */ STARTUP_ARM_AUX_HI_ATCM_ECC_DI EQU 0x0c00 /* Refer manuals/Platform/MCAL/Spa_Traveo/Startup_ARM_core_configuration.xlsx */ STARTUP_ARM_SAUXCTRL_INIT EQU 0x00400004 /* Refer manuals/Platform/MCAL/Spa_Traveo/Startup_ARM_core_configuration.xlsx */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ STARTUP_RADDR_MCU_RST EQU 0xb0600390 STARTUP_RADDR_PDX_RST EQU 0xb0600398 /*-----------------------------------------------------------------------------------------------------------------------------------*/ STARTUP_RADDR_IRC_UNLOCK EQU 0xb0400d30 /* IRC0_UNLOCK */ STARTUP_RADDR_IRC_NMI_VCT EQU 0xb0400010 /* IRC0_NMIVA0 */ STARTUP_RADDR_IRC_NMI_RQS EQU 0xb0400ab0 /* IRC0_NMIS */ STARTUP_RADDR_IRC_NMI_PLV EQU 0xb0400890 /* IRC0_PL0 */ STARTUP_RADDR_IRC_NMI_HC EQU 0xb0400c40 /* IRC0_NMIHC */ STARTUP_IRC_KEY_RELS EQU 0x17acc911 STARTUP_IRC_KEY_LOCK EQU 0x17b10c11 /*-----------------------------------------------------------------------------------------------------------------------------------*/ /* Section Definition */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ .section ".text_APPL_START", "ax" .nothumb /* Instruction Mode = ARM */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ /* Macro */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ /*===================================================================================================================================*/ /* M_COPY */ /* --------------------------------------------------------------------------------------------------------------------------------- */ /* Arguments: - */ /* Return: - */ /*===================================================================================================================================*/ .macro M_COPY cfg .macrolocal mcopy32b_next, mcopy8b_init, mcopy8b_next, mcopy8b_end, mcopy_end LDR r10, [cfg] /* Start address ROM Area */ LDR r11, [cfg, #4] /* End address ROM Area */ LDR r12, [cfg, #8] /* Start address RAM Area */ CMP r10, r11 BHS mcopy_end /* Start Address >= End Address */ SUB r14, r11, r10 CMP r14, #32 BLO mcopy8b_init /* size < 32 byte */ mcopy32b_next: LDM r10!, {r2-r9} /* copy 32 bytes */ STM r12!, {r2-r9} SUB r14, r14, #32 CMP r14, #32 BHS mcopy32b_next mcopy8b_init: CMP r14, #8 BLO mcopy8b_end mcopy8b_next: LDM r10!, {r2,r3} /* copy 8 bytes */ STM r12!, {r2,r3} SUB r14, r14, #8 CMP r14, #8 BHS mcopy8b_next mcopy8b_end: CMP r14, #0 BEQ mcopy_end LDM r10!, {r2,r3} /* copy 8 bytes */ STM r12!, {r2,r3} mcopy_end: .endm /*===================================================================================================================================*/ /* M_FILLZ */ /* --------------------------------------------------------------------------------------------------------------------------------- */ /* Arguments: - */ /* Return: - */ /*===================================================================================================================================*/ .macro M_FILLZ cfg .macrolocal mfillz32b_next, mfillz8b_init, mfillz8b_next, mfillz8b_end, mfillz_end LDR r10, [cfg] /* Start address RAM Area */ LDR r11, [cfg, #4] /* End address RAM Area */ CMP r10, r11 BHS mfillz_end /* Start Address >= End Address */ SUB r12, r11, r10 CMP r12, #32 BLO mfillz8b_init mfillz32b_next: STM r10!, {r2-r9} /* write 32 bytes */ SUB r12, r12, #32 CMP r12, #32 BHS mfillz32b_next mfillz8b_init: CMP r12, #8 BLO mfillz8b_end mfillz8b_next: STM r10!, {r2,r3} /* write 8 bytes */ SUB r12, r12, #8 CMP r12, #8 BHS mfillz8b_next mfillz8b_end: CMP r12, #0 BEQ mfillz_end STM r10!, {r2,r3} /* write 8 bytes */ mfillz_end: .endm /*-----------------------------------------------------------------------------------------------------------------------------------*/ /* Variable Definitions */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------------------------------------------------------*/ /* Constant Variable Definitions */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------------------------------------------------------*/ /* Static Function Prototypes */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------------------------------------------------------*/ /* Function Definitions */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ /*===================================================================================================================================*/ /* void _start(void) */ /* --------------------------------------------------------------------------------------------------------------------------------- */ /* Arguments: - */ /* Return: - */ /*===================================================================================================================================*/ _start: CPSID AI /* disable asynchronous aborts(clear A bit) */ /* disable IRQ */ /* ------------------------------------------------- */ /* disable MPU in ARM Core and i/d-Cache */ /* ------------------------------------------------- */ MOVW r0, #(STARTUP_ARM_SYSCTRL_INIT & 0xffff) MOVT r0, #(STARTUP_ARM_SYSCTRL_INIT >> 16 ) DSB MCR p15, 0, r0, c1, c0, 0 ISB /* Instruction Synchronization Barrier */ /* ------------------------------------------------- */ /* TCRAM/TCFlash ECC Configuration */ /* ------------------------------------------------- */ MOVW r0, #(STARTUP_ARM_AUX_LO_INIT) MOVW r1, %lo(u4_g_STARTUP_TCFLSH_ECC_INIT) MOVT r1, %hi(u4_g_STARTUP_TCFLSH_ECC_INIT) LDR r1, [r1] MOVW r2, #(STARTUP_TCFLSH_ECC_EN & 0xffff) MOVT r2, #(STARTUP_TCFLSH_ECC_EN >> 16 ) CMP r1, r2 MOVTNE r0, #(STARTUP_ARM_AUX_HI_ATCM_ECC_DI) MOVTEQ r0, #(STARTUP_ARM_AUX_HI_ATCM_ECC_EN) DSB MCR p15, 0, r0, c1, c0, 1 DSB MOVW r0, #(STARTUP_ARM_SAUXCTRL_INIT & 0xffff) MOVT r0, #(STARTUP_ARM_SAUXCTRL_INIT >> 16 ) DSB MCR p15, 0, r0, c15, c0, 0 /* ATCMECC Correction for internal ECC logic is disabled */ /* Since TCM Port A is connect to TCFLASH, write back operation */ /* by 1 bit error correction could cause redundant bus-error, i.g */ /* Prefech/Data Abort. In order to avoid the error, 1 bit error */ /* correction is disabled. */ DSB /* ------------------------------------------------- */ /* ARM MPU Initialization */ /* ------------------------------------------------- */ MOVW r12, %lo(vd_g_StartupMpuInit) MOVT r12, %hi(vd_g_StartupMpuInit) BLX r12 /* ------------------------------------------------- */ /* Traveo Peripheral Protection Initialization */ /* ------------------------------------------------- */ MOVW r12, %lo(vd_g_StartupPpuInit) MOVT r12, %hi(vd_g_StartupPpuInit) BLX r12 /* ------------------------------------------------- */ /* Traveo TC RAM/ROM IF Initialization */ /* ------------------------------------------------- */ MOVW r12, %lo(vd_g_StartupTcmInit) MOVT r12, %hi(vd_g_StartupTcmInit) BLX r12 /* ------------------------------------------------- */ /* ".data" Section Initialization */ /* ------------------------------------------------- */ MOVW r0, %lo(u1_g_STARTUP_NUM_SC_CPINI) MOVT r0, %hi(u1_g_STARTUP_NUM_SC_CPINI) LDRB r0, [r0] CMP r0, #0 BEQ startup_bss_init MOVW r1, %lo(st_gp_STARTUP_SC_CPINI) MOVT r1, %hi(st_gp_STARTUP_SC_CPINI) startup_data_init_next: M_COPY r1 ADD r1, r1, #12 SUB r0, r0, #1 CMP r0, #0 BNE startup_data_init_next /* ------------------------------------------------- */ /* ".bss" Section Initialization */ /* ------------------------------------------------- */ startup_bss_init: MOV r2, #0 MOV r3, #0 MOV r4, #0 MOV r5, #0 MOV r6, #0 MOV r7, #0 MOV r8, #0 MOV r9, #0 MOVW r0, %lo(u1_g_STARTUP_NUM_SC_FILLZ) MOVT r0, %hi(u1_g_STARTUP_NUM_SC_FILLZ) LDRB r0, [r0] CMP r0, #0 BEQ startup_bram_init MOVW r1, %lo(st_gp_STARTUP_SC_FILLZ) MOVT r1, %hi(st_gp_STARTUP_SC_FILLZ) startup_bss_init_next: M_FILLZ r1 ADD r1, r1, #8 SUB r0, r0, #1 CMP r0, #0 BNE startup_bss_init_next /* ------------------------------------------------- */ /* .bss_BACK_XXX Initialization */ /* ------------------------------------------------- */ startup_bram_init: MOVW r0, %lo(u4_g_STARTUP_BRI_BY_MCU_RST) MOVT r0, %hi(u4_g_STARTUP_BRI_BY_MCU_RST) LDR r0, [r0] MOVW r1, #(STARTUP_RADDR_MCU_RST & 0xffff) MOVT r1, #(STARTUP_RADDR_MCU_RST >> 16 ) LDR r1, [r1] /* Load Register Value */ AND r1, r0, r1 CMP r1, #0 BNE startup_bram_init_2nd MOVW r0, %lo(u4_g_STARTUP_BRI_BY_PDX_RST) MOVT r0, %hi(u4_g_STARTUP_BRI_BY_PDX_RST) LDR r0, [r0] MOVW r1, #(STARTUP_RADDR_PDX_RST & 0xffff) MOVT r1, #(STARTUP_RADDR_PDX_RST >> 16 ) LDR r1, [r1] /* Load Register Value */ AND r1, r0, r1 CMP r1, #0 BEQ startup_stack_init startup_bram_init_2nd: MOVW r0, %lo(u1_g_STARTUP_NUM_SC_BRAM) MOVT r0, %hi(u1_g_STARTUP_NUM_SC_BRAM) LDRB r0, [r0] CMP r0, #0 BEQ startup_stack_init MOVW r1, %lo(st_gp_STARTUP_SC_BRAM) MOVT r1, %hi(st_gp_STARTUP_SC_BRAM) startup_bram_init_next: M_FILLZ r1 ADD r1, r1, #8 SUB r0, r0, #1 CMP r0, #0 BNE startup_bram_init_next /* ------------------------------------------------- */ /* Stack Pointer Initialization */ /* ------------------------------------------------- */ startup_stack_init: MOVW r1, %lo(u4p_gp_STARTUP_STACK_INIT) MOVT r1, %hi(u4p_gp_STARTUP_STACK_INIT) CPS #STARTUP_CPSR_MBIT_FIQ LDR sp, [r1, #STARTUP_STACK_INIT_FIQ] /* Top of FIQ stack */ CPS #STARTUP_CPSR_MBIT_IRQ LDR sp, [r1, #STARTUP_STACK_INIT_IRQ] /* Top of IRQ stack */ CPS #STARTUP_CPSR_MBIT_ABT LDR sp, [r1, #STARTUP_STACK_INIT_ABT] /* Top of ABT stack */ CPS #STARTUP_CPSR_MBIT_UND LDR sp, [r1, #STARTUP_STACK_INIT_UND] /* Top of UND stack */ CPS #STARTUP_CPSR_MBIT_SVC LDR sp, [r1, #STARTUP_STACK_INIT_SVC] /* Top of SVC stack */ CPS #STARTUP_CPSR_MBIT_SYS LDR sp, [r1, #STARTUP_STACK_INIT_SYS] /* Top of SYS stack */ #if (defined(__STARTUP_XMPU_INIT_ENA__) && (__STARTUP_XMPU_INIT_ENA__== 1)) MOVW r12, %lo(vd_g_StartupXMpuInit) MOVT r12, %hi(vd_g_StartupXMpuInit) BLX r12 #endif /* #if (defined(__STARTUP_XMPU_INIT_ENA__) && (__STARTUP_XMPU_INIT_ENA__== 1)) */ #if (defined(__STARTUP_JTAG_INIT_ENA__) && (__STARTUP_JTAG_INIT_ENA__== 1)) MOVW r12, %lo(vd_g_StartupJTAGInit) MOVT r12, %hi(vd_g_StartupJTAGInit) BLX r12 #endif /* #if (defined(__STARTUP_JTAG_INIT_ENA__) && (__STARTUP_JTAG_INIT_ENA__== 1)) */ #if (defined(__STARTUP_INT_HNDLR_ENA__) && (__STARTUP_INT_HNDLR_ENA__ == 1)) MOVW r12, %lo(vd_STARTUP_EXC_INIT) MOVT r12, %hi(vd_STARTUP_EXC_INIT) BLX r12 CPSIE A /* enable asynchronous aborts(clear A bit) */ MOVW r12, %lo(vd_STARTUP_FIQ_INIT) MOVT r12, %hi(vd_STARTUP_FIQ_INIT) BLX r12 CPSIE F /* enable FIQ(clear F bit) */ #endif /* #if (defined(__STARTUP_INT_HNDLR_ENA__) && (__STARTUP_INT_HNDLR_ENA__ == 1)) */ MOVW r12, %lo(vd_g_StartupFblEntryClearMark) MOVT r12, %hi(vd_g_StartupFblEntryClearMark) BLX r12 /* execute main function */ MOVW r12, %lo(fp_g_vd_STARTUP_PRGM_MAIN) MOVT r12, %hi(fp_g_vd_STARTUP_PRGM_MAIN) LDR r12, [r12] BX r12 /* Reset MCU */ _start_end: B _start_end /*===================================================================================================================================*/ /* void vd_g_StartupJumpRstvct(void) */ /* --------------------------------------------------------------------------------------------------------------------------------- */ /* Arguments: - */ /* Return: - */ /*===================================================================================================================================*/ vd_g_StartupJumpRstvct: MRS r0, cpsr /* Original CPSR value */ AND r1, r0, #STARTUP_CPSR_MBIT_FIELDS CMP r1, #STARTUP_CPSR_MBIT_USR BEQ startup_jump_rstvct_ret AND r1, r0, #STARTUP_CPSR_FIRQ_DIS CMP r1, #0 /* CPSR.F = 0 */ BNE _start /* IF CPRS.F = 1, jump _start */ MOVW r0, #(STARTUP_RADDR_IRC_UNLOCK & 0xffff) MOVT r0, #(STARTUP_RADDR_IRC_UNLOCK >> 16 ) MOVW r1, #(STARTUP_IRC_KEY_RELS & 0xffff) MOVT r1, #(STARTUP_IRC_KEY_RELS >> 16 ) STR r1, [r0] MOVW r1, %lo(u1_g_STARTUP_JMP_RV_NMI_CH) MOVT r1, %hi(u1_g_STARTUP_JMP_RV_NMI_CH) LDRB r1, [r1] MOVW r2, #(STARTUP_RADDR_IRC_NMI_VCT & 0xffff) MOVT r2, #(STARTUP_RADDR_IRC_NMI_VCT >> 16 ) ADD r2, r2, r1, LSL #2 /* IRC0_NMIVA0 + NMI CH * 4byte */ MOVW r3, %lo(vd_s_StartupJumpRstvctNMI) MOVT r3, %hi(vd_s_StartupJumpRstvctNMI) STR r3, [r2] CMP r1, #0 BEQ startup_jump_rstvct_nmi_call MOVW r2, #(STARTUP_RADDR_IRC_NMI_PLV & 0xffff) MOVT r2, #(STARTUP_RADDR_IRC_NMI_PLV >> 16 ) ADD r2, r1, r2 MOV r3, #0 STRB r3, [r2] startup_jump_rstvct_nmi_call: MOVW r2, #(STARTUP_RADDR_IRC_NMI_RQS & 0xffff) MOVT r2, #(STARTUP_RADDR_IRC_NMI_RQS >> 16 ) MOV r3, #0x01 LSL r3, r1 STR r3, [r2] /* Set Software NMI Request */ DMB CPSIE F /* enable FIQ(clear F bit) */ B _start_end /* Failsafe */ startup_jump_rstvct_ret BX lr /*===================================================================================================================================*/ /* static void vd_s_StartupJumpRstvctNMI(void) */ /* --------------------------------------------------------------------------------------------------------------------------------- */ /* Arguments: - */ /* Return: - */ /*===================================================================================================================================*/ vd_s_StartupJumpRstvctNMI: ADD r2, r2, #4 /* IRC0_NMIR */ STR r3, [r2] /* Clear Software NMI Request */ DMB MOVW r2, #(STARTUP_RADDR_IRC_NMI_HC & 0xffff) MOVT r2, #(STARTUP_RADDR_IRC_NMI_HC >> 16 ) STR r1, [r2] MOVW r1, #(STARTUP_IRC_KEY_LOCK & 0xffff) MOVT r1, #(STARTUP_IRC_KEY_LOCK >> 16 ) STR r1, [r0] B _start /*===================================================================================================================================*/ /* void vd_g_StartupMemFillz(const ST_STARTUP_FILLZ * st_ap_FILLZ) */ /* --------------------------------------------------------------------------------------------------------------------------------- */ /* Arguments: - */ /* Return: - */ /*===================================================================================================================================*/ vd_g_StartupMemFillz: PUSH {r4-r12} /* Save argument register on system stack */ MOV r2, #0 MOV r3, #0 MOV r4, #0 MOV r5, #0 MOV r6, #0 MOV r7, #0 MOV r8, #0 MOV r9, #0 M_FILLZ r0 POP {r4-r12} /* Save argument register on system stack */ BX lr /*===================================================================================================================================*/ /* file end */ /*===================================================================================================================================*/ END /*===================================================================================================================================*/ /* */ /* Change History */ /* */ /*===================================================================================================================================*/ /* */ /* Version Date Author Change Description */ /* --------------- ---------- ------ ------------------------------------------------------------------------------------------- */ /* 1.0.0 06/26/2014 KT new */ /* 1.1.0 2/18/2015 TN Stack Pointers were changed to const from #define. */ /* 1.2.0 3/ 5/2015 TN vd_g_StartupRamFillz was implemented and the usage of general registerStack was optimized. */ /* 1.3.0 6/12/2015 TN M_FILLZ was modified. */ /* 1.4.0 9/ 7/2015 TN Initialization Sequence was optimized considering Flash Bootloader. */ /* 1.5.0 10/19/2015 TN Bug Fix : In M_FILLZ, RAM was not initialized if the size was less than 8 bytes. */ /* 1.6.0 10/23/2015 TN Improvement : STARTUP_CP15_INIT_MASK and STARTUP_CP15_INIT_SETBIT */ /* ->STARTUP_ARM_SYSCTRL_INIT_CLR and STARTUP_ARM_SYSCTRL_INIT_SET */ /* 1.7.0 11/13/2015 TN Improvement : u4_gp_STARTUP_MCU_RST_REASON and u4_gp_STARTUP_PDX_RST were replaced to macro. */ /* vd_g_StartupFblClrEntryMark was integrated. */ /* 1.8.0 12/ 2/2015 TN Improvement : ECC configuration for TCRAM/TCFLASH was implemented considering it of Flash */ /* Bootloader. */ /* 1.9.0 12/ 3/2015 TN Improvement : ARM Core Configuration was optimized. */ /* 1.10.0 12/18/2015 TN Improvement : vd_g_StartupMcuStart -> vd_g_StartupJumpRstvct. */ /* 1.11.0 2/25/2016 TN QAC warnings wer fixed. */ /* ST_STARTUP_FILLZ was defined in startup.h. */ /* startup_acr5f_cfg_private.h -> startup_acr5f_asmopt.h. */ /* 1.12.0 3/29/2016 TN #if ((defined(__AIP_DEBUG_SIM__)) && (__AIP_DEBUG_SIM__==1)) was deleted because Greenhills */ /* ARM simulator was updated and the bug was fixed. */ /* 1.13.0 6/ 6/2016 TN Improvement : u4_gp_STARTUP_STACK_INIT -> u4p_gp_STARTUP_STACK_INIT. */ /* 1.14.0 9/28/2016 TN u4_g_STARTUP_TCFLSH_ECC_INIT was created in order to make ATCM ECC configurable. */ /* */ /* * KT = Kensuke Tanaka, Denso Create */ /* * TN = Takashi Nagai, Denso */ /* */ /*===================================================================================================================================*/ ”
最新发布
09-30
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值