精华内容
下载资源
问答
  • 【MPC5744P】Flash 结构、启动原理以及内存映射

    千次阅读 热门讨论 2018-12-21 15:23:39
    与大部分的MCU相同,MPC5744P的Flash、...MPC5744P Flash结构如下:               0x00000000-0x003FFFFF --   reserved           0x00400000-0...

    与大部分的MCU相同,MPC5744P的Flash、RAM以及外设都映射到内存地址中了。以下为映射地址范围:

     

    MPC5744P Flash结构如下:       
    0x00000000-0x003FFFFF-- reserved     
    0x00400000-0x00403FFF-- 16KB,UTest NVM block   
    0x00404000-0x007FFFFF-- Reserved     
    0x00800000-0x00817FFF-- 96KB,Data flash memory block  
     0x00800000-0x00803FFF 16KB,EEPROM-low block0,RWW_P:0,BlockSize:16 KB  
     0x00804000-0x00807FFF 16KB,EEPROM-low block1,RWW_P:0,BlockSize:16 KB  
     0x00808000-0x0080FFFF 32KB,EEPROM-mid block0,RWW_P:2,BlockSize:32 KB  
     0x00810000-0x00817FFF 32KB,EEPROM-mid block1,RWW_P:3,BlockSize:32 KB  
              
    0x00818000-0x00FFFFFF-- 6MB,Used 416KB,Small and medium flash memory blocks
        Small:         
     0x00F98000-0x00F9BFFF16KB,low flash memory block 2(boot location 0),RWW_P:1,BlockSize:16KB
     0x00F9C000-0x00F9FFFF16KB,low flash memory block 3(boot location 1),RWW_P:1,BlockSize:16KB
              
        Medium:        
     0x00FA0000-0x00FAFFFF64KB,high flash memory block 0(boot location 2),RWW_P:4 BlockSize:64KB
     0x00FB0000-0x00FBFFFF64KB,high flash memory block 1(boot location 3),RWW_P:4 BlockSize:64KB
     0x00FC0000-0x00FCFFFF64KB,high flash memory block 2 ,RWW_P:4,BlockSize:64KB 
     0x00FD0000-0x00FDFFFF64KB,high flash memory block 3 ,RWW_P:5,BlockSize:64KB 
     0x00FE0000-0x00FEFFFF64KB,high flash memory block 4 ,RWW_P:5,BlockSize:64KB 
     0x00FF0000-0x00FFFFFF64KB,high flash memory block 5 ,RWW_P:5,BlockSize:64KB 
              
    0x01000000-0x01FFFFFF-- 16MB,Used 2048KB,Large flash memory blocks 
        Large:         
     0x01000000-0x0103FFFF256KB,flash memory block 0(boot location 4),RWW_P:6,BlockSize:256 KB
     0x01040000-0x0107FFFF256KB,flash memory block 1(boot location 5),RWW_P:6 BlockSize:256 KB
     0x01080000-0x010BFFFF256KB,flash memory block 2(boot location 6),RWW_P:6 BlockSize:256 KB
     0x010C0000-0x010FFFFF256KB,flash memory block 3(boot location 7),RWW_P:6 BlockSize:256 KB
     0x01100000-0x0113FFFF256KB,flash memory block 4,RWW_P:7 BlockSize:256 KB  
     0x01140000-0x0117FFFF256KB,flash memory block 5,RWW_P:7 BlockSize:256 KB  
     0x01180000-0x011BFFFF256KB,flash memory block 6,RWW_P:7 BlockSize:256 KB  
     0x011C0000-0x011FFFFF256KB,flash memory block 7,RWW_P:7 BlockSize:256 KB  
              
    0x02000000-0x089FFFFF-- 106MB,Reserved    
    0x08A00000-0x08FFFFFF-- 6MB,Used 416KB,Mirror Small and medium flash memory blocks
    0x09000000-0x09FFFFFF-- 16MB,Used 2048KB,Mirror Large flash memory blocks
    0x0A000000-0x3FFFFFFF-- Reserved     
              
    MPC5744P RAM结构如下:        
    0x40000000-0x4005FFFF-- 384KB,System RAM    
    0x40060000-0x4007FFFF-- Reserved System RAM   
    0x40080000-0x4FFFFFFF-- Reserved     
              
    MPC5744P Local Memory结构如下      
    0x50000000-0x5000FFFF-- Reserved     
    0x50010000-0x507FFFFF-- Reserved     
    0x50800000-0x5080FFFF-- 64KB,Used 64KB,D-MEM CPU0   
    0x50810000-0xF7FFFFFF-- Reserved     
              
    其它外设:        
    0xF8000000-0xFFFFBFFF-- other     
    0xFFFFC000-0xFFFFFFFF-- 16KB,Boot Assist Module(BAM)  

     

    Flash有几种分类方式。

    方式一:EEPROM、Small、Medium、Large Flash。

    方式二:Low、Medium、High、First256K、Second256K。

    其中上述方式二涉及到Lock与Select,关系到Flash的擦除和编程。

     

    MPC5744P Flash编程:

    MPC5744P数据存储为字节模式,即32位数据存储会占用4个地址

    对Flash编程时,需要多个步骤:

    1、解锁对应的Block

    2、选择对应的Block

    3、擦除对应的Block

    4、编程对应的Block

    5、加锁对应的Block

    Block对应列表如下:

    LOW--not program, partition 0 and 1    
    0x00800000-0x00803FFF-- 16KB,EEPROM-low block0, RWW_P:0 
    0x00804000-0x00807FFF-- 16KB,EEPROM-low block1, RWW_P:0 
    0x00F98000-0x00F9BFFF-- 16KB,low flash memory block2, RWW_P:1
    0x00F9C000-0x00F9FFFF-- 16KB,low flash memory block3, RWW_P:1
             
    MID , partition 2 and 3      
    0x00808000-0x0080FFFF-- 32KB,EEPROM-mid block0, RWW_P:2 
    0x00810000-0x00817FFF-- 32KB,EEPROM-mid block1, RWW_P:3 
             
    HIGH, , partition 4 and 5      
    0x00FA0000-0x00FAFFFF-- 64KB,high flash memory block0, RWW_P:4
    0x00FB0000-0x00FBFFFF-- 64KB,high flash memory block1, RWW_P:4
    0x00FC0000-0x00FCFFFF-- 64KB,high flash memory block2, RWW_P:4
    0x00FD0000-0x00FDFFFF-- 64KB,high flash memory block3, RWW_P:5
    0x00FE0000-0x00FEFFFF-- 64KB,high flash memory block4, RWW_P:5
    0x00FF0000-0x00FFFFFF-- 64KB,high flash memory block5, RWW_P:5
             
    256K--all used       
    0x01000000-0x0103FFFF-- 256KB,256k flash memory block0, RWW_P:6
    0x01040000-0x0107FFFF-- 256KB,256k flash memory block1, RWW_P:6
    0x01080000-0x010BFFFF-- 256KB,256k flash memory block2, RWW_P:6
    0x010C0000-0x010FFFFF-- 256KB,256k flash memory block3, RWW_P:6
    0x01100000-0x0113FFFF-- 256KB,256k flash memory block4, RWW_P:7
    0x01140000-0x0117FFFF-- 256KB,256k flash memory block5, RWW_P:7
    0x01180000-0x011BFFFF-- 256KB,256k flash memory block6, RWW_P:7
    0x011C0000-0x011FFFFF-- 256KB,256k flash memory block7, RWW_P:7

    具体编程实例下一篇再讲述。

     

     

    MPC5744P启动原理:

    首先介绍以下MCU启动原理,为Bootloader打基础。

    MPC5744P启动方式比较奇特,支持2类方式启动:

    1、Single Chip(SC)-从第一个可启动flash块启动
               2、Serial Boot(SBL)-从SCI或CAN下载启动代码,然后运行,也就是BAM启动

    BAM启动:           

    通过BAM启动(单芯片启动模式由硬件管理,BAM不参与),BAM在以下情况运行:
               1、Force Alternate Boot(FAB)引脚选择为串行启动
               2、硬件在所有flash中的启动块中没有找到一个合法的Boot ID

               以上有一个以上条件成立,则芯片在0xFFFF_C000处抓取代码进而BAM启动。

               FAB引脚 配合 ABS(Aletrnate Boot Selector)引脚使用
               

    FAB

    ABS 2,0

    Boot ID Boot Mode
    10 0--Serial Boot SCI
    10 1--Serial Boot CAN
    0--ValidSC
    0--Not FoundStatic Mode

     

     

     

     

     

     

    SC启动:

    单芯片启动时,会先从低到高搜索每一个Boot location,每一个Boot Location第一个地址为RCHW(Reset Configuration Half-Word),若RCHW的BOOT_ID区域包含0x5A,则此块可作为启动分区,第一个Boot Location起始处为启动地址偏移4个地址(每4个地址为一个32bits数据)。

    例如代码从0x00FA0000处,Boot location0处启动,则对应RCHW为,0x00FA0000:0x005A0000,实际会从0x00FA0004处执行第一个代码,例如下面执行了跳转指令,跳转到了0x01000000。

    具体设置flash地址方法为修改xxx_flash.ld文件.

    展开全文
  • ORACLE内存结构

    千次阅读 2019-04-06 23:19:16
    为了对ORACLE数据库有一个基本的了解,我们首先需要理解ORACLE的内存结构。           可以大体上将ORALCE内存分为以下几类: System Global a...

              为了对ORACLE数据库有一个基本的了解,我们首先需要理解ORACLE的内存结构。
              可以大体上将ORALCE内存分为以下几类:

    • System Global area(SGA)
      一组共享内存结构,包含数据库实例的数据以及控制信息。
    • Program global area(PGA)
      进程或者线程独占的内存结构。当ORACLE进程启动时分配该内存。
    • User global area(UGA)
      与用户会话相关的内存结构。
    • Software code areas
      用于存储正在运行或可能运行的代码的内存区域。

              oracle整体内存结构如下图
    avatar

    UGA-User Global Area

              UGA是一块用来存储会话状态相关的内存区域。取决于是否通过shared server模式连接,它可能存在于SGA或者PGA中。

    Shared Server – UGA存在于SGA中
    Dedicated Server – UGA存在于PGA中

    PGA-Program Global Area

              PGA是特定于操作系统进程或线程的内存。下图是dedicated server模式下PGA包含的区域——SQL工作区、私有SQL区和会话内存(在shared server模式下私有SQL区存在于SGA中):
    avatar

    私有SQL区

              存储变量的绑定信息以及运行时的内存结构。在dedicated server模式下该内存区域位于PGA中,但是在shared server模式下在SGA中。该内存区域由客户端管理该区域的创建,服务器端的OPEN_CURSORS参数限定可分配的上限。

    • persistent area
      存储变量绑定的值,当游标关闭时释放该区域内存。
    • run-time area
      当发起query execute请求时,首先会创建该区域,用于存储相关状态信息。例如,做全表扫描时,已检索的行数。

    SQL工作区

              用于排序、位图合并、哈希连接等内存密集型的操作,这些操作会首先在SQL WORK AREA中进行,当分配的内存空间不足时将部分数据写入磁盘的TEMPSPACE表空间。

    SGA-System Global Area

              SGA属于数据库实例的一部分。可通过V$SGASTAT查看各个内存区域的基本信息。

    Database Buffer Cache

              用于缓存当前或最近使用的从磁盘读取的数据块的拷贝,来优化数据库的I/O减少物理读/写。Oralce依据LRU算法对该内存区域进行block-level的更新。
    当一个客户端进程请求数据时,服务端进程会首先去查找buffer cache,如果命中,数据库就进行逻辑读获取该buffer cache的数据。如果未查找到数据,并且数据库开启了flash cache那么服务端进程会查找 flash cache LRU List的buffer header,如果发现数据,则将flash cache中的数据加载到内存中。当以上方式都未读取到数据时,数据库就会进行一次物理读:首先将数据库复制到内存中,然后执行逻辑读操作返回数据。oracle数据库的一般数据读取流程就是这样,但是在进行Full Table Scan时情况可能有些不同。
              在默认情况下,当从磁盘读取数据时,会将读取到的缓存在LRU链表的中间位置,以此保证经常使用的数据块依然保留在buffer cache中。但是在进行全表扫描时,很有可能我们读取的数据块大小超过了buffer cache的大小,如果直接放进内存则会将内存中原本的数据全都age out出去,这样势必会导致数据库性能的下降。
              在进行全表扫描时,如果一个表所需的内存占buffer cache很小的一个百分比,那么就会将其加载至内存中。对一个中等大小的表,数据库会权衡最后一次表扫描,buffer cache的老化时间戳和buffer cache中剩余空间等因素来决定是否将其加载到内存中。对于一个很大的表,那么数据库就倾向于直接使用direct path read,直接把数据加载到PGA中,避免频繁的age out buffer cache中的数据块。当然我们也可以使用ALTER TABLE ... CACHE来将大表的数据缓存到buffer Cache中。
              当我们执行DML语句对数据进行更新的时候也是会在buffer cache中操作的,更新后的数据会在以下情况将脏数据写回磁盘:

    1. 当无法找到clean buffer来读取数据块
    2. 数据库执行检查点
    3. 更改表空间状态为只读或离线状态

              大多数时候我们说的buffer cache指的是默认的Default Buffer Pool,根据不同用途和大小,还有很多不同类型的buffer pool:

    1. Default Buffer Pool:缺省情况下的Cache,他的大小由DB_CACHE_SIZE指定
    2. Keep Buffer Pool:该内存区域用于缓存那些需要经常使用但是又总是被age out出Default Buffer Pool的数据,其大小由DB_KEEP_CACHE_SIZE指定。可使用ALTER TABLE ... STORAGE BUFFER_POOL KEEP语句来修改表的默认缓存位置为Keep Buffer Pool。
    3. Recycle Buffer Pool:放在这个区域中的数据一用完就会被移出。对于 那些体积巨大、偶尔使用的表,可以考虑放在这个内存中,以尽快释放内存
    4. 以上的Buffer Pool都只适用于标准大小的数据块。默认情况下创建的表空间都是使用的8K数据块,当我们创建非标准数据块的表空间(如:2K,4K,16K)这些数据块则会放进其单独的pool中。

    avatar

    Redo Log Buffer

              redo log buffer是一个循环缓冲区,用于LGWR进程将redo entries写入redo log前缓存该数据。该区域通常只有几MB,当一个进程执行DML或者DDL操作时,数据库会记录下该操作产生一条Redo record,并保存到Redo Log Buffer中。以下情况,LGWR进程会把redo buffer中的数据写到redo log file中:

    1. 每3秒
    2. 执行commit语句
    3. 执行switch log files操作时
    4. redo buffer使用超过1/3或者占用内存操作1M时

    Shared Pool

              Shared Pool是一块非常重要的内存区域,特别是对于OLTP系统而言,其中保存了各种类型的程序数据:PL/SQL代码,解析的查询语句,执行计划,系统参数,数据字典等。对于shared server模式,该内存区域也含括了private SQL area。
    avatar
              其中Library cache用来存储可执行的SQL或PL/SQL代码所对应的执行计划、解析树、Pcode、Mcode等对象以及控制结构(如,锁和库缓存句柄),当我们再次执行相应的代码时就无语再从头开始进行解析。我们存放在Library cache中的对象,称为库缓存对象,oracle通过库缓存句柄来访问库缓存对象。Data dictionary cache则用于存储数据库对象的相关信息,在执行SQL语句解析期间会频繁的访问该内存区域。
              在Library cache中我们主要关注的是CRSR这类库缓存对象(SQL和匿名PL/SQL对象)称为shared cursor,涉及到SQL的解析,对于OLTP系统而言至关重要。
              shared cursor又可以分为parent cursor和child cursor可以分别通过V S Q L A R E A 和 V SQLAREA和V SQLAREAVSQL查看对应的cursor。parent cursor存储目标SQL的SQL文本,而child cursor存储解析树和执行计划。
              oracle在解析目标SQL时去库缓存查询shared cursor的流程如下:

    1. 根据目标SQL的hash值去寻找对应的Hash Bucket,不同的SQL有可能产生相同的hash值,相同的SQL不同的语义也会产生相同的Hash值。
    2. 在Hash Bucket中查找匹配的Parent cursor,解决了不同SQL产生相同hash值得问题。
    3. 再查找匹配的child cursor,解决相同的SQL不同的语义也会产生相同的Hash值问题。
    4. 找到对应的child cursor后oracle直接把对应的解析树和执行计划拿去重用。

              test_env和test_env1都有相同的表tb_table_list,执行相同的sql后,他们有共同的parent cursor但是对应的child cursor是不同的。
    test_env用户执行

    SQL> select count(*) from tb_table_list;
    
      COUNT(*)
    ----------
          2138
    

    test_env1用户执行

    SQL> select count(*) from tb_table_list;
    
      COUNT(*)
    ----------
          2138
    

    接下来分别查看parent cursor和child cursor

    SQL> select sql_text,sql_id,version_count from v$sqlarea where sql_text like 'select count(*) from tb_table%';
    
    SQL_TEXT                                 SQL_ID               VERSION_COUNT
    ---------------------------------------- -------------------- -------------
    select count(*) from tb_table_list       92t0jfpufyv5z                    2
    
    SQL> select plan_hash_value,child_number from v$sql where sql_id='92t0jfpufyv5z';
    
    PLAN_HASH_VALUE CHILD_NUMBER
    --------------- ------------
         2263858792            0
          774255499            1
    

              VERSION_COUNT表示某个parent cursor拥有的child cursor数量。可以看到对于相同的sql语句,所生产的parent cursor是相同的,但是对应了不同的解析树和执行计划,应为两个tb_table_list属于不同的用户。
    如果在library cache中并没有找到对应SQL的解析树和执行性计划,那么此时就会产生OLTP系统的万恶之源——硬解析。对于一个高并发的系统,频繁的进行硬解析会导致严重Latch和Mutex的争用,使系统性能下降。

    Large Pool、Java Pool和Fixed SGA

              Large Pool主要用于RMAN备份时I/O子系统缓存以及并发执行语句的消息缓存。Java pool则用于支撑java虚拟机相关内存需求。Fixed SGA是oracle内部管理的一块区域,不能被修改,只会因为oralce数据库版本的不同而有可能产生差异。

    展开全文
  • 内存flash区别

    千次阅读 2019-05-25 13:25:33
    在计算机的组成结构中,有一个很重要的部分,就是存储器。存储器是用来存储程序和数据的部件,对于计算机来说,有了存储器,才有记忆功能,才能保证正常工作。存储器的种类很多,按其用途可分为主存储器和辅助存储器...

    1.什么是内存

    • 什么是内存呢?在计算机的组成结构中,有一个很重要的部分,就是存储器。存储器是用来存储程序和数据的部件,对于计算机来说,有了存储器,才有记忆功能,才能保证正常工作。存储器的种类很多,按其用途可分为主存储器和辅助存储器,主存储器又称内存储器(简称内存),辅助存储器又称外存储器(简称外存)。外存通常是磁性介质或光盘,像硬盘,软盘,磁带,CD等,能长期保存信息,并且不依赖于电来保存信息,但是由机械部件带动,速度与CPU相比就显得慢的多。内存指的就是主板上的存储部件,是CPU直接与之沟通,并用其存储数据的部件,存放当前正在使用的(即执行中)的数据和程序,它的物理实质就是一组或多组具备数据输入输出和数据存储功能的集成电路,内存只用于暂时存放程序和数据,一旦关闭电源或发生断电,其中的程序和数据就会丢失。

    2.内存工作原理

    1. 内存是用来存放当前正在使用的(即执行中)的数据和程序,我们平常所提到的计算机的内存指的是动态内存(即DRAM),动态内存中所谓的'动态',指的是当我们将数据写入DRAM后,经过一段时间,数据会丢失,因此需要一个额外设电路进行内存刷新操作。
    2. 具体的工作过程是这样的:一个DRAM的存储单元存储的是0还是1取决于电容是否有电荷,有电荷代表1,无电荷代表0。但时间一长,代表1的电容会放电,代表0的电容会吸收电荷,这就是数据丢失的原因;刷新操作定期对电容进行检查,若电量大于满电量的1/2,则认为其代表1,并把电容充满电;若电量小于1/2,则认为其代表0,并把电容放电,藉此来保持数据的连续性。 
    3. ROM也有很多种,PROM是可编程的ROM,PROM和EPROM(可擦除可编程ROM)两者区别是,PROM是一次性的,也就是软件灌入后,就无法修改了,这种是早期的产品,现在已经不可能使用了,而EPROM是通过紫外光的照射擦出原先的程序,是一种通用的存储器。另外一种EEPROM是通过电子擦出,价格很高,写入时间很长,写入很慢。
    4. 从一有计算机开始,就有内存。内存发展到今天也经历了很多次的技术改进,从最早的DRAM一直到FPMDRAM、EDODRAM、SDRAM等,内存的速度一直在提高且容量也在不断的增加。

    3.ROM和RAM指的都是半导体存储器

    1. ROM是Read Only Memory的缩写,是一种半导体内存,其特性是一旦储存资料就无法再将之改变或删除。通常用在不需经常变更资料的电子或电脑系统中,资料并且不会因为电源关闭而消失。
    2. 只能读出事先所存数据的固态半导体存储器。英文简称ROM。ROM所存数据,一般是装入整机前事先写好的,整机工作过程中只能读出,而不像随机存储器那样能快速地、方便地加以改写。ROM所存数据稳定 ,断电后所存数据也不会改变;其结构较简单,读出较方便,因而常用于存储各种固定程序和数据。除少数品种的只读存储器(如字符发生器)可以通用之外,不同用户所需只读存储器的内容不同。
    3. 为便于使 用和大批量生产 ,进一步发展了可编程只读存储器(PROM)、可擦可编程序只读存储器(EPROM)和电可擦可编程只读存储器(EEPROM)。EPROM需用紫外光长时间照射才能擦除,使用很不方便。20世纪 80 年代制出的 EEPROM ,克服了EPROM的不足,但集成度不高 ,价格较贵。于是又开发出一种新型的存储单元结构同 EPROM 相似的快闪存储器 。其集成度高、功耗低 、体积小 ,又能在线快速擦除 ,因而获得飞速发展,并有可能取代现行的硬盘和软盘而成为主要的大容量存储媒体。大部分只读存储器用金属-氧化物-半导体(MOS)场效应管制成。
    4. RAM是Random Access Memory的缩写。又称为随机存取存储器;存储单元的内容可按需随意取出或存入,且存取的速度与存储单元的位置无关的存储器。这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序。
    5. 简单地说,在计算机中,RAM 、ROM都是数据存储器。RAM 是随机存取存储器,它的特点是易挥发性,即掉电失忆。ROM 通常指固化存储器(一次写入,反复读取),它的特点与RAM 相反。ROM又分一次性固化、光擦除和电擦除重写两种类型。 
    6. ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是在掉电之后就丢失数据,典型的RAM就是计算机的内存。 

    4.RAM分为两大类

    1. 一种称为静态RAM(Static RAM/SRAM),SRAM速度非常快,是目前读写最快的存储设备了,但是它也非常昂贵,所以只在要求很苛刻的地方使用,譬如CPU的一级缓冲,二级缓冲。
    2. 另一种称为动态RAM(Dynamic RAM/DRAM),DRAM保留数据的时间很短,速度也比SRAM慢,不过它还是比任何的ROM都要快,但从价格上来说DRAM相比SRAM要便宜很多,计算机内存就是DRAM的。 
    3. DRAM分为很多种,常见的主要有FPRAM/FastPage、EDORAM、SDRAM、DDR RAM、RDRAM、SGRAM以及WRAM等,这里介绍其中的一种DDR RAM。
    4. DDR RAM(Date-Rate RAM)也称作DDR SDRAM,这种改进型的RAM和SDRAM是基本一样的,不同之处在于它可以在一个时钟读写两次数据,这样就使得数据传输速度加倍了。这是目前电脑中用得最多的内存,而且它有着成本优势,事实上击败了Intel的另外一种内存标准-Rambus DRAM。在很多高端的显卡上,也配备了高速DDR RAM来提高带宽,这可以大幅度提高3D加速卡的像素渲染能力。 

    flash

    • FLASH存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据(NVRAM的优势),U盘和MP3里用的就是这种存储器。在过去的20年里,嵌入式系统一直使用ROM(EPROM)作为它们的存储设备,然而近年来Flash全面代替了ROM(EPROM)在嵌入式系统中的地位,用作存储Bootloader以及操作系统或者程序代码或者直接当硬盘使用(U盘)。 
    • 目前Flash主要有两种NOR FlashNADN Flash
    • NOR Flash的读取和我们常见的SDRAM的读取是一样,用户可以直接运行装载在NOR FLASH里面的代码,这样可以减少SRAM的容量从而节约了成本。
    • NAND Flash没有采取内存的随机读取技术,它的读取是以一次读取一块的形式来进行的,通常是一次读取512个字节,采用这种技术的Flash比较廉价。用户不能直接运行NAND Flash上的代码,因此好多使用NAND Flash的开发板除了使用NAND Flah以外,还作上了一块小的NOR Flash来运行启动代码。 
    • 一般小容量的用NOR Flash,因为其读取速度快,多用来存储操作系统等重要信息,而大容量的用NAND FLASH,最常见的NAND FLASH应用是嵌入式系统采用的DOC(Disk On Chip)和我们通常用的'闪盘',可以在线擦除。目前市面上的FLASH 主要来自Intel,AMD,Fujitsu和Toshiba,而生产NAND Flash的主要厂家有Samsung和Toshiba。

    Nandflash和No人flash最大区别:

    • 容量的大小:Norflash容量小,约有64K~2M,Nandflash,约128M~256G。
    • 因此Norflash一个地址对应一个空间,可直接访问,Nandflash无法直接访问。
    • Nandflash容易有坏块,需要通过软件格式化。
    • 价格上Norflash>Nandflash
    展开全文
  • STM32内存结构总结

    千次阅读 2019-02-11 17:11:14
    STM32内存结构总结 文中引用图片来源与网络 本文由各方面资料整理而成 文章目录STM32内存结构总结0.STM32内存结构图1.要点1.1 两种存储类型: RAM 和 Flash1.2 六类存储数据段: .data/.bss/.text/.constdata/...
    1. 文中引用图片来源与网络
    2. 本文由各方面资料整理而成

    0.STM32内存结构图

    在这里插入图片描述
    在这里插入图片描述

    1.要点

    1.1 两种存储类型: RAM 和 Flash

    • RAM可读可写,在STM32的内存结构上,RAM地址段分布[0x2000_0000, 0x2000_0000 + RAM size)
    • Flash只读,在STM32的内存结构上,Flash地址段[0x0800_0000, 0x2000_0000)

    1.2 六类存储数据段: .data/.bss/.text/.constdata/heap/stack

    • .data数据段: 用来存放初始化了但不是初始化为0的全局变量(global)和静态变量(static)。它是可读可写的
    • .bss(Block Started by Symbol)数据段: 用于存放没有初始化或初始化为0的全局变量和静态变量,可读可写,如果没有初始化, 系统会将变量初始化为0.
    • .text代码段: 用来放程序代码(code), 在代码编译完成后, 长久只读存放于此.
    • .constdata只读常量数据段: const限定的数据类型存放与此,只读.
    • heap堆区: 通常只我们说的动态内存分配,使用内存分配器(memory allocator)管理, malloc/free进行申请和释放
    • stack栈区: 在代码执行时用来保存函数的局部变量和参数。其操作方式类似于数据结构中的栈,是一种“后进先出”(Last In First Out,LIFO)的数据结构。这意味着最后放到栈上的数据,将会是第一个从栈上移走的数据,对于哪些暂时存储的信息,和不需要长时间保存的信息来说,LIFO这种数据结构非常理想。在调用函数或过程后,系统通常会清除栈上保存的局部变量、函数调用信息及其它信息。栈的顶部通常在可读写的RAM区的最后,其地址空间通常“向下减少”,即当栈上保存的数据越多,栈的地址就越小。

    1.3 三种存储属性区: RO/RW/ZI

    • RO (Read Only ): 只读区域, 需要长久保存,烧写到Rom/Flash段,上文数据段的.text段和.constdata段属于此属性区(有时.constdata 段也被叫做 RO-data段, 和这个广义的RO注意区分)
    • RW (Read Write): 可读可写的初始化了的全局变量和静态变量段,上文中的.data段属于RW区
    • ZI (Zero Init): 没有进行初始化或者初始化为0,系统上电时会主动把此区域数据进行0初始化,上文的.bss段就是. 另外, 可翻看Keil工具编译的map文件,Heap和Stack区也进行了Zero的属性标注, 因此, Heap和Stack也可认为是ZI区域

    RW区比较特别, 可读可写但又进行了初始化,因为RAM中的数据是掉电不可保存的,因此RW区的.data段数据也需要保存在Rom/Flash里面,上电时候再将此类数据复制到RAM区域读写使用。而ZI区域数据不需要掉电保存,直接上电时初始化为0即可使用,因此不需要保存在ROM中。这样,计算RAM/ROM占用空间的公式:

    ROM Size = .text + .constdata + .data (RO + RW)
    RAM Size = .bss + .data (ZI + RW)

    这里RAM size计算时未考虑Stack和Heap区, 实际size是大于此的, 因为这两个区域具备动态变化的复杂性,难于估计。

    定义一个全局数组变量举例:

    1. static unsigned char test[1024];  //全局、未初始化, ZI区,不影响ROM size
    2. static unsigned char test[1024] = {0};  //全局、初始化为0, ZI区,不影响ROM size
    3. static unsigned char test[1024] = {1};  //全局、初始化为非0, RW(.data)区,ROM Size 扩大
    

    1.4 扩展说说Heap

    在STM32的启动代码startup_*.s文件中,一般这样定义了堆大小:
    Heap_Size      EQU     0x200;
    

    在实际使用中, 这个区域可能比1.2节提到的简洁描述更为复杂。

    1. 很多小项目没有使用内存分配器: 由于各种原因(RAM不足、程序简单、etc),一些所必须的大块或固定内存直接使用数组的方式定义使用,绕开了内存分配器。那么这个时候, Heap_Size 的存在是没有意义的, Heap_Size 定义越大,越浪费空间,可以直接Heap_Size定义为0。这个时候, 本来该堆区提供的空间可能定义在了.bss段(全局/静态数组没有初始化)、或.data(全局/静态数据初始化为非0)、或Stack上(使用了局部数组变量, Tips: 但大的数组不建议定义在stack, 否则可能栈溢出)
    2. 重新实现内存分配器:没有直接将内存分配器直接映射在堆区,而是先定义大的数组内存(可能在.bss或.data, 为避免在ROM存储, 最好在.bss), 再将这块内存给内存分配器支配使用
    3. 内存分配器直接使用Heap区: 这个时候就要计算好预留多少空间给Stack区, 留多了,Stack用不上浪费;留少了极可能造成Stack溢出而程序崩溃
    4. 除了使用自带RAM外,同时使用外部扩展RAM: 这就需要内存分配器来管理好几块地址不连续的RAM空间了

    nix.long
    2017.08.04

    展开全文
  • ...1、msp430的存储结构采用冯.依曼结构,即RAM和Flash在同一个寻址空间内统一编址,没有代码空间和数据空间之分。...2、Flash是以段为为基本结构进行存储的。总体上分三部分:  Flash主存储区: 用于存储程
  • 内存FLASH的区别总结

    千次阅读 2013-09-17 10:58:58
    内存(RAM或ROM)和FLASH存储的真正区别总结2009-11-24 19:063.ROM和RAM指的都是半导体存储器 1)ROM是Read Only Memory的缩写  是一种半导体内存,其特性是一旦储存资料就无法再将之改变或删除。通常用在不需经常...
  • TC297内存结构

    千次阅读 2020-10-14 19:11:46
    主要负责Flash Memory 和 BootRom的控制,并把他们连接到SRI CrossBar. SPB: System Peripheral Bus; SRI: Shared Resource Interconnect; ECC: Error Correction Code; HSM: Hardware Security Module; UCB: User ...
  • NAND Flash结构与驱动分析

    千次阅读 2009-10-13 17:06:00
    一、NAND flash的物理组成NAND Flash 的数据是以bit的方式保存在memory cell,一般来说,一个cell 中只能存储一个bit。...这些Line会再组成Page,(NAND Flash 有多种结构,我使用的NAND Flash 是K9
  • Nandflash存储结构和地址分配

    千次阅读 2017-06-19 00:16:31
    以三星的256MB nandflash存储结构介绍: 计算物理地址:0X32F018 (16) K9F2G08U0C是samsun出产的FLASH,容量为256MB  页--Page:(2K + 64)Byte  块--Block:(128K + 4K)Byte 128/ 2 = 64 Page 256M/ 128 K = 2048 ...
  • 内存FLASH的区别

    千次阅读 2015-06-29 00:08:18
    在计算机的组成结构中,有一个很重要的部分,就是存储器。存储器是用来存储程序和数据的部件,对于计算机来说,有了存储器,才有记忆功能,才能保证正常工作。存储器的种类很多,按其用途可分为主存储器和辅助存储器...
  • 内存、ram、 rom、 norflash,nandflash详细区别

    千次阅读 多人点赞 2016-12-14 23:53:58
    在计算机的组成结构中,有一个很重要的部分,就是存储器。存储器是用来存储程序和数据的部件,对于计算机来说,有了存储器,才有记忆功能,才能保证正常工作。存储器的种类很多,按其用途可分为主存储器和辅助存储器...
  • U-boot内存结构

    千次阅读 2010-05-18 13:36:00
    当然这应该也是一般的bootloader的执行方式,大家都差不多,但是各个bootloader的内存规划(栈,堆之类的)也 不太一样,而且u-boot还在内存空间中规划了一些用于存放环境变量和一些数据结构的空间,所以如果不了解...
  • u-boot的内存分布和全局数据结构

    千次阅读 2013-03-10 16:36:54
    当然这应该也是一般的bootloader的执行方式,大家都差不多,但是各个bootloader的内存规划(栈,堆之类的)也 不太一样,而且u-boot还在内存空间中规划了一些用于存放环境变量和一些数据结构的空间,所以如果不了解...
  • 内存、数据结构之栈和堆的区别?

    千次阅读 多人点赞 2018-01-15 15:56:37
    网上有一篇很好的文章,我差不多直接搬运...数据结构的堆栈我想很多同学学习过,今天介绍下数据结构的堆栈,但是重点是内存的堆栈整理。 数据结构的栈和堆 首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上
  • W25Q32共32M-bit(4MB字节),它可划分为64块,每块64KB;每块又可划分为16个扇区,每个扇区4KB;每个扇区又可划分16页...本文档详细讲解了其内部存储结构,从字节地址、页地址、扇区地址和块地址详细介绍了存储结构
  • 原文地址:flash垃圾回收机制,内存泄漏的常见情况及内存释放优化的原则作者:鐔婄尗鍛煎暒 一、Flash Player垃圾回收机制: Flash Player垃圾回收工作是由垃圾回收器(garbage collector)完成的。垃圾回收器是...
  • 本文以STM32F103ZE为原型,来剖析其内存结构,从而了解其内存物理地址,分配结构以扩展应用。
  • CC2540 内存结构分析

    千次阅读 2014-11-11 20:22:58
     XDATA的高32k地址用于访问FLASH,CC2540一共有128页,每页2KB空间,一共256KB的FLASH空间,前面我们已经知道,CODE地址域已经有64K空间映射到了FLASH,而且是只读的,因此只剩下192KB用于存储数据(实际上更少)。...
  • 数据结构算法的实现(其中有flash播放),对学习数据结构,学习常用算法以及对其进行实现很有帮助。包括各种排序算法(插入排序,快速排序,选择排序,归并排序,基数排序,计数排序,桶排序、冒泡排序,堆排序等等...
  • Flash&flex应用内存泄露的分析与诊断

    千次阅读 2012-11-12 18:29:04
    Flex 采用 ActionScript 语言作为脚本语言,编译后的二进制代码在 FlashPlayer 虚拟机 AVM(Actionscript Virtual Machine)中运行。和 Java 语言类似,AVM 中也有一个垃圾收集器(Garbage Collection),对于不用的...
  • STM32F407 flash内存

    万次阅读 2017-08-06 19:17:28
    硬件平台:STM32F4 DISCOVERY开发板 型号:MB997A或MB997C 主芯片型号:STM32F405xx, STM32F407xx, STM32F415xx, 或 STM32F...(1)PM0081 STM32F40xxx and STM32F41xxx Flash programming manual.pdf (2)STM32F407
  • flash builder内存优化及解决FB挂机

    千次阅读 2014-09-05 10:37:58
    Flash Builder 4.6 的初始化jvm参数来提高可用内存,并且发现性能得到了显著的提高。我是在mac上进行的标准安装,点击FB4.5的启动文件,选择 “Show Package Contents”,在Contents/MacOS/ folder 文件夹下能找到FB...
  • 堆和栈的区别(内存和数据结构

    千次阅读 2016-07-26 11:42:01
    首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈。 堆和栈都是一种数据项按序排列的数据结构
  • 前言: 在嵌入式开发中,如uboot的移植,kernel的移植...一,Flash内存存储结构flash按照内部存储结构不同,分为两种:nor flash和nand flash。Nor FLASH使用方便,易于连接,可以在芯片上直接运行代码,稳定性出...
  • 上电后,CPU通过控制器将待运行的程序从FLASH中读入内存中; 代码在内存中运行时,控制器将需要计算的数据存入寄存器中; 运算器从寄存器中读取数据进行运算,并将结果存入寄存器中; 控制器将寄存器中的结果读入...
  • 总结内存(RAM或ROM)和FLASH存储的真正区别

    千次阅读 多人点赞 2019-07-04 11:31:41
    本文主要向大家介绍了内存(RAM或ROM)和FLASH存储的真正区别,通过具体的分析,让大家能够了解它们,希望对大家学习内存(RAM或ROM)和FLASH存储有所帮助。 1.什么是内存 什么是内存呢?在计算机的组成结构中,有一个很...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,387
精华内容 19,354
关键字:

内存flash结构