![](http://img4.cpooo.com/files/201905/17/p/8/1207632_1558063212.jpg)
3051TG2A2B21AB4M5TK
Rosemount罗斯蒙特3051TG2A2B21AB4M5TK嵌入式存储系统由嵌入式硬件和固化在硬件平台中的嵌入式存储系统软件组成。传统的小规模嵌入式存储系统,软件多采用前后台的方法,通常应用于实时性要求不高的简单场合;对于复杂的应用场合,较为普遍的做法是给系统配上嵌入式存储系统实时操作系统(RTOS),这样不仅能够使系统具有良好的实时性能,降低软件编制的工作量,还可以提高整个系统的稳定性。此外,为了简化用户程序,系统通常要提供一些必要的库函数供用户调用。同前后台系统相比,这种实时嵌入式系统增加了系统存储空间的开销。Intel8051系列及各种兼容的单片机因其极高的性价比、丰富的库函数和长期的技术积累等背景而被广泛应用于各种嵌入式领域中。受传统单片机寻址空间的限制,嵌入式应用中经常需要进行存储空间扩展。本文借鉴传统计算机系统设计中的虚拟存储技术,以8051单片机为例提出一种采用页面分组和虚拟接口技术扩展存储空间的方法。本方法与KeilC编译器具有良好的兼容性。2存储系统的组织2.1虚拟存储系统计算机系统中常采用虚拟存储技术来扩展存储系统容量,页式虚拟存储器是常用的一种组织方法。在这种方法下,整个虚拟地址空间和主存空间均被分成容量相等的若干页,地址变换机构(通常是一个快速地址变换表)建立了虚拟空间到主存空间虚页到实页的映射。页式存储器组织关系如图1。页式存储器组织关系虚拟存储系统利用计算机CPU中的一组寄存器堆作为页表基址寄存器,如图1(b)所示,它与页表一起给出用户程序地址。实际计算机系统的页式虚拟存储要比这复杂得多,还需考虑未命中时的外部地址变换以及页面替换算法,然而在嵌入式存储系统中这些都可以简化乃至省去。2.2单片机嵌入式存储系统程序存储区扩展受虚拟存储系统启发,我们把上述方法作了一些修改以应用于嵌入式存储系统中。由于系统设计选用的外部程序存储器容量为256k,而一般单片机(如8051系列)的寻址空间为64k,为简单起见,以64k为一页,将256k虚拟地址分为4页映射到单片机的64k空间。嵌入式存储系统中地址变换机构可被简化:单片机没有专用的页表基址寄存器,可以通过额外的端口线(如P1.0,P1.1,P1.2等)作为基址指定不同的页面,页表查询可用一个跳转表实现。然而页面切换前后必须保证能够正确访问到跳转表,因此所有64k页面都需要有一个完全相同的代码段用来存放跳转表和中断矢量等公共资源。为提高存储器利用率可采用图2所示的结构,其中公共段中存放了高32k段之间相互调用所需要的跳转表。各段相互调用之前应先跳转到公共段,执行页面切换后再跳转到被调用程序的入口,这就实现了18位虚拟地址到16位主存地址的变换。不妨以P1.0,P1.1,P1.2作为页面基址来指定不同的页,相应的跳转表程序结构如下:ADDR:CLREA;关中断SETB/CLRP1.0;切换页面SETB/CLRP1.1SETB/CLRP1.2SETBEA;开中断JMPREAL_ADDR;跳转提高存储器利用率结构在公共段(256k存储芯片的低32k)中存放操作系统和提供给用户的其他库函数,其他各段用来存放嵌入式存储系统的用户程序。采用图2结构的单片机与存储器接口原理图如图3所示。其中A0~A15地址线接法与普通存储器扩展方法相同。采用图2结构的单片机与存储器接口原理图以上考虑了复位时页面应切换到公共代码区。KeilC51编译器是单片机开发应用中非常流行的一种高效编译器,它支持上述页面分组技术。2.3单片机嵌入式存储系统数据存储区扩展嵌入式存储系统中引入操作系统需要增加一定的数据存储器开销,必要时仍可以采用分页技术扩展数据存储区容量。引入操作系统以后,数据区有两种组织方法,比较简单的一种方法是操作系统与用户程序共用一个数据区,编译器将整个程序一起编译,不必区分是系统程序还是用户程序。但这样对用户来说操作系统变得不透明了,而且不良的用户程序可能会破坏系统的数据区,导致整个系统崩溃。相对应的另一种方法是给操作系统与用户程序分别分配独立的数据区,譬如将128k数据存储器给操作系统和用户程序各分配64k。不幸地是,当操作系统与用户程序一起编译时,编译器会自动给它们分配不同的地址,这样即使存储器物理上是分开的,操作系统与用户程序的数据区还是无法地址复用,这极大地浪费了地址空间;而且对传统的单片机,KeilC编译器最大只支持64k数据区,幸运地是,这个矛盾可以通过采用虚拟接口的方法加以解决。为此,将公共代码段中的程序单独编译,并且在链接、定位目标代码时,给操作系统和公共库函数的每个函数在00000~07FFFH内分别指定一个固定的首地址。鉴于用户程序可能调用这些函数,需要为这些函数分别编写一个相同类型的同名伪函数,每个伪函数仅包含一条到真实函数(入口地址已知)的转移指令,所有这些函数都存放在一个被称为虚拟接口的头文件中。虚拟接口文件与用户程序一起编译,完成用户程序与操作系统两次编译的接口。显然这种方法仅占用了用户区的极少量代码空间,而丝毫没有浪费用户数据区,同时又实现了地址复用。公共代码段和操作系统的数据区特殊的对应关系(见图4),很容易通过P2端口线来指定。由单片机外部程序区访问时序(图5)可知,PSEN的上升沿后数据总线A0~A7上开始出现指令或指令操作数,此时的地址线A15指示当前访问的是公共代码段(对应数据区高64k)还是其他程序段(对应数据区低64k),因此在PSEN上升沿锁存地址线A15,用它可以选择不同的数据存储器空间。16210-116249-21-516249-51-216249-51-416249-51-516256-11116267-1/216267-1/316267-1/416267-1/716289-13016289-13116289-13216289-20016289-200/216291-3116303-2/0016413-1/516413-1616414-6116414-6216414-7116414-7216414-8116414-8216415-116415-1116415-2116415-50016416-116418-1-0416418-21-416420-116428-116428-4116436-116804-4216804-4316804-4416804-4516804-46A16804-4716804-4816807-3310720-531613936-31-114743-214755-12314784-50014792-2514792-3614792-3714792-3814792-4014792-4114792-4214792-4314792-4414792-4514792-4714850-12115499-14615499-14715499-147/815499-16215737-13415738-11915738-12015738-7115756-115768-113R15824-11315853-12LIL15853-31LIL15854-3115854-3515854-5115854-5315950-2316013-1/0816042-1116052-15/416055-38216055-38316055-38416055-38516055-38716055-38816056-22916056-371A16056-372A16056-374A16056-41116056-43216056-43516056-438A16056-44016056-44116056-44216056-65216056-653A16056-66016114-16116114-17116114-171/416114-171/616114-171/916133-79/616137-116137-1016137-10016137-11416137-11516137-11616137-11716137-11816137-11916137-12016137-12116137-12216137-142A16137-14416137-14516137-14616137-14716137-14816137-14916137-15016137-15116137-15216137-15316137-15416137-17216137-172A16137-17316137-17416137-17516137-175A16137-17616137-17716137-178A16137-180A16137-182A16137-18616137-18716137-18816137-18916137-1916137-19116137-194A16137-196A16137-19916137-21516137-22116137-22216137-22316137-22416137-22516137-23016137-23116137-23216137-23316137-416137-4016137-4116137-4316137-6016137-6816137-6916137-716137-7816137-7916137-8416137-8716137-8816140-116143-116147-21-216147-5116147-51-116147-51-216154-101/0139EAMCAN16154-104/0316154-104/8QLEAMBBN16154-93/139EAMCBN16155-41-116158-139CEMNNAN16167-116167-1-816168-1-116169-116169-1-116169-1-316169-1-616169-316169-3116169-4116170-116170-1-216170-1-416170-416171-121/0139VIMCBN16171-121/0339VIMCBN16171-121/0439VIMCBN16171-123/OAQLVIMBCN16171-126/0139VIMCCN16171-126/339VIMCCN16171-126/739VIMCCN16171-3016171-30A16180-1/0939MBXNAN16180-1/1139MBXNAN16180-1/1239MBXNAN16180-1/1439MBXNAN16180-1/1539MBXNAN16180-1R/1139MBXNAN16180-71/2QLMBXNAN16180-71R/2QLMBXNAN16182-116182-1R-3MBX16184-102/216184-61/0439ODM115ACCAN16184-61/139ODM115ACCAN16184-61R/0639ODM115ACCAN16190-116190-1-116190-1-416191-2116192-113926-98D36103-1100/513934-4136103-500/315669-36-515669-1-15)