背景技术
MCS(Micro Computer System)是Intel公司对微处理器的总称,而其所开发的MCS-51/52系列的微处理器更是普遍地应用在工业界中。一般而言,微处理器只含有少量的存储器及输入输出端口,以MCS-51系列的微处理器为例,它有4K字节的程序存储器、128字节的数据存储器以及32条输入输出端口,MCS-52系列的微处理器则是将程序存储器增加为8K字节,以及将数据存储器增加为256字节,而MCS-52与MCS-51系列的微处理器同样是使用一个8位的中央处理单元。程序存储器用来存放使用者所撰写的程序,属于只读存储器(ROM),数据存储器则是随机存取存储器(RAM),可供中央处理单元运作时读取或写入数据,通常是用来当程序执行时暂时存放数据的暂存器。MCS-51/52系列的微处理器都可以由外部扩充存储器,最大可扩充至64K位字节。
然而在一些应用之中,使用者可能会需要撰写很大的程序码或是使用很大的阵列表,如此一来64K位字节的外部扩充程序存储器仍然不够使用。存储器组切换(bank switch)是一种可以将存储器大幅扩充的方法,使用微处理器上多出的管脚作为解码线来对超过64K字节的存储器作寻址,若外部存储器是一个大容量的存储器装置,则多出的管脚可以直接作为地址线,若外部存储器是多个小容量的存储器装置,则多出的管脚可用来选择存储器芯片。由于微处理器最大的外部扩充存储器为64K字节,所以可用64K字节作为单一存储器组的基本容量,称为一页(page),并以微处理器多出的管脚来切换页码,以选择不同的存储器组。存储器组切换最大的问题在于中断向量表(interrupt vector table)配置的地址,因为中断向量表通常会放在存储器中某个特定的地址,虽然程序在运作时可以在各个页作切换,但是当中断发生时,程序会立刻在所在页中的特定地址去寻找中断向量表,而且此时程序并无法作存储器组切换,当程序找不到中断向量表时,便会产生错误。一般解决这个问题的方法,便是在每个存储器组中都保留共用区(common area),共用区中储存中断向量表、中断服务程序(interrupt service routine,ISR)、通用函数库以及存储器组切换程序,所以不论程序运作在那一个页,当程序发生中断时,程序都可以在所在的页中找到中断向量表继续程序的执行。
请参考图1,图1为已知外部程序存储器12配置的示意图。假设有MCS-51/52系列的微处理器使用存储器组切换的方式在外部扩充512K字节的存储器12,分为8个页,每个页为64K字节,并保留10K字节的共用区用来存放中断向量表、中断服务程序、通用函数库以及存储器组切换程序。举例来说,当在第一页的程序需要呼叫第二页的程序时,会立即跳至共用区中的存储器组切换程序,存储器组切换程序会设定所需存储器组的页码,因为对于微处理器而言,在共用区中改变页码并不会影响任何程序数据的读取,接着微处理器就可以存取第二页中所需的程序。在第二页的程序处理完毕之后,程序会先回到共用区中,由存储器组切换程序切换回原来的存储器组,再回到第一页中原来程序的地址继续执行程序。
由上述可知,已知MCS-51/52系列的微处理器所提供的程序存储器,最大只能利用扩充外部程序存储器至64K字节,但是通过存储器组切换的技巧,使用微处理器上多出的管脚,可以再将外部程序存储器作大幅的扩充,但是存储器组切换有个缺点,就是每个存储器组之中都必须保留部分的空间作为共用区,用来存放中断向量表、中断服务程序、通用函数库以及存储器组切换程序,而这些数据会复制并储存在每个存储器组的共用区之中,如此一来,存储器的空间便无法有效的被利用。
发明内容
因此本发明的主要目的是提供一种存取连接微处理器的存储器的方法,以解决上述问题。
本发明的权利要求提供一种存取连接微处理器的存储器的方法,该存储器包含多个存储器组(memory bank),其中每一存储器组的大小为该微处理器内部寻址线的最大寻址空间,该微处理器包含中断处理单元,以及用来切换存储器组的存储器组选择器,该方法包含:(a)将中断服务程序(interruptservice routine)储存在该多个存储器组的其中一个;(b)在中断发生时,使用该中央处理单元将工作中的程序地址存入(push)堆栈中,接着将工作中的存储器组的页码推入该堆栈中,再设定该存储器组选择器为储存具有该中断服务程序的存储器组的页码;(c)将该中央处理单元切换至储存该中断服务程序的存储器组中执行该中断服务程序;(d)使用该中央处理单元从该堆栈中取出(pop)在步骤(b)中存入该堆栈的存储器组的页码并将其存入该存储器组选择器,接着由该堆栈中取出在步骤(b)中存入该堆栈的程序地址;以及(e)在执行步骤(d)后,根据该存储器组选择器储存的页码及取出的程序地址,切换回该页码所对应的存储器组继续在该存储器组地址执行步骤(b)中断之前的工作。
相对于已知技术,本发明所提供的方法使微处理器的中央处理单元在发生中断时能利用堆栈起来记录执行中程序的地址数据,如此可将存在于每一个存储器组的共用区之中的中断服务程序移出,减少共用区占用的空间,一方面增加了每一个存储器组的可用空间,另一方面也减少了切换存储器组的机会,提高中央处理单元存取外部存储器的效率,已知技术在使用存储器组交换的方式扩充外部存储器时,必须在每一个存储器组中都复制一份含有中断服务程序的共用区数据,而中断服务程序占了共用区很大的一部分,相当浪费存储器的空间,而本发明则可以更有效的利用存储器的空间。
具体实施方式
请参考图2,图2为本发明微处理器的外部存储器22其存储器组配置的示意图。微处理器(图未示)的外部存储器22在使用存储器组交换的存储器配置方式时,需在每一个存储器组中皆需要复制一份共用区的数据,相当耗费存储器空间,若可以减少共用区中存放数据的大小,就能够大幅的节省存储器的空间。本发明将外部存储器22的每一个存储器组的共用区24所包含的中断服务程序取出,也就是存储器组的共用区24不包含中断服务程序,而仅在外部存储器的其中一个存储器组之中储存一份中断服务程序26,于中断发生时再切换至储存中断服务程序26的存储器组中读取数据,如此每一个存储器组的共用区就都缩小了,相对的每一个存储器组就有更多的可用空间,也能减少存储器组切换的机率。举例来说,假设外部存储器22的大小为512K字节,分成8个存储器组,每一个存储器组的大小为64K字节,而每一个存储器组需要10K字节的存储器空间来储存共用区数据,而其中中断服务程序占了4K字节,所以将每一个共用区中的中断服务程序取出而仅储存一份中断服务程序26在存储器组的第0页,除了存储器组的第0页之外,每一个数据库的可用空间由原来的54K字节增加为58K字节,共增加了4K*(8-1)=28K字节的存储器空间。因为中断服务程序26只储存在存储器组的第0页,所以当中断发生时,微处理器的中央处理单元需将工作中的存储器组切换至存储器组的第0页,首先将执行中的数据地址以及所在的存储器组页码先后存入(push)堆栈之中,接着切换至存储器组的第0页作中断处理,待完成中断处理之后再由堆栈中先后取出(pop)先前存入的存储器组页码以及数据地址,根据由堆栈中取出的存储器组页码以及数据地址切换回中断发生前的数据地址继续工作。
请参考图3,图3为本发明于中断发生时切换存储器组的流程图。本发明为了节省存储器的使用空间,将中断服务程序由共用区中取出,仅储存一份中断服务程序26于其中一个存储器组之中,如此不但增加了每一个存储器组的可用空间,也由于可用空间的增加使得切换存储器组的机率减少,提高效率。由于存储器组的共用区中不含中断服务程序,若程序在执行时发生中断,微处理器的中央处理单元会使用堆栈来记录工作中的数据地址以及所在的存储器组页码,于存储器组切换至储存中断服务程序的数据库完成中断处理之后,就可以根据堆栈中记录的数据回到中断发生前所在的地址。本发明于中断发生时切换存储器组的详细步骤内容说明如下:
步骤110:中断发生,中央处理单元接收到中断请求而必须停止正在执行的程序进行中断处理;
步骤120:将执行中的程序的地址数据存入堆栈之中,首先将记录地址数据的8位低位地址存入堆栈之中,接着再将记录地址数据的8位高位地址存入堆栈之中;
步骤130:将执行中的程序所在数据库的页码存入堆栈之中,也就是将储存页码的存储器组选择器(page selector)中的8位数据存入堆栈之中;
步骤140:切换存储器组,也就是将存储器组选择器设定为储存中断服务程序的存储器组的页码,使得中央处理单元能够切换到储存中断服务程序的存储器组作中断处理;
步骤150:执行中断服务程序,进行中断处理;
步骤160:由堆栈中取出先前工作中的存储器组的页码;
步骤170:切换回先前工作中的存储器组,也就是将存储器组选择器设定为上一步骤中由堆栈取出的页码;
步骤180:由堆栈中取出先前执行的程序的地址数据,先将记录地址数据的8位高位地址由堆栈中取出,接着再将记录地址数据的8位低位地址由堆栈中取出;
步骤190:根据上一步骤由堆栈取出的地址数据继续进行中断发生前所执行的程序。
请参考图4,图4为本发明切换存储器组时使用堆栈28的示意图。微处理器中的堆栈存储器28通常是使用堆栈指针指向内部数据存储器的一个位置作为堆栈的起始位置,堆栈通常是用来存放呼叫子程序的程序计数,或者是使用者自定的数据,而由于微处理器的中央处理单元执行8位的指令集,所以堆栈中的每一组数据也为8位。堆栈数据的处理方式为先进后出,也就是存入堆栈中的数据必须等到下一组存入堆栈中的数据被取出后才会被取出使用,而最后一组存入堆栈中的数据则会最先被取出的数据。在上述的方法中,当中央处理单元接到中断请求时,会依照上述的步骤先后将执行中程序的低位地址、高位地址以及所在的存储器组页码存入堆栈28之中,换句话说,当中断发生时,中央处理单元会先利用堆栈28来记录执行中程序的地址数据,所以在完成步骤130之后,堆栈中所存放的数据便如图4所示,接着进行步骤140来切换数据库及步骤150来作中断处理,在作中断处理时可能也会使用到堆栈28储存一些参数,但是在完成中断处理之后,堆栈28中所储存的数据仍然会如图4所示,此时中央处理单元就可以利用堆栈28中的数据进行步骤160至步骤190回到中断发生前的地址继续执行被中断的程序。
由上述可知,本发明的微处理器在外部存储器22使用存储器组交换的方法时,将每一个存储器组的共用区24的中断服务程序取出,而仅储存一份中断服务程序26在其中一个存储器组,而在中断发生时,使用堆栈28来记录中央处理单元执行中程序的地址数据,再切换至储存中断服务程序的存储器组作中断处理,待完成中断处理之后,由堆栈28中取出中断发生前中央处理单元所执行程序的地址数据,使得中央处理单元可以根据该地址数据继续执行程序。
相对于已知技术,本发明所提供的方法使微处理器的中央处理单元在发生中断时能利用堆栈起来记录执行中程序的地址数据,如此可将存在于每一个存储器组的共用区之中的中断服务程序移出,减少共用区占用的空间,一方面增加了每一个存储器组的可用空间,另一方面也减少了切换存储器组的机会,提高中央处理单元存取外部存储器的效率,已知技术在使用存储器组交换的方式扩充外部存储器时,必须在每一个存储器组中都复制一份含有中断服务程序的共用区数据,而中断服务程序占了共用区很大的一部分,相当浪费存储器的空间,而本发明则可以更有效的利用存储器的空间。
以上所述仅为本发明的优选实施例,凡依本发明权利要求书所做的相同的变化与改进,都应属本发明专利的涵盖范围。