利用Java良好的移植特性的FPGA可编程嵌入式系统
1. 应用程序代码(包括可对FPGA进行编程的比特流)下载协议;本文引用地址://m.amcfsurvey.com/article/148784.htm
2. 用于远程管理的系统维护相关的协议;
系统管理器包括基于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)等。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)
评论