一种使用外部程序存储器的方法

文档序号:6402782阅读:181来源:国知局
专利名称:一种使用外部程序存储器的方法
技术领域
本发明涉及计算机或通信领域的存储技术领域,尤其涉及一种使用外部程序存储器的方法。
背景技术
在CPU系统中,程序存储器的空间是受CPU的地址空间限制的。因此,在CPU系统的开发中,通常选用与CPU地址容量相匹配的外部程序存储器。
目前,随着大规模集成电路技术的发展,作为一种常用的CPU开发系统的单片机得到了越来越广泛的应用。在智能仪器仪表、机电一体化设备、实时过程控制及电器产品中,都会涉及到单片机的开发。单片机是将CPU、存储器(包括RAM和ROM)、I/O接口、定时/计数器、中断控制功能等集成在一块芯片上,片内各功能单元通过内部总线相互连接起来。在单片机的开发中,考虑到性价比的问题,常会遇到这种情况选定某型号芯片后,会发现由于程序庞大,程序存储器空间不够且单片机(或其它CPU)不支持更大容量的存储器。
以80C196系列单片机地为例,CPU系统的地址空间分配如图1所示地址线宽度为16位,总的地址空间为64K,除去RAM空间、I/O空间等,在代码量很大的情况下,地址空间将不够用,且无法使用大的外部程序存储器,只有选择地址空间大的单片机,而这类单片机往往不能满足功能需求或成本过高。
在单片机或其它CPU系统中,当程序存储器不够,且单片机或其它CPU不支持更大的程序存储器时,通常是重新选择单片机(或其它CPU)或者缩减代码,这样就会增加系统开发成本或者降低系统功能。

发明内容
本发明的目的是提供一种使用外部程序存储器的方法,以克服现有技术中因CPU的地址空间而使外部程序存储器的使用空间受到限制的问题。
本发明的目的是通过以下技术方案实现的一种CPU系统中使用外部程序存储器的方法,其特征在于,包括A、将CPU的外部程序存储地址映射到外部程序存储器的多个地址段;B、建立地址段索引表;C、选择所述外部程序存储器作为当前程序存储器;D、根据所述CPU的外部程序存储地址及所述地址段索引表,调用所述当前程序存储器中不同地址段的程序。
所述步骤A具体包括A1、划分所述CPU的外部程序存储地址为逻辑公用程序段和逻辑子程序段;A2、划分所述外部程序存储器的地址为物理公用程序段和多个物理子程序段;A3、将所述逻辑公用程序段地址映射为所述物理公用程序段地址;A4、将所述逻辑子程序段地址至少映射为一个所述物理子程序段。
所述逻辑公用程序段地址与所述物理公用程序段地址相同。
所述逻辑子程序段地址与所述多个物理子程序段其中之一的地址相同。
所述多个物理子程序段的长度均与所述逻辑子程序段的长度相等。
所述物理公用程序段内存放CPU系统的公用程序;所述物理子程序段内存放所述CPU系统的子程序及所述子程序的接口函数。
每个物理子程序段内存放的子程序的接口函数的起始地址及输入/输出参数相同。
所述地址段索引表包括所述物理子程序段的入口地址。
所述地址段索引表存放在所述物理公用程序段内。
所述步骤D具体包括D1、所述物理子程序段内的程序直接调用所述物理公用程序段内的函数;D2、所述物理公用程序段内的程序根据所述地址段索引表调用所述物理子程序段内的函数。
由以上本发明提供的技术方案可以看出,本发明通过对CPU实际地址的复用,即将CPU的相同地址映射为外部程序存储器的不同地址,提供了CPU有限的地址空间对大容量程序存储器的支持,可以通过扩大程序的代码量,采用较低端的CPU实现较复杂的功能,降低了系统开发成本。
通过对外部程序存储器物理地址的分段,将CPU系统的不同程序分类放在对应的地址段内,增加了代码的隔离度,便于程序的调试,并根据CPU的实际地址提供不同程序的调用函数,为程序的运行提供了可靠的保证。


图1是现有技术中96系列单片机系统中地址空间分配示意图;图2是本发明CPU系统中使用外部程序存储器的方法的流程图;图3是本发明的应用实例单板测试仪开发方案框图;图4是图3所示的测试仪中的主控板原理框图;图5是图4所示的主控板系统地址空间分配示意图;图6是图5中的外部程序存储器地址产生原理图;图7是本发明的实施例中外部程序存储器内程序的调用关系示意图;图8是本发明的实施例中外部程序存储器内程序的调用流程图。
具体实施例方式
本发明的核心在于通过对CPU实际地址的复用,将CPU的外部程序存储地址映射到外部程序存储器的多个地址段,并对不同的地址段建立地址段索引表,通过该表及CPU的实际地址调用外部程序存储器中不同地址段的程序,从而使CPU克服地址的局限,使用大于其地址空间的程序存储器,并保证CPU系统的正常运行。
为了使本技术领域的人员更好地理解本发明,下面结合附图和实施方式对本发明作进一步的详细说明。
参照图2,图2示出了本发明方法的详细流程首先,在步骤201根据CPU程序的大小及类别,将CPU的外部程序存储地址(CPU的实际地址)划分为逻辑公用程序段和逻辑子程序段;对应于步骤201中的划分方式,在步骤202将外部程序存储器的地址划分为物理公用程序段和多个物理子程序段;这样,进到步骤203,将逻辑公用程序段地址映射为外部程序存储器的物理公用程序段地址;将逻辑子程序段地址映射为外部程序存储器的一个或多个物理子程序段。
在CPU系统开发中,为了减少程序代码及提高程序执行效率,通常将程序划分为公用程序和子程序,上述对CPU地址的划分即是基于CPU系统开发中的这种特点。在对CPU外部程序存储地址划分时,可以根据系统程序的实际需要,适当划分逻辑公用程序段和逻辑子程序段长度,如果系统的公用程序代码较多,可以给逻辑公用程序段分配较大的空间,反之,则可给逻辑公用程序段分配空间较小些,以便充分利用CPU有限的地址空间。考虑到后面会提到的为保障各子程序正确链接所建立的地址索引表要放在外部程序存储器的物理公用程序段内,因此逻辑公用程序段要保证写入地址索引表的代码后,公用程序代码不会溢出。
为了简化公用程序的正确链接,可以将逻辑公用程序段地址与物理公用程序段地址相同,即保持两者长度和起始地址均相同。当然,也可以根据实际需要,也可以使两者不相同。如果保持长度相同,起始地址不同,则同样要在地址索引表中建立公用程序地址的索引;如果起始地址相同,长度不同,则要保证地址索引表的代码加上公用程序的代码不会溢出两者中较短的地址空间即可。
同样,为了简化子程序的正确链接,在按地址依次划分外部程序存储器的多个物理子程序段时,可以使划分的多个物理子程序段的长度均与划分的逻辑子程序段的长度相等,这样,逻辑子程序段起始地址与依次划分的这些物理子程序段的第一个相同,长度也相同,与其它的物理子程序段的起始地址成整数倍。与上面公用程序段的划分一样,也可以使这些地址段的长度不同,起始地址也可以不是整数倍。只要保证在地址索表中建立正确的地址索引,并且使各地址段内的子程序代码不会超过两者中较小的一个即可。
在上面提到,将逻辑公用程序段地址映射为外部程序存储器的物理公用程序段地址;将逻辑子程序段地址映射为外部程序存储器的一个或多个物理子程序段。也就是说,将CPU的相同地址映射为外部程序存储器的不同地址。将CPU系统的公用程序代码放入划分的外部程序存储器的物理公用程序段内;将CPU系统的子程序代码放入划分的外部程序存储器的各物理子程序段内。这样,就使CPU可以支持大于其地址空间的外部程序存储器。
本技术领域人员知道,在CPU系统中,为了正确调用子程序,都要提供一个或多个子程序的接口函数,所以,在外部程序存储器的各物理子程序段内还要存放各子程序的接口函数。因为上面描述的映射关系,外部程序存储器的各物理子程序段地址在CPU的实际地址中体现为同一个地址,所以,应使外部程序存储器的每个物理子程序段内存放的子程序的接口函数的起始地址及输入/输出参数相同。
上述映射关系建立完成后,进到步骤204,建立地址段索引表。该表包括外部程序存储器中各物理子程序段的入口地址。前面已提到,该表应存放于外部程序存储器的物理子公用程序段内。
然后,进到步骤205,将CPU系统程序加载到外部程序存储器的对应段内。这样就完成了CPU系统外部程序的注入。
在程序运行时,因为外部程序存储器的物理公用程序段的地址与CPU的实际地址相同(映射的地址段长度不同时,程序代码的长度不超过较短的地址段),所以物理子程序段内的程序直接调用物理公用程序段内的函数;因为外部程序存储器的物理子程序段的地址与CPU的实际地址不同,所以物理公用程序段内的程序不能直接调用子程序段内的子程序,需要根据地址段索引表中各物理子程序段的入口地址调用物理子程序段内的函数。
下面以本发明在单片机系统开发中的一个应用实例,进一步详细说明本发明。
参照图3,该实例为利用单片机开发的测试多种单板的测试仪系统,被测单板有30种,由计算机通过串口线控制测试仪测试单板。综合系统功能及开发成本的考虑,选用Intel的80C196系统单片机。
图4所示为测试仪中主控板的原理框图。主控板为测试仪的主要单板,负责与测试电脑的通信以及测试功能的实现。其中,CPU系统主要包括单片机80C196、外部RAM(16KB)、外部FLASH(512KB)等器件。
80C196的地址空间被分为片内RAM/寄存器(0x0000-0x00FF)、本板I/O(0x0100-0x03FF)、片外程序存储器(0x0400-0x3FFF)、片外RAM(0x4000-0x7FFF)和测试地址空间(0x8000-0xFFFF)。其中,片外程序存储器器件为29F040(4Mbits)。
由于需要针对30种被测试单板都要开发测试程序,预计每个被测试单板需要开发的单板软件目标代码约为4-8K字节,因此程序存储器至少需要8K×30=240K字节,而80C196单片机的地址空间为64K,按一般的方案设计,满足不了要求。因此,采用本发明方法,将CPU的相同地址映射为外部程序存储器的不同地址,使80C196单片机能够使用大容量外部程序存储器。主控板的地址空间分配如图5所示80C196采用28SF040为程序载体,从80C196角度来看,程序始终位于0000-3FFF的范围。而从28SF040角度来看,地址空间为0x00000-0x7FFFF的512KB,地址空间以8K大小被分成64段,其中物理地址00000-01FFF的8K为公用程序段,其余63段每个测试子程序占用一段。
图6是29F040的地址产生原理框图,WE/CE/OE分别是29F040的写使能/片选/读使能控制端。80C196的地址线(A0-A12)连接29F040的A0-A12,29F040的高位地址(A13-18)由逻辑器件(EPLD)产生,通过向高位地址锁存器写入不同的值,使80C196的地址段0x2000-0X3FFF分别映射到29F040的不同8KB地址段。例如将29F040的A13-18置为0x03,那么80C196的地址段0x2000-0X3FFF将映射到29F040的第3个8KB段,即29F040的地址段0x4000-0x5FFF。
各测试子程序均可调用公用程序段中的公用函数,公用程序也可通过特定的调用方法调用测试子程序段的功能函数。测试子程序之间不能互相调用。
公用程序按如下方式调用测试子程序段的功能函数首先,在每个测试子程序段建立一个(也可以是多个)接口函数,接口函数的起始地址必须相同,可以用预编译伪指令来设定,比如汇编指令CSEGAT 2090H指定起始地址为0X2090,使每个测试程序段的接口函数的起始地址、输入输出参数定义保持一致。这样,公用程序段就可以通过这个(些)接口函数调用测试程序的函数。
然后,创建一个测试代码段的函数对应表,比如下面的形式测试子程序段1
1单板A存储器测试函数;2单板A业务测试函数。
测试子程序段21单板B通道测试函数;2单板B自检测试函数依此类推,分别建立63个测试子程序段的测试函数。
在公用程序段建立这样各测试子程序段的地址映射表,也就是各测试子程序的一个调用函数UCHAR Test_Function(UCHAR ucSegment,//测试程序段序号UCHAR ucFunction,//函数序号UCHAR ucPara1, //传递参数1UCHAR ucPara2, //传递参数2...
);在测试子程序段中建立对应的函数测试子程序段1中UCHAR My_Test(UCHAR ucFunction,UCHAR ucPara1,UCHARucPara2,...);{...
switch(ucFunction){case 1My_Test_Mem(UCHAR ucPara1);//单板A存储器测试函数case 2My_Test_Aff UCHAR ucPara1,UCHAR ucPara2);//单板A业务测试函数...
}}测试程序段2中UCHAR My_Test(UCHAR ucFunction,UCHAR ucPara1,UCHARucPara2,...);{...
switch(ucFunction){case 1My_Test_Cha(UCHAR ucPara 1);//单板B通道测试函数case 2My_Test_Self(UCHAR ucPara 1,UCHAR ucPara 2);//单板B自检测试函数...
}}那么函数Test_Function(SEGMENT2,FUNC2,...),就是调用单板B自检测试函数。
测试子程序的调用关系如图7所示。
图8示出了外部程序存储器内测试子程序段内函数的调用流程输入测试程序段序号i、函数序号j和参数;则测试功能函数根据程序段序号i切换程序段,根据函数序号j调用程序段i内的函数j。
这些测试子程序、公用程序可以采用常用的编程器加载的方法,也可以采用在线加载方法,将各程序段的程序代码注入外部程序存储器中。
首先,对编辑好的程序进行编译假设公用程序段文件为MainPRG.c,测试程序为TestPRGl.c、TestPRG2.c、...、TestPRGn.c。
1、将各代码都编码为目标文件MainPRG.obj、TestPRG1.obj、TestPRG2.obj、...、TestPRGn.obj;2、然后TestPRG1.obj、TestPRG2.obj、...、TestPRGn.obj分别与MainPRG.obj进行链接,生成程序代码文件TestPRG1.bin、TestPRG2.bin、...、TestPRGn.bin。
采用编程器加载方法如下将TestPRGl.bin的0x0000-0x1FFF加载到29F040的0x0000-0x1FFF,将TestPRG1.bin、TestPRG2.bin、...、TestPRGn.bin的0x2000-0x3FFF加载到29F040的0x2000-0x3FFF、0x4000-0x5FFF...,这种加载方法一般的编程器都支持。
有时,使用编程器加载不是很方便,特别是进行软件升级不方便。因此也可以为系统增加在线加载功能,比如从串口、网口等加载。仍以上述的测试仪程序为例,实现从串口在线加载的方案如下1、将PC机传下来的数据(一次8K)暂存在RAM中的6000-7FFF处;2、将29F040上0400-1FFF处的程序移到RAM中的4400-5FFF处;3、然后向29F040高位地址寄存器写入要下载的测试程序块,同时切换FLASH(29F040)和RAM的地址空间。使80C196地址0400-3FFF指向RAM,而地址4000-7FFF指向FLASH;4、运行RAM中的程序,将RAM中2000-3FFF处的程序下载到FLASH中指定的位置。
以上的实施例介绍了如何使用本发明在单片机系统开发中使CPU使用大于其地址空间的外部程序存储器。本领域的技术人员可以理解,本发明的思想和方法还可以应用于其它CPU系统,只要涉及到CPU的系统,都可以使用本发明提供的方法。因此,上述只是本发明的作为示范的具体实施方式
,并不用以限制本发明的保护范围。
虽然通过实施例描绘了本发明,本领域普通技术人员知道,本发明有许多变形和变化而不脱离本发明的精神,希望所附的权利要求包括这些变形和变化而不脱离本发明的精神。
权利要求
1.一种使用外部程序存储器的方法,其特征在于,包括如下步骤A、将CPU的外部程序存储地址映射到外部程序存储器的多个地址段;B、建立地址段索引表;C、选择所述外部程序存储器作为当前程序存储器;D、根据所述CPU的外部程序存储地址及所述地址段索引表,调用所述当前程序存储器中不同地址段的程序。
2.如权利要求1所述的CPU系统中使用外部程序存储器的方法,其特征在于,所述步骤A具体包括A1、划分所述CPU的外部程序存储地址为逻辑公用程序段和逻辑子程序段;A2、划分所述外部程序存储器的地址为物理公用程序段和多个物理子程序段;A3、将所述逻辑公用程序段地址映射为所述物理公用程序段地址;A4、将所述逻辑子程序段地址至少映射为一个所述物理子程序段。
3.如权利要求2所述的CPU系统中使用外部程序存储器的方法,其特征在于,所述逻辑公用程序段地址与所述物理公用程序段地址相同。
4.如权利要求2或3所述的CPU系统中使用外部程序存储器的方法,其特征在于,所述逻辑子程序段地址与所述多个物理子程序段其中之一的地址相同。
5.如权利要求2所述的CPU系统中使用外部程序存储器的方法,其特征在于,所述多个物理子程序段的长度均与所述逻辑子程序段的长度相等。
6.如权利要求2所述的CPU系统中使用外部程序存储器的方法,其特征在于,所述物理公用程序段内存放CPU系统的公用程序;所述物理子程序段内存放所述CPU系统的子程序及所述子程序的接口函数。
7.如权利要求6所述的CPU系统中使用外部程序存储器的方法,其特征在于,每个物理子程序段内存放的子程序的接口函数的起始地址及输入/输出参数相同。
8.如权利要求2所述的CPU系统中使用外部程序存储器的方法,其特征在于,所述地址段索引表包括所述物理子程序段的入口地址。
9.如权利要求2或6所述的CPU系统中使用外部程序存储器的方法,其特征在于,所述地址段索引表存放在所述物理公用程序段内。
10.如权利要求2或6所述的CPU系统中使用外部程序存储器的方法,其特征在于,所述步骤D具体包括D1、所述物理子程序段内的程序直接调用所述物理公用程序段内的函数;D2、所述物理公用程序段内的程序根据所述地址段索引表调用所述物理子程序段内的函数。
全文摘要
本发明公开了一种使用外部程序存储器的方法,包括以下步骤将CPU的外部程序存储地址映射到外部程序存储器的多个地址段;建立地址段索引表;选择所述外部程序存储器作为当前程序存储器;根据所述CPU的外部程序存储地址及所述地址段索引表,调用所述当前程序存储器中不同地址段的程序。利用本发明,可以使CPU支持大于其地址空间的外部程序存储器,降低系统开发成本。
文档编号G06F12/06GK1700192SQ20041004243
公开日2005年11月23日 申请日期2004年5月18日 优先权日2004年5月18日
发明者王 华, 陈建海, 冯东 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1