通过系统管理器,可以从远程服务器下载Java应用程序。系统管理器主要实现了下面3种协议:
1. 应用程序代码(包括可对FPGA进行编程的比特流)下载协议;
2. 用于远程管理的系统维护相关的协议;
3. 控制对嵌入式系统访问权限的认证协议。
系统管理器包括基于socket连接的客户端类加载器。远端应用程序可以下载到本地并按照下面的过程执行:
1. 完成认证过程,系统进入管理模式;
2. 下载应用程序代码,完成系统初始化,比如加载FPGA可编程比特流到相应的存储单元;
3. 执行新的应用程序。
在该系统中,为了简化起见,预先映射硬件方法地址到确定的系统物理存储区,目的是为了寻址操作的方便快捷。
由于我们使用了Java软件平台,应用程序就无法直接访问底层的硬件。这就是说,运行在处理器Java虚拟机上的应用程序不能直接访问映射到FPGA中硬件方法的缓存区域。为解决这个问题,理论上可以采用下面两种方法:
1. 修改Java虚拟机,使其具有对处理器物理地址的直接访问能力;
2. 单独设计一种Java本地接口(JNI),使得应用程序通过该接口提供的功能实现对硬件方法映射到的物理地址的访问。
尽管第一种方案的效率较高,并且没有引入额外开销,但是修改Java虚拟机内核是相当繁杂的工作,同时也可能会引起潜在的系统不稳定。第二种方案虽然引入了一定的额外开销,但便于移植和实现。因此,我们采用方案二,在Java虚拟机和Java本地接口之外又设计了一个本地通信库。
本地通信库API形式如下:
int hwWriteXXX(int addr, XXX p);
int hwWriteArrayXXX(int addr, XXX[] p);
XXX hwReadXXX(int addr);
XXX[] hwReadArrayXXX(int addr);
int hwConfig(int cf_mem_addr, int bitstr_size);
Java本地接口层接口的形式如下:
class HWInterface{
static int ConfigStatus;
public static native int setParam(CID hw_cid, object P)
{
if(type_of_P == XXX)
err = hwWriteXXX(hw_cid.addr, (XXX)P);
return err;
}
public static native int getResult(CID hw_cid, object R);
public static native int setCMD(CID hw_cid, int cmd);
public static native int getStatus(CID hw_cid);
public synchronized static native int configHW( CID hw_cid);
}
在上面代码中,XXX表示基本的Java数据类型如整型(integer)、浮点型(float)、双精度型(double)等。
Java应用程序通过类HWInterface提供的方法访问本地库。上面的代码中给出了setParam的具体实现。其中,CID是包括硬件方法映射到的缓存地址的一个对象,对应于每个硬件方法的CID都是唯一的,因此,该地址和缓存区大小都是事先已经确定了的。但是,由于系统中只有一个配置控制器,我们无法同时就两个或多个硬件方法向FPGA进行编程,也可以说同一时刻只能有一个硬件方法在使用配置控制器。为此,引入了一个静态变量ConfigStatus来反映配置控制器的当前状态。所以,访问配置控制器的函数configHW()是静态的同步的。
使用上面给出的接口,则下面这段代码
methodA()
{
…;
int a = objA.m1(2); //SW method
int b = objB.m2(3); //HW method
int c = a + b;
…;
}
就应该写成下面的形式:
methodA()
{
…;
1 HWInterface.configHW(cid2); // cid2 is the ID of HW method m2
2 Object P = new Integer(3);
3 HWInterface.SetParam(cid2,P);
4 HWInterface.startHW(cid2);
5 int a = objA.m1(2);
6 Object R = new Integer();
7 While(HWInterface.getResult(cid2, R) == 0)
; //wait until HW method finished
8 HWInterface.getResult(cid2, R);
9 int b = ((Integer)R.getValue());
10 int c = a + b;
…;
}
4. 总结
本文用一种全新的思路,对传统的嵌入式系统进行了改进,实现了一种能够支持多种应用的嵌入式系统平台。利用FPGA的可编程性和Java平台良好的移植性能,该平台完全能够满足我们的设计要求。当然,也有不足之处,比如对配置控制器的状态的获取,可以考虑使用中断的方式来实现,而不是采用本文中的循环查询机制。这将在以后的工作中加以改进。
参考文献:
1. T.Kuhn, W.Rosenstiel, Java Based Modeling and Simulation of Digital Systems on Register Transfer Level, Int. Workshop on System Design Automation, 1998
2. Sun Microsystems, Inc, Embedded Java Application Environment, http://java.sun.com/products/embeddedjava/
3. B.Jeong, S.Yoo, S.Lee, Hardware-Software Cosynthesis for Runtime Incrementally Reconfigurable FPGAs
本文来源:微计算机信息 作者:杜海兵 王民北