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

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

3天内不再提示

浅析MCU的内存分配与代码执行

GReq_mcu168 来源:未知 作者:胡薇 2018-09-04 16:25 次阅读

单片机执行指令过程详解

单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可分为三个阶段进行。即取指令-----分析指令-----执行指令。

取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器

分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。如指令要求操作数,则寻找操作数地址。

计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。

一般计算机进行工作时,首先要通过外部设备把程序和数据通过输入接口电路和数据总线送入到存储器,然后逐条取出执行。但单片机中的程序一般事先我们都已通过写入器固化在片内或片外程序存储器中。因而一开机即可执行指令。

下面我们将举个实例来说明指令的执行过程:

开机时,程序计算器PC变为0000H。然后单片机在时序电路作用下自动进入执行程序过程。执行过程实际上就是取出指令(取出存储器中事先存放的指令阶段)和执行指令(分析和执行指令)的循环过程。

例如执行指令:MOV A,#0E0H,其机器码为“74H E0H”,该指令的功能是把操作数E0H送入累加器,0000H单元中已存放74H,0001H单元中已存放E0H。当单片机开始运行时,首先是进入取指阶段,其次序是:

1 程序计数器的内容(这时是0000H)送到地址寄存器;

2 程序计数器的内容自动加1(变为0001H);

3 地址寄存器的内容(0000H)通过内部地址总线送到存储器,以存储器中地址译码电跟,使地址为0000H的单元被选中;

4 CPU使读控制线有效;

5 在读命令控制下被选中存储器单元的内容(此时应为74H)送到内部数据总线上,因为是取指阶段,所以该内容通过数据总线被送到指令寄存器。

至此,取指阶段完成,进入译码分析和执行指令阶段。

由于本次进入指令寄存器中的内容是74H(操作码),以译码器译码后单片机就会知道该指令是要将一个数送到A累加器,而该数是在这个代码的下一个存储单元。所以,执行该指令还必须把数据(E0H)从存储器中取出送到CPU,即还要在存储器中取第二个字节。其过程与取指阶段很相似,只是此时PC已为0001H。指令译码器结合时序部件,产生74H操作码的微操作系列,使数字E0H从0001H单元取出。

因为指令是要求把取得的数送到A累加器,所以取出的数字经内部数据总线进入A累加器,而不是进入指令寄存器。至此,一条指令的执行完毕。单片机中PC=0002H,PC在CPU每次向存储器取指或取数时自动加1,单片机又进入下一取指阶段。这一过程一直重复下去,直至收到暂停指令或循环等待指令暂停。CPU就是这样一条一条地执行指令,完成所有规定的功能。

对于一款mcu来说,在性能描述的时候都会告诉sram,flash的容量大小,对于初学者来说,也不会去考虑和理会这些东西,拿到东西就只用。其实不然,这些量都是十分重要的,仔细想想,代码为什么可以运行,代码量是多少,定义的int、short等等类型的变量究竟是怎么分配和存储的,这些问题都和内寸有关系。

首先单片机的内存可以大小分为ram和rom,这里就不再解释ram和rom的区别了,我们可以将其等效为flash和sram,其中根据flash和sram的定义可得,flash里面的数据掉电可保存,sram中的并不可以,但是sram的执行速度要快于flash,可以将单片机的程序分为code(代码存储区)、RO-data(只读数据存储区)、RW-data(读写数据存储区)和ZI-data(零初始化数据区)。在MDK编译器下可以观察到在代码中这4个量的值,如下图1所示:

图1:

其中code和RO-data存储在flash中,所以两者之和为单片机中flash需要分配给它们的空间大小(并且等于代码所生成的.bin文件大小),另外RW-data和ZI-data存储在sram中,同样两者之和为单片机中sram需要分配给它们的空间大小。

另外,我们必然会想到栈区(stack)、堆区(heap)、全局区(静态区)(staTIc)、文字常量区和程序代码区和上面所介绍的code、RO-data等的关系。

1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 这些值是可读写的,那么stack应该被包含在RW-data(读写数据存储区),也就是单片机的sram中。

2、堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。可以理解,这些也是被包含在单片机的sram中的。

3、全局区(静态区)(staTIc):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。这些数据也是可读可写的,和stack、heap一样,被包含在sram中。

4、文字常量区:常量字符串就是放在这里的。这些数据是只读的,分配在RO-data(只读数据存储区),则被包含在flash中。

5、程序代码区:存放函数体的二进制代码,可以想象也是被包含在flash,因为对于MCU来说,当其重新上电,代码还会继续运行,并不会消失,所以存储在flash中。

综上所述,MCU的内存分配基本如此,其中并没有提到存储空间所对应的flash和sram地址,这些后面还会讲到!

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

    关注

    5991

    文章

    43904

    浏览量

    619617
  • mcu
    mcu
    +关注

    关注

    145

    文章

    15885

    浏览量

    342777
  • 内存
    +关注

    关注

    8

    文章

    2737

    浏览量

    72614

原文标题:单片机如何执行代码命令,单片MCU内存如何分配?

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言知识总结:动态内存分配

    动态内存分配就 是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态
    发表于 10-24 15:52 634次阅读

    CYT4BF通过分配ITCM内存来使用经常执行代码,下载程序时报错的原因?

    我正在使用 CYT4BF,我想通过分配 ITCM 内存来使用经常执行代码。 SDL 的 tcm 示例中似乎没有 itcm 示例。 我在 linker_directives.ld 文件
    发表于 01-31 06:34

    C语言内存分配-通俗理解

    可以看出程序在未运行前,没有调入到内存时,分为三个部分:代码区(text)、数据区(data)、未初始化数据区(bss)。(1) 代码区(text)存放CPU可执行的机器指令,由于程序
    发表于 10-08 14:57

    单片机如何执行代码命令,单片MCU内存如何分配

    是只读的,分配在RO-data(只读数据存储区),则被包含在flash中。 5.程序代码区:存放函数体的二进制代码,可以想象也是被包含在flash,因为对于MCU来说,当其重新上电,
    发表于 06-20 14:19

    MCU内存分配方法,错过绝对后悔

    MCU内存分配参考ram(即SRAM)和rom(即Flash)参考http://www.eeworld.com.cn/mcu/2014/1212/article_17648.htmlr
    发表于 11-01 06:56

    如何在MCU上进行内存管理与分配

    从事嵌入式产品开发已有十余年了,从最开始的8051一直用到现在流行的Cortex M系列的内核的单片机。从最开始用VC6.0开发PC端的软件到现在使用Mircrosoft WPF框架进行PC端的软件开发。发现现在的新人对MCU内存管理与
    发表于 11-04 06:06

    动态内存分配是什么意思

    所谓动态内存分配(Dynamic Memory Allocation)就是指在程序执行的过程中动态地分配或者回收存储空间的分配
    发表于 12-17 08:17

    PSD813F和其它MCU组合内存分配图的举例

    PSD813F和其它MCU组合内存分配图的举例
    发表于 05-13 11:20 9次下载
    PSD813F和其它<b class='flag-5'>MCU</b>组合<b class='flag-5'>内存</b><b class='flag-5'>分配</b>图的举例

    单片机如何执行代码命令,单片MCU内存如何分配

    由于本次进入指令寄存器中的内容是74H(操作码),以译码器译码后单片机就会知道该指令是要将一个数送到A累加器,而该数是在这个代码的下一个存储单元。所以,执行该指令还必须把数据(E0H)从存储器中取出
    发表于 05-04 10:55 1571次阅读

    进程虚拟内存布局以及进程的虚拟内存分配释放流程,涉及的代码

    我们计划通过一系列文章来介绍虚拟内存分配/释放,缺页处理,内存压缩/回收,内存分配器等知识,梳理虚拟内存
    的头像 发表于 06-28 09:38 3529次阅读

    什么是堆内存?堆内存是如何分配的?

    在一般的编译系统中,堆内存分配方向和栈内存是相反的。当栈内存从高地址向低地址增长的时候,堆内存从低地址向高地址
    的头像 发表于 07-05 17:58 9413次阅读

    MCU内存分配

    MCU内存分配参考ram(即SRAM)和rom(即Flash)参考http://www.eeworld.com.cn/mcu/2014/1212/article_17648.htmlr
    发表于 10-25 11:51 7次下载
    <b class='flag-5'>MCU</b><b class='flag-5'>内存</b><b class='flag-5'>分配</b>

    MCU内存分配与管理

    从事嵌入式产品开发已有十余年了,从最开始的8051一直用到现在流行的Cortex M系列的内核的单片机。从最开始用VC6.0开发PC端的软件到现在使用Mircrosoft WPF框架进行PC端的软件开发。发现现在的新人对MCU内存管理与
    发表于 11-01 16:24 10次下载
    <b class='flag-5'>MCU</b><b class='flag-5'>内存</b><b class='flag-5'>分配</b>与管理

    C语言程序编译后内存地址的分配

    本文目的是简要介绍C语言编译得到的可执行文件加载到内存运行时不同变量分配的存储位置,并通过在Ubuntu 18.04系统和STM32系统上进行编程验证C语言编译后内存地址
    发表于 01-13 14:23 1次下载
    C语言程序编译后<b class='flag-5'>内存</b>地址的<b class='flag-5'>分配</b>

    如何高效管理MCU内存? 多种分配算法对比?

    如何高效管理MCU内存? 多种分配算法对比?
    的头像 发表于 10-17 18:21 563次阅读
    如何高效管理<b class='flag-5'>MCU</b><b class='flag-5'>内存</b>? 多种<b class='flag-5'>分配</b>算法对比?