对单片机地址空间和堆栈的理解

data—可寻址片内ram 0x00-0x7f
bdata—可位寻址片内ram
idata—可寻址片内ram,允许访问全部内部ram 0x00-0xff
padata—分页寻址访问片外ram
xdata—可寻址片外ram 0x0000- 0xffff

程序存储区单片机存储器有ROM跟RAM之分,RAM存放中间结果,数据和经常变换的代码,ROM存放code。51单片机采用的是哈弗结构,即数据跟代码拥有单独的地址空间。存储器可以分为程序存储器(EEPROM、FLASH之类)、内部数据存储器(ram)、SFR、位地址空间和外部数据存储器。

“”

内部数据存储器在物理上分为内部SRAM和特殊功能寄存器,而内部分为低(0x00-0x7f)和高(0x80-0xff),高128字节地址重复,需要不同的访问方式。SFR用直接寻址方式,SRAM需要间接方式。这里SFR是寄存器,硬件上是中央处理器的内部组成部分,访问速度很快。在低128B的SRAM,0x00-0x1f是4个通用工作寄存器,每组有R0-R7。要使用哪一组,都可以通过PSW中的RS1、RS0来配置。位寻址是在0x20-0x2f。

程序内存可以分为几个区,包括栈区(stack)、堆区(Heap)、全局区(static)、文字常亮区和程序代码区。程序编译之后,全局变量,静态变量已经分配好内存空间。在函数运行时,程序需要为局部变量分配栈空间。当中断来时,也需要将函数指针入栈,保护现场,以便于中断处理完之后再回到之前执行的函数。栈是从高到低分配,堆是从低到高分配。我们一般说的堆栈往往指的是栈。堆栈又分硬堆栈和软堆栈,硬堆栈即SP,从片内RAM的顶部向下生长。软堆栈在硬堆栈跟全局变量区之间的空间。C51函数调用通过R0-R7和栈来实现。

为什么单片机启动时,不需要用bootloader将代码从ROM搬移到RAM,而ARM则需要?这里我们可以先看看单片机程序执行的过程。

单片机执行分三个步骤,取执行——分析指令——执行指令。

取指令的任务是:根据PC的值从程序存储器读出指令,送到指令寄存器,然后分析执行。这样单片机就从内部程序存储器取代码指令,从RAM存取相关数据。要知道RAM取数的速度是远高于ROM的,但是单片机因为本身运行频率不高,所以从ROM取指令慢并不构成影响。而ARM不同,CPU运行的频率高,远大于从ROM读写的速度,所以一般只要有操作系统,都需要将代码部分拷贝到RAM中再执行。

本文转载自:今日头条(版主:小魁说事)
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理。

点击这里,获取更多关于应用和技术的有关信息
点击这里,获取更多工程师博客的有关信息

最新文章