Rosemount罗斯蒙特3051TG2A2B21AB4M5TK
嵌入式存储系统由嵌入式硬件和固化在硬件平台中的嵌入式存储系统软件组成。传统的小规模嵌入式存储系统,软件多采用前后台的方法,通常应用于实时性要求不高的简单场合;对于复杂的应用场合,较为普遍的做法是给系统配上嵌入式存储系统实时操作系统(RTOS),这样不仅能够使系统具有良好的实时性能,降低软件编制的工作量,还可以提高整个系统的稳定性。此外,为了简化用户程序,系统通常要提供一些必要的库函数供用户调用。同前后台系统相比,这种实时嵌入式系统增加了系统存储空间的开销。Intel 8051系列及各种兼容的单片机因其极高的性价比、丰富的库函数和长期的技术积累等背景而被广泛应用于各种嵌入式领域中。受传统单片机寻址空间的限制,嵌入式应用中经常需要进行存储空间扩展。本文借鉴传统计算机系统设计中的虚拟存储技术,以8051单片机为例提出一种采用页面分组和虚拟接口技术扩展存储空间的方法。本方法与Keil C编译器具有良好的兼容性。
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:CLR EA ;关中断
SETB/CLR P1.0 ;切换页面
SETB/CLR P1.1
SETB/CLR P1.2
SETB EA ;开中断
JMP REAL_ADDR ;跳转

提高存储器利用率结构
在公共段(256k存储芯片的低32k)中存放操作系统和提供给用户的其他库函数,其他各段用来存放嵌入式存储系统的用户程序。采用图2结构的单片机与存储器接口原理图如图3所示。其中A0~A15地址线接法与普通存储器扩展方法相同。

采用图2结构的单片机与存储器接口原理图
以上考虑了复位时页面应切换到公共代码区。
Keil C51编译器是单片机开发应用中非常流行的一种***编译器,它支持上述页面分组技术。
2.3 单片机嵌入式存储系统数据存储区扩展
嵌入式存储系统中引入操作系统需要增加一定的数据存储器开销,必要时仍可以采用分页技术扩展数据存储区容量。
引入操作系统以后,数据区有两种***方法,比较简单的一种方法是操作系统与用户程序共用一个数据区,编译器将整个程序一起编译,不必区分是系统程序还是用户程序。但这样对用户来说操作系统变得不透明了,而且不良的用户程序可能会***系统的数据区,导致整个系统崩溃。
相对应的另一种方法是给操作系统与用户程序分别分配***的数据区,譬如将128k 数据存储器给操作系统和用户程序各分配64k。不幸地是,当操作系统与用户程序一起编译时,编译器会自动给它们分配不同的地址,这样即使存储器物理上是分开的,操作系统与用户程序的数据区还是无法地址复用,这极大地浪费了地址空间;而且对传统的单片机, Keil C 编译器***大只支持64k数据区,幸运地是,这个矛盾可以通过采用虚拟接口的方法加以解决。
为此,将公共代码段中的程序单独编译,并且在链接、***目标代码时,给操作系统和公共库函数的每个函数在00000~07FFFH内分别指定一个固定的首地址。鉴于用户程序可能调用这些函数,需要为这些函数分别编写一个相同类型的同名伪函数,每个伪函数仅包含一条到真实函数(入口地址已知)的转移指令,所有这些函数都存放在一个被称为虚拟接口的头文件中。虚拟接口文件与用户程序一起编译,完成用户程序与操作系统两次编译的接口。显然这种方法仅占用了用户区的***量代码空间,而丝毫没有浪费用户数据区,同时又实现了地址复用。
公共代码段和操作系统的数据区特殊的对应关系(见图4),很容易通过P2端口线来指定。由单片机外部程序区访问时序(图 5)可知,PSEN的上升沿后数据总线A0~A7上开始出现指令或指令操作数,此时的地址线A15指示当前访问的是公共代码段(对应数据区高64k)还是其他程序段(对应数据区低64k),因此在PSEN上升沿锁存地址线A15,用它可以选择不同的数据存储器空间。
16210-1
16249-21-5
16249-51-2
16249-51-4
16249-51-5
16256-111
16267-1/2
16267-1/3
16267-1/4
16267-1/7
16289-130
16289-131
16289-132
16289-200
16289-200/2
16291-31
16303-2/00
16413-1/5
16413-16
16414-61
16414-62
16414-71
16414-72
16414-81
16414-82
16415-1
16415-11
16415-21
16415-500
16416-1
16418-1-04
16418-21-4
16420-1
16428-1
16428-41
16436-1
16804-42
16804-43
16804-44
16804-45
16804-46A
16804-47
16804-48
16807-33
10720-5316
13936-31-1
14743-2
14755-123
14784-500
14792-25
14792-36
14792-37
14792-38
14792-40
14792-41
14792-42
14792-43
14792-44
14792-45
14792-47
14850-121
15499-146
15499-147
15499-147/8
15499-162
15737-134
15738-119
15738-120
15738-71
15756-1
15768-113R
15824-113
15853-12 LIL
15853-31 LIL
15854-31
15854-35
15854-51
15854-53
15950-23
16013-1/08
16042-11
16052-15/4
16055-382
16055-383
16055-384
16055-385
16055-387
16055-388
16056-229
16056-371A
16056-372A
16056-374A
16056-411
16056-432
16056-435
16056-438A
16056-440
16056-441
16056-442
16056-652
16056-653A
16056-660
16114-161
16114-171
16114-171/4
16114-171/6
16114-171/9
16133-79/6
16137-1
16137-10
16137-100
16137-114
16137-115
16137-116
16137-117
16137-118
16137-119
16137-120
16137-121
16137-122
16137-142A
16137-144
16137-145
16137-146
16137-147
16137-148
16137-149
16137-150
16137-151
16137-152
16137-153
16137-154
16137-172
16137-172A
16137-173
16137-174
16137-175
16137-175A
16137-176
16137-177
16137-178A
16137-180A
16137-182A
16137-186
16137-187
16137-188
16137-189
16137-19
16137-191
16137-194A
16137-196A
16137-199
16137-215
16137-221
16137-222
16137-223
16137-224
16137-225
16137-230
16137-231
16137-232
16137-233
16137-4
16137-40
16137-41
16137-43
16137-60
16137-68
16137-69
16137-7
16137-78
16137-79
16137-84
16137-87
16137-88
16140-1
16143-1
16147-21-2
16147-51
16147-51-1
16147-51-2
16154-101/01 39EAMCAN
16154-104/03
16154-104/8 QLEAMBBN
16154-93/1 39EAMCBN
16155-41-1
16158-1 39CEMNNAN
16167-1 16167-1-8
16168-1-1
16169-1
16169-1-1
16169-1-3
16169-1-6
16169-3
16169-31
16169-41
16170-1
16170-1-2
16170-1-4
16170-4
16171-121/01 39VIMCBN
16171-121/03 39VIMCBN
16171-121/04 39VIMCBN
16171-123/OA QLVIMBCN
16171-126/01 39VIMCCN
16171-126/3 39VIMCCN
16171-126/7 39VIMCCN
16171-30
16171-30A
16180-1/09 39MBXNAN
16180-1/11 39MBXNAN
16180-1/12 39MBXNAN
16180-1/14 39MBXNAN
16180-1/15 39MBXNAN
16180-1R/11 39MBXNAN
16180-71/2 QLMBXNAN
16180-71R/2 QLMBXNAN
16182-1
16182-1R-3 MBX
16184-102/2
16184-61/04 39ODM115ACCAN
16184-61/1 39ODM115ACCAN
16184-61R/06 39ODM115ACCAN
16190-1
16190-1-1
16190-1-4
16191-21
16192-1
13926-98D 36103-1100/5
13934-41 36103-500/3
15669-36-5 15669-1-15
