EDN China > 技术文章 > 嵌入式系统 > 开发工具 > 正文
? 2016博客大赛-不限主题,寻找电子导师,大奖升级??

一种基于Java的可编程嵌入式系统设计

来源:微计算机信息?? 2007年09月21日 ?? 收藏0

?????? 由于我们使用了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, i

nt 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;
…;

  }


?? ?? ??


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
?? ??

Java? 嵌入式? 可编程?

相关文章

我来评论
美国的游客
美国的游客 ??? (您将以游客身份发表,请登录 | 注册)
?
有问题请反馈