您的位置:首页 > 其它

第2章 存储组织【1】

2005-03-24 16:20 106 查看
2.1 程序模型和存储映射
P89C669保持了所有的80C51的存储空间。附加的存储空间也被透明的作为一部分添加进去,允许扩展寻址。基本的存储空间包括代码存储空间(可以是片内的或者片外的或者二者都有)、外部数据存储空间、特殊功能寄存器和内部数据存储空间(包括片内RAM,寄存器和堆栈),还有后备的被用作内部数据存储的扩展,允许一个较大的处理器堆栈。
下图显示了P89C669的程序模型和存储映射:
Figure 3.
图形三
下面的列表详细描述了51MX存储空间的不同部分:
DATA 128字节的内部数据存储空间(00h~7Fh),可以通过直接或者间接寻址,使用除了MOVX和MOVC的其他指令访问。所有或者部分的堆栈可以放在这个区域。
IDATA 间接数据(Indirect DATA)。256字节的内部数据内存空间(00h~FFh),可以通过间接寻址,使用除了MOVX和MOVC的其他指令访问。所有或者部分的堆栈可以放在这个区域,这一区域包括了DATA区域和这里的128个字节的。
EDATA 扩展数据(Extended DATA)。这是一个DATA和IDATA的超集。P89C669在EDATA存储空间中,有1280字节的SRAM。这个附加的区域可以被用做堆栈访问,通过使用通用指针的间接寻址。堆栈可以放置在扩展的区域,如果这样做可以的话。EDATA的内容可以使用EMOV指令在任何时候访问,不管MXCON中的位EAM。
SFR 特殊功能寄存器。包括挑选的部分CPU寄存器,外围控制和状态寄存器,可以且仅可以通过直接寻址访问(寻址范围在80h~FFh)。这个也包括新的51MX扩展的特殊功能寄存器。
XDATA 外部数据(eXternal DATA)。和经典的80C51的64KB存储空间一样,可以通过MOVX指令并使用DPTR、EPTR、R0或者R1访问。片内的XDATA可以在程序的控制下被禁止掉。同样,XDATA也可以放置外部设备。P89C669有768字节的片内XDATA存储空间。
HDATA 高端数据(High DATA)。这是一个XDATA的超集,可以包括高至8,323,072字节(8M~64KB)的存储空间,可以通过MOVX指令并使用EPTR、DPTR、R0或者R1来访问。HDATA中非XDATA部分被放置外部设备。
CODE 64KB的内部代码存储空间(0000h~FFFFh),被用来做程序存储和数据(通过MOVC指令)。
ECODE 最高大8MB的代码存储,可以作为程序执行的一部分或者通过MOVC指令访问。
除了SFR的所有这些空间也可以用EMOV指令,通过使用通用指针的寻址方式访问。这个特性在后面的节中被详述。
TABLE 1
Memory Size (Bytes) and MX UniversalMemory Map Range
Type Description P89C669
DATA data memory that can be addressed both directly and indirectly; can be used as stack 128 (7F:0000-7F:007F)
IDATA superset of DATA; memory that can be addressed indirectly (where direct address for upper half is for SFR only); can be used as stack 256 (7F:0000-7F:00FF)
EDATA superset of DATA/IDATA; memory that can be addressed indirectly using Universal Pointers (PR0,1); can be used as stack 1280 (7F:0000-7F:04FF)
XDATA memory (on-chip "External Data") that is accessed via the MOVX instructions using DPTR/EPTR 768 (00:0000-00:02FF)
CODE code memory used for program storage and data access using MOVC and EMOV 65536 (80:0000-80:FFFF)
ECODE code memory used for program storage; data access can be accomplished using Universal pointers (PR0,1) and EMOV 98304 (80:0000-81:7FFF)
表一
2.2 数据存储(DATA,IDATA和EDATA)
标准的80C51内部数据存储由256字节的DATA/IDATA RAM组成,它总都是片内的。在这个空间中有:数据寄存器(R0~R7),缺省堆栈,一点可以寻址的RAM区域和通用目的数据RAM。在DATA/IDATA存储空间的顶部是一个1024字节的RAM块,它可以作为堆栈访问或者通过间接寻址访问。这样一起形成1280字节的EDATA RAM。数据存储的不同部分在下面的节中被描述。
2.2.1 寄存器R0~R7
通用目的寄存器R0~R7允许快速、有效的访问一些内部数据存储的情况。比如这个指令:
MOV A,R0
只使用了一字节的代码并且执行只用了1个机器周期。使用直接寻址来完成同样的结果,如:
MOV A,10h
需要两个字节的代码存储空间和两个机器周期的执行时间。间接寻址还需要一些指针寄存器的设置等。
这些寄存器是"堆叠"(bank)的,即有四组寄存器,任何一组都可以被选择用来表示从R0到R7在适当的时候。期望的寄存器"堆叠"使用PSW特殊功能寄存器中的位RS1和RS0来选择。这一特性可以被用来最小化在中断服务或者子例程的上下文环境切换的时间,或者为复杂算法提供更多寄存器空间。
寄存器和其他内部数据存储情形没有不同,除了它们可以用"速记"符号寻址,如:"R0"、"R1"等。换句话说,寻址内部数据存储的指令,如直接或者间接寻址,都完全可以访问作为4个"堆叠"中任一寄存器组中同样的物理存储位置。
TABLE2
RS1 RS0 bank memory segment in DATA
0 0 Bank 0 00h...07h
0 1 Bank 1 08h...0Fh
1 0 Bank 2 10h...17h
1 1 Bank 3 18h...1Fh
2.2.2 可按位寻址的RAM
内部数据存储区域20h到2Fh可以作为字节和位被访问。这样提供了一个方面的、有效的方式来操作独立的标志位,而不用使用很多的存储空间。最底下的位所在的字节在地址20h,位编号为00h,下一位在同一字节,位编号为01h等等,最后一位,也就是在2Fh的字节的位7,位编号为7Fh(127).上面提到的位编号都和特殊功能寄存器中位相关。
这段代码:
SETB 20h.1
CPL 20h.2
JNB 20h.2, LABEL1
设置在地址20h的位1(置位),补足同样字节的位2(求补),然后如果第二位不和1相等就分支(跳转)。在实际的程序中,这些位通常会被给予一些名字,并且提供给位操作指令使用。
2.2.3 扩展数据存储(EDATA)
51MX架构允许对内部数据存储空间进行超过(80C51经典的)256字节限制的扩展。这一空间可以被用来作为一个扩展的或者可选的处理器堆栈空间,或者可以在程序的控制下被用来作为通用目的存储。除了基于堆栈指针来访问(当扩展堆栈存储模式被打开时,参见下面堆栈的节)这个空间外,这一存储空间还可以使用通用指针这个新的特性来寻址。通用指针在后面的节中被描述。
2.2.4 堆栈
处理器堆栈提供了一个方法来保存中断和子例程的返回地址,还有临时数据。堆栈向上增长(译者注:PC机一般是向下增长的),从较低地址到较高地址。当前堆栈指针总是指向最后被压到栈上的数据,只要堆栈不空。向前的压栈操作,堆栈指针值递增,然后数据被写入存储器。当堆栈出栈,使用相反的过程。首先,数据从存储器中被读出来,然后堆栈指针值递减。
51MX堆栈的缺省配置和经典的80C51是同样的实现。当中断或者子例程地址被压入堆栈时,仅仅程序计数器器低16位被保存。下图中,显示了这个缺省的80C51模式的堆栈操作:
Figure 4
对于堆栈,有两个配置选项。为了和经典80C51向后兼容的目的,两种附加模式在芯片重置时被禁止掉。
第一个选项,扩展中断桢模式,使中断把整个23位的程序计数器压入堆栈(按3个字节),而且使RETI指令把整个23位成熟存储器作为返回地址弹出堆栈,在图Figure 5中。包含程序计数器最高有效字节的堆栈字节的高位被强制为1以和通用指针寻址一致。
因为一个中断可以在程序中任何点发生,因此就需要存储整个23位的程序计数器值,它包括了超过64KB的程序。扩展中断桢模式只改变中断和RETI指令的操作,其他的调用和返回没有被影响。特别的扩展的调用和返回指令允许大的程序使用整个23位返回地址在整个代码空间来回移动。使用MXCON寄存器中的EIFM位来开启扩展中断桢模式。
Figure 5.
第二个堆栈选项,扩展堆栈存储模式,允许堆栈扩充,超过经典80C51族的256字节的限制。堆栈扩展通过增加堆栈指针到16位和允许它寻址整个EDATA存储区域(而不是仅仅标准的256字节内部数据存储空间)来实现。堆栈扩展对存储在堆栈上的数据没有影响,它会继续被保存,见图Figure 4和5。通过设置MXCON寄存器中的ESMM位来开启扩展堆栈内存模式。
如果堆栈指针没有被软件初始化,那么堆栈会从片内RAM的地址8开始,就象80C51。同样注意扩展堆栈存储模式,P89C669部分在DATA/IDATA顶部拥有1024字节的RAM空间可作为堆栈。
堆栈模式位ESMM和EIFM在图Figure 6被显示。注意在程序初始化过程中且在那以后堆栈模式位没有改变,那么堆栈模式位就要被设置。动态改变堆栈模式会导致堆栈同步问题。
2.2.5 MX控制寄存器(MXCON)
微控制器的MX家族是在一个给80C51用户提供一个可以允许应用程序在不同方向增长的部分的这样一个想法下开发的。在改进许多特性时,还要必须保持完全的和前代的兼容性。
有两个主要的改进的方面,一个是可以辨别的微控制器内部资源,一个是微控制器对外的地址和数据总线接口。
MX2部分,和先前的与80C51兼容的微控制器比,带来更大的可获得的片内代码和数据空间。为了使这些改进被利用,添加了MX具体的特性,相应地也增强了指令集。
MX控制寄存器(MXCON)决定了669的操作模式。不建议在应用执行中改变寄存器,尽管这是可能。MXCON的结构在图Figure 6中被显示。使用位EAM,共有两个操作模式可以使用。
EAM=0
在重置后,位EAM=0(缺省值)使P89C669部分处于完全80C51二进制兼容的微型模式。它和外面的接口是16位宽的地址总线和8位宽的数据总线。程序计数器(PC)是16位宽,因此片内可执行代码不能超越64KB地址范围。MX被用来传递PC的特殊指令(如EMOV)的使用被限制在PC的低16位的值。高7位全被当作0来对待。这就是为什么EMOV指令不能从超过64KB界限的内部代码空间取回内容。如果代码从片内代码空间开始,那么就没有外部代码能够被执行,地址总线也只能访问64KB以内的RAM。
EAM=1
EAM=1决定的模式使片内代码超过64KB并可以利用96KB的代码空间。对外部存储的接口是通过标准51外部总线:16位地址和8位数据总线。在这个配置中,程序存储器(PC)在内部是23位宽的,当EIFM(Extended Interrupt Frame,扩展中断桢)位被配置时需要特别的注意。如果可执行片内代码超过64KB而且这个代码被中断,那么EIFM必须被置位,因为中断指令的地址可能是01:xxxx类型。当PC跨越64KB时,保持EIFM=0会导致仅压入2字节的地址到堆栈。因而在调用中断服务例程被完成后,RETI指令会进一步指示代码执行到00:xxxx(由于只从堆栈弹出两字节),这样会导致不可预料的系统行为。
如果片内在超过64KB的存储代码空间都仅仅被用来存储常量(如查找表),这时EIFM可以被设为0,因为任何被执行的代码的地址可以仅由两个字节表示,并且只需要把两个字节压入栈中即可(对于P89C669部分,这是默认的)。
如果代码从片内代码空间开始,那么就不会有外部代码被执行;地址总线仅可以访问达64KB的外部RAM。由于这一模式仅仅是16位宽的地址总线,即使EMOV指令指向超出64KB的位置(如yz:xxxx),外部存储会把这个当作64KB以为的地址(00:xxxx)来识别。
Figure 6
EAM位控制访问的CODE/ECODE和XDATA/HDATA的空间。EDATA存储空间能够全部在任何时候用EMOV指令访问,不管EAM位的值。
2.2.6 通用目的RAM
那些没有被用作寄存器、堆栈和位寻址区域的特别应用的部分内部数据存储区,它们可以被考虑用作通用目的RAM和用在任何需要的场合。
低128字节的内部数据存储(DATA)可以用直接或者间接寻址来访问。直接寻址合并整个指令中的地址。比如,这个指令:
MOV 32h,#10
将会保存值10(10进制)在位置10h。直接寻址128以上的空间会访问特殊功能寄存器而不是内部数据存储了。
间接寻址寻址利用当前"堆叠"中的R0或者R1的地址,并用它来识别在内部数据存储中的一个位置。整个256字节内部数据存储空间(IDATA)可以用间接寻址方式访问。比如,这个指令列:
MOV R0,#90h
MOV A,@R0
这样会导致90h除的内容被读入累加器。在可以用直接和间接寻址都可以访问的低端区域保留更多的通用目的RAM,会致使堆栈在高端区域被定位,这个对于经典80C51很典型。对于51MX,堆栈可以被扩展也可以被完全移出低256字节的存储范围。
Figure 7.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: