您可以添加到网摘 让更多人关注此文章:
引言
随着应用领域的扩大,人们对微处理器系统的性能、功耗和成本提出了越来越严格的要求。单纯依靠提升时钟的方法已经不能满足需要,在移动通信、军事应用、消费电子、智能控制设备等领域,多核处理器的解决方案成为一种主流趋势。
Altera公司在其FPGA中实现的NiosII处理器是一个用户可配置的通用32位RISC软核微处理器,Nios II 5.0及其以上版本支持多处理器系统的创建和调试。Nios II多处理器,除了软核本身超过200DMIPS的高性能之外,Altera开发用于Nios/NiosII处理器的Avalon参数化接口总线具有友好的多主从仲裁能力,可以有效地实现系统资源共享。在清华-Altera联合实验室的支持下,笔者对NiosII多核处理器之间共享通信的几种可行方案进行研究,并且在自行设计的NiosII开发板上完成设计测试验证,分析比较各种方案的技术特点、优势与不足,提供给不同系统的应用者参考。
NiosII多核间几种可行的通信方案
双口RAM和PIO核的多核中断通信方案
双处理器可采用一个双口RAM和中断信号通过定义某种信息数据结构来进行通信。在NiosII双处理器系统,可以采用FPGA中实现的片上双口RAM和通用IO组件PIO核来实现多核中断通信。通信的中断信号使用PIO组件产生和接收,双核通信的连接如图1所示。由于Avalon总线具有多主从仲裁能力,同一外设可以同时挂载在不同软核上,有访问竞争时由总线自己仲裁决定哪个主方取得从设备访问权,双口RAM和单口RAM均可以通过Avalon总线挂载在多个NiosII软核上,二者的区别在于:双口RAM设备有两套从端口被Avalon总线当作两个设备,双核可以同时对其进行读操作;单口RAM只有一套从端口被Avalon总线当作一个设备,多核对其的读写操作是分时进行的。

这里设计双核通过双口RAM和PIO中断进行通信的例程。设计信息交换的数据结构share_msg_buf如表1所示。安装中断程序及终端服务例程如图2所示。

通信的关键在于消息标志flag状态的定义:NO_DATA-内存空闲、DATA_IN-有新消息写入、DATA_OUT-新消息已送出,单个软核处理器在存储器空闲(NO_DATA状态)或者有消息进入(DATA_IN状态)将新消息读走之后才能在存储区写入新的消息数据;在自己发的消息还未被对方接收(DATA_OUT状态)时,不做处理,返回继续等待对方接收消息。标志状态的定义从软件上实现了双核对双口RAM的互斥访问,有效防止双核对共享数据的破坏。这种通信方案经过笔者的NiosII双核系统验证测试,消息接收正确。
互斥硬核和共享存储的多核查询通信方案
Altera在SOPC Builder工具箱中提供具有Avalon接口的互斥硬核Mutex组件来协调共享资源的访问。Mutex核提供一个基于硬件的原子测试和置位(test-and-set)操作,允许多处理器环境下决定软核对Mutex核的使用权,使用Mutex核就可实现多核对相应共享资源(如存储器)的互斥访问。这样多核的通信就可以舍弃双口RAM,使用片上RAM或者片外存储器作为共享存储器,采用查询方式实现。双核通信的设备连接如图3所示,与双口RAM不同,这里的片上RAM仅作为一个设备挂载到Avalon总线上。

Altera提供NiosII HAL环境下对Mutex核访问的函数:打开、加锁、解锁、判断Mutex属主等。使用Mutex核控制片上RAM,单个软核每次对片上RAM操作之前都要首先取得Mutex核所有权,操作完之后应立即放弃对Mutex核的所有权,避免单个软核对Mutex核及共享资源的独占。采用前面表所定义的数据结构作为通信的消息,在查询方式下,单个软核需要有任务通过循环不断检查共享数据区标志位flag,等待其它软核送来消息,以便激活自身系统挂起的任务,执行下一步工作。整个流程如图4所示。
在循环中使用等待延时,避免了多核对Mutex核资源的不停争用,同时留给处理器一定的消息处理时间,但缺点是延长了通信呼叫和应答的时间,在实时设计中应考虑到延时时长对多核通信的影响。此方案在笔者的NiosII双核系统工程中通过验证。
邮箱内核和共享存储的多核阻塞通信方案
Altera还提供带Avalon接口的邮箱内核mailbox组件在多核处理器之间发送消息。邮箱内核含有两个互斥体:一个保证对共享存储器的唯一写访问;另一个保证对共享存储器的唯一读访问,它与独立共享存储器一起使用实现多核处理器间的消息队列通信。邮箱内核适于双核间单方向的消息通信,功能相当于FIFO缓冲队列,其传送的消息往往是指向共享内存块结构体的指针,代替实际的数据传输,提高数据交换效率。该系统连接如图5所示。

在NiosII HAL环境下对邮箱内核访问的函数有:打开、关闭、获取消息、等待消息、发送消息。在构建邮箱内核组件时,选择可用的共享存储器作为消息队列内存,指定消息队列长度size(不超过存储器容量)及其在存储器中的偏移量Offset。这里选择片上RAM作为共享存储器,将其分为两部分:一部分作为消息队列内存;一部分作为消息指针指向的内存数据结构块。定义内存数据结构如表2所示,头信息info可以作为数据帧的序号,保证数据的按序接收。使用邮箱内核消息队列完成双核间大量数据传输的流程如图6时进行等待;数据接受方处理器处于等待消息的状态,一有消息就接收进来。可以在实时操作系统中单独建立发送数据和接收数据的任务,由于没有中断和查询过程,此方案可以达到单方向很高的数据传输率,在笔者的NiosII系统工程中得到了验证测试。


通用串行接口总线的多核通信方案
在NiosII多核处理器中可以使用通用串行接口总线如UART、SPI、I2C等进行相互间的通信。这些总线有的是NiosII的通用组件在SOPC Builder中直接添加使用,有的可成熟的第三方组件在SOPC Builder中使用。目前NiosII中可用的几种串行总线如表3所示。

几种总线各有优缺点和使用限制,例如UART总线比较通用、工作在异步方式,使用方便,但针对一对一的通信,数据率稍低;SPI总线工作在同步方式,一个主设备可以挂多个从设备,数据率较高,但控制比UART复杂、数据线较多。应根据具体应用选择合适总线。这里以UART总线说明和验证通用串行接口总线完成多核间通信的方案。UART核是Altera提供的NiosII通用组件,实现了一个简单的寄存器映像的Avalon从接口,可以很容易集成到NiosII处理器中,允许主外设(如NiosII软核)通过读写寄存器与其进行通信。UART核至少创建Rxd输入和Txd输出两个IO端口,可根据需要创建CTS输入和RTS输出两个流控信号。这里为每个NiosII软核创建一个无流控波特率为1.152Mbps的UART组件,其发送端口Txd与另外一方的接收Rxd连接。NiosII HAL提供UART系统库驱动程序,可使用ANSC C标准函数或者UNIX风格IO函数访问UART,双核通信流程如图7所示。

双核中的数据发送方查询监测输入字符,出现关键字时发送数据,并以结束符结束发送;数据接收方等待用户输入字符命令,如果是关键字则开始接收数据,在收到结束符时结束接收,处理数据。这个方案实现的是数据接收方请求发送,在笔者NiosII系统工程中以1.152Mbps传输大数据量,验证测试没有问题。也可以根据实际需要使用其它方案。
[1] [2] 下一页
|