双核处理器就是在一个处理器基板上集成两个功能相同的处理器,即将两个物理处理器整合入一个内核中。双核技术的引入是提高处理器性能的行之有效的方法。由于生产技术的限制,传统通过提升工作频率来提升处理器性能的作法目前面临严重的阻碍,高频CPU的耗电量和发热量越来越大,已经给整机散热带来十分严峻的考验。双核技术可以很好的避免这一点。增加一个内核,处理器每个时钟周期内可执行的单元数将增加一倍。 Nios II系列嵌入式处理器使用32位的指令集结构ISA,完全与二进制代码兼容,它是Altera公司的第二代软核嵌入式处理器,性能超过200DMIPS。SOPCBuilder是一个革命性的系统级开发工具,可以用来构建包括处理器、存储器接口和I/O外设的嵌入式系统。使用Altera公司的NiosII处理器和SOPC Builder开发工具能快速地设计并实现资源共享的双核系统。 硬件设计 在Nios II双核系统中,存在两种不同类型的双核系统,其中一种是资源可以共享的,叫做资源共享的双核系统,另一种则不共享资源,即处理器之间都是独立的,叫做独立的双核系统。以下是两种双核系统的介绍。 独立的双核系统 独立的双核系统,处理器之间是完全独立的,处婵器不参与其他处理器的运算。也可以说它们是一个分开的系统。这种形式的双核系统是一种非常简单的双核系统,只是在系统中多添加一个处理器,所能提高的系统性能有限。 资源共享的双核系统 资源共享的双核系统如图2所示,首要考虑的是资源共享的问题,因为共享的资源能被一个以上处理器所访问。决定系统中的哪些资源被共享,以及不同处理器之间如何共同使用这个资源是非常关键的问题。其中共享资源分为存储器和外设,下面分别介绍这两种情形。
外设的共享 通常情况下,Nios II双核系统并不支持非存储设备的共享。在双核系统中外设的共享目前有相当的难度,的问题就是外设的中断问题。例如,当外设能够中断所有的处理器时,就没有一个可靠的办法来保证哪个处理器做出中断响应并进入中断服务程序,而且,如果外设被用来作为输入设备,就很难决定选用哪个处理器来接收输人的数据。 可能存在一个非常复杂的握手系统来处理此类情况,但是Nios II HAL库并不支持这种系统。所以,在Nios II中不支持外设的共享。 存储器的共享 存资源共享的双核系统中,仔储器是常见的共享资源。存储器的共享既能用来在多个处理器之间进行简单的状态通信,也能同时被多个处理器共同进行复杂的数据结构运算。 在资源共享的双核系统中,当存储器用来在多个处理器之间共享数据的话,必须谨慎的进行操作,因为数据是可以读也可以写的。如果一个处理器在对存储器的某一地址写数据的同时,另一处理器也在对同一地址进行读写操作的话,那么就可能发生数据冲突,进而导致程序错误,严重的是可能造成系统的崩溃,必须使用一种机制来告知其他的处理器,以免发生冲突。系统中的硬件互斥核就能满足这个要求。 硬件互斥核 硬件互斥核可以确保在共享资源时不发生冲突。互斥核是作为一种共享资源来使刚的,提供了一种测试和设置的操作,每个处理器在使用共享资源前,必须先测试互斥核是否可用,如果可用的话,就获得了共享资源的使用权,当处理器使用完后,释放互斥核。与此同时,另一个处理器就可以获得互斥核并使用共享资源了。如果没有这个互斥核,实现上述功能的话就需要2个单独的测试和设置指令,这时,有可能发生"死锁"的情况。 互斥内核有一个简单的Avalon从控制器接口,包含2个32位存储器映射寄存器mutex和reset。表1所列为互斥内核寄存器映射。 互斥内核有以下基本操作(假设多个处理器对一个瓦斥内核进行访问,并且每个处理器都有一个独特的标识符ID): (1) 当VALUE字段的值为0x0000时,互斥体可用(互斥体解除锁定);否则,互斥体不可用(互斥体被锁定) (2) mutex寄存器总是可读的。一个处埋器(或任何Avalon主控制器外设)可通过读取mutex寄存器来确定其当前的状态。 (3) mutex寄存器只在特定的条件下可写。只有满足下面的其中一个条件或两个条件都满足,才能通过写操作来更改mutex寄存器的内容: mutex寄存器的VALUE字段的值为0; mutex寄存器OWNER字段与被写入数据的OWNER字段相匹配。 (4) 处理器可通过将它的ID写入OWNER字段和向VALUE字段写入一个非零值来获取互斥体。然后处理器再通过验证OWNER字段来检查是否成功地获得了互斥体。 (5) 系统复位后,reset寄存器的RESET位为高。该位通过向其写入1来清除。 软件设计 在双核系统中设计并运行软件与单处理器系统并没有什么太大的差别,仅仅需要考虑以下几个方面。 程序存储器 SOPC Builder提供了一个简单的存储分配原则来满足上述要求,这个分配原则使用异常地址来决定运行那个处理器上的软件设计。Nios II IDE终负责链接处理器的软件设计并映射到存储器中,并为每个处理器提供其拥有的段空间来运行软件设计。如果两个处理器的软件设计被映射到同一个物理存储设备上,此时每个处理器的异常地址就用来决定哪一个处理器的软件设计能占据空间的基地址。 对任何一个单处理器或多处理器系统来说,有5个主要的代码段需要映射到存储器的同定地址中,这些代码段是: .text--存放实际的执行代码 .rodata--存放实际执行代码中所使用的常 .rwdata--存放读/写变量和指针 Heap--自动分配的空间 Stack--存放函数调用的参数和其他临时的数据 在多处理器系统中,可能需要仅仅使用一个存储器来存放每个处理器的所有代码段。在这时,每个处理器的异常地址就用来指定各个处理器之间的边界,如图3所示。
启动地址 在多处理器系统中,每个处理器必须从自己的程序段中启动,对于一个非易失性存储器的同一地址空间上的可执行代码的相同位,不可能启动多个处理器。启动存储器和程序存储器一样也能被分区,但足段空间的概念和映射就不一样了,启动代码通常只需要把程序代码拷贝到所映射的存储器中,然后跳转到程序代码就可以了。在同一个非易失性存储器设备的不同段空间上启动多处理器,只需要在存储器上简单的设置每个存储器的复位地址就可以了。 基于Nios II双核系统的API函数 对于Nios II处理器用户,Altera提供了可用来访问互斥内核硬件的驱动程序,利用驱动程序可以直接对低层的硬件进行操作。以下为API函数的说明: (1) altera_avalon_mutex_is_mine() 功能:判断CPU是否获得了互斥核的使用权 (2) altera_avalon_mutex_first_lock() 功能:判断自从复位后互斥核是否已被释放 (3) altera_avalon_mutex_lock() 功能:获得硬件互斥核,同时用参数装载互斥核 (4) altera_avalon_mutex_open() 功能:检索指向硬件互斥核的设备结构指针 (5) altera_avalon_mutex_trylock() 功能:尝试锁定硬件互斥核并立即返回 (6) altera_avalon_mutex_trylock() 功能:释放硬件互斥核。并把存在互斥核中的值设为0。 Nios II双核系统的工作流程大致如下:先使用函数(4)打开互斥核,然后使用函数(2)来判断是否已经有处理器获得了互斥核,使用函数(5)来判断互斥核此时是否可用,并尝试获得互斥核,使用函数(3)来获得互斥核的使用权,并把其cpuid控制寄存器的值写入mutex寄存器的OWNER字段来锁定互斥核。随后,使用函数(1)来判断锁定是否成功,在使用完互斥核之后,必须使用函数(6)来释放互斥核。 本文所设计的双核系统是基于Altera公司的FPGA,因为其Nios II软核的特点,除了具有一般FPGA的优势之外,只要在成本允许的情况下,还可以很方便对原系统进行升级,即可以在双核系统的基础上方便的实现3核、4核等多核系统,获得更高水平的计算能力和性能。 | ||
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。