0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MCU的存储器组织知识

Q4MP_gh_c472c21 来源:未知 作者:李倩 2018-06-07 15:54 次阅读

首先说一下 MCU 的存储器组织。

蒙圈,MCU 中常使用的存储器类型有:FLASH、RAMROM(包括EEPROM)

在软件角度来看,程序和数据的存储分为以下几个部分:

注:

1.代码段和常量段都可以用于保存常量数据,其主要区别是,如果常量可以作为汇编指令的一个操作数,则该常量被编译进代码段。如果不能用一个汇编操作数表示,则存于常量段。如 "uchar a=0x05;" 中的 "0x05" 将被编译成代码 "mov #0x05, a";如果是 "uchar a[]={0x05, 0x06}" 则 "0x05,0x06" 被放置于常量段, 在初始化 a[] 的时候会有一段汇编指令用于将常量段中的内容拷贝到 a[] 中。

软件存储区与硬件存储器类型是怎么对应的呢?

一般来讲如下:

注:

1.MCU 中的 ROM 通常用于存储制造商信息控制器型号等信息;

2.对于 x86 体系结构的系统,因为没有 Flash 类型的存储器,所以,所有的软件存储区最终都加载到内存中,但是其内存是分段的,用户对不同内存段的访问权限不同,其代码段和常量段不可以被用户修改,如果意外修改则抛出段错误异常。

知道了存储器类型和各存储区的划分之后,让我们来看以下三组程序:

1.

staticvoidProcStr(void)

{

ucharStr[]={"12345"};

}

这段程序中,Str[] 是一个局部数组,其大小为 6,占用的堆栈空间是 2 个字符;"12345" 是常量,被存储在常量段;Str[] 的初始化过程,相当于从常量区拷贝 6 个字符的数据到栈中,这 6 个字符是"12345\0"。

2.

staticvoidProcStr(void)

{

ucharStr[]="12345";

}

这段程序中,Str[] 是一个局部数组,其大小为 6,占用的堆栈空间是 2 个字符;"12345" 是常量,被存储在常量段;Str[] 的初始化过程,相当于从常量区拷贝 6 个字符的数据到栈中,这 6 个字符是 "12345\0"。

3.

staticvoidProcStr(void)

{

constuchar*Str="12345";

}

这段程序中没有数组,唯一的Str 是一个局部指针,其大小为 4(在 32 位系统中),因此这段程序只占用 4(在 32 位系统中)个字符的堆栈空间;"12345"是常量,被存储在常量段;Str 的初始化过程,是将指针Str 初始化为常量"12345"的地址,后续程序通过指针Str直接访问常量段,无需内存拷贝过程。

从以上分析可以看出,前两种方法是一样的,都需要为局部数据分配存储空间,并将静态存储区的数据拷贝过来,而最后一种方法是通过指针直接访问静态数据而无需拷贝。如果字符串长度大于系统中指针的长度,第三种方法将在时间和空间上大大优于前两种方法(第三种方法极大的节省了堆栈空间,并减少了拷贝数据所用的时间)。

但是,对于 MCU 来说,并不总是第三种方法好,原因在于第三种方法是直接访问常量段,由上面的表可知,对于将常量存储于 Flash 的 MCU 来说,访问常量段要比访问 RAM 慢得多。因此,如果接下来要频繁访问这个字符串,那么,采用前两种方法在速度上将会更优一些,理由是前两种方法只需要访问一次 Flash,而第三种方法则每次都需要访问 Flash。

当然,如果在接下来的程序中,需要修改字符串Str 中的内容,那就只能采用前两种方法,第三种方法将会提示错误。

特殊说明:今天讲的一些内容跟编译器的特性相关,不同编译器,甚至相同编译器的不同版本间存在一定差异。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16977

    浏览量

    350215
  • 存储器
    +关注

    关注

    38

    文章

    7447

    浏览量

    163584
  • 编译器
    +关注

    关注

    1

    文章

    1618

    浏览量

    49043

原文标题:嵌入式程序开发需要知道的存储器知识

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    #硬声创作季 #嵌入式 #MCU存储器设计片选译码技术

    mcu存储器
    学习电子知识
    发布于 :2022年11月02日 21:12:32

    MCU存储器组织

    首先说一下 MCU存储器组织。蒙圈,MCU 中常使用的存储器类型有:FLASH、RAM、ROM(包括EEPROM)在软件角度来看,程序和
    发表于 08-08 17:10

    存储器是如何组织的?是如何与处理总线连接的?

    第一套在8086的微计算机系统中,存储器是如何组织的?是如何与处理总线连接的?#BHE信号起什么作用?答:8086 为 16 位处理,可访问 1M 字节的
    发表于 07-26 06:06

    STM32存储器组织程序

    STM32 存储器存储器组织1. FLASH2. SRAM3. 启动一 存储器组织程序存储器
    发表于 08-02 06:06

    集成铁电存储器MCU有何作用

    集成铁电存储器MCU,由于在MCU上集成了铁电存储器,该产品数据写入速度比基于闪存和EEPROM的MCU快100倍,功耗降低250倍。它还
    发表于 11-10 08:28

    CPU结构执行单元BIU寄存存储器组织结构

    前言 ´・ᴗ・`微机系统的构成外设CPU结构执行单元BIU寄存存储器组织结构 寻址方式总结 ´◡`
    发表于 12-10 07:56

    存储器与通用寄存的相关资料下载

    基础知识梳理一、 存储器与通用寄存1. 存储器每一天清晨,当我们在梦中醒来的时候,记忆就会填充大脑的空白,我们会想起最近做过的一些重要的事情,当然也有些小的事情无法准确的记忆起,但这
    发表于 12-13 06:29

    聊聊存储器的相关知识

    虚拟地址物理地址等众多地址及MMU相关知识先聊聊存储器STM32单片机存储器关于编译生成的文件数据在存储器上的
    发表于 02-11 07:51

    相变存储器(PCM)技术基础知识

    相变存储器(PCM)技术基础知识 相变存储器(PCM)是一种非易失存储设备,它利用材料的可逆转的相变来存储信息。同一物质可以在诸如固体、液
    发表于 11-23 09:19 3100次阅读

    EE-17:ADSP-2187L存储器组织

    EE-17:ADSP-2187L存储器组织
    发表于 04-27 14:54 1次下载
    EE-17:ADSP-2187L<b class='flag-5'>存储器</b><b class='flag-5'>组织</b>

    MCU存储器介绍

    SRAM(StaticRandom-AccessMemory):静态随机存储器,所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。DRAM(Dynamic Random
    发表于 10-28 09:51 11次下载
    <b class='flag-5'>MCU</b>的<b class='flag-5'>存储器</b>介绍

    MCU片内非易失性存储器操作应用笔记

    电子发烧友网站提供《MCU片内非易失性存储器操作应用笔记.zip》资料免费下载
    发表于 09-22 10:00 0次下载
    <b class='flag-5'>MCU</b>片内非易失性<b class='flag-5'>存储器</b>操作应用笔记

    存储器工作原理及如何选择存储器品牌

    存储器是用来存储程序和各种数据信息的记忆部件,更通俗地说,存储器就是用来存放数据的地方。存储器可分为主存储器(简称主存或内存)和辅助
    的头像 发表于 10-11 16:58 3643次阅读

    浅谈MCU中集成新型存储器的选择

    基于上述因素,越来越多的MCU大厂开始选择在MCU中集成新型存储器,比如相变存储器(PCM)、磁RAM(MRAM)和阻变存储器(RRAM)等
    发表于 12-01 20:28 901次阅读

    AT32 MCU如何设定启动存储器为主存扩展

    AT32 MCU如何设定启动存储器为主存扩展
    的头像 发表于 10-18 17:50 590次阅读
    AT32 <b class='flag-5'>MCU</b>如何设定启动<b class='flag-5'>存储器</b>为主存扩展