cooja的原理

最近一直在关注cooja的实现,看了很多源代码,大概理解了一点点,总结一下:

1,contiki的代码里面:platform目录里面有cooja这个平台,在这个平台里面有软件实现contiki仿真的底层实现:


SYS

首先我们看到sys,这部分代码是软件实现了线程,与contiki里的线程是不同的,这个线程是linux平台的

NET

这里是net的抽象接口,与通常contiki平台一样实现即可。

LIB

这部分就是仿真的接口,可以看到simEnvChange.h里面

/* Simulation interface structure */
struct simInterface {
  void         (* doActionsBeforeTick) (void);
  void         (* doActionsAfterTick)  (void);
};
这个结构体提供了2个函数指针,通过这个结构体我们可以把我们软件实现的驱动注册到一个驱动接口里面,通过上层的java实现来给底层的平台提供输入输出;

DEV

这里就是软件实现的驱动部分,我们找一个LED的驱动来看一下:

#include "dev/leds.h"
#include "lib/simEnvChange.h"

const struct simInterface leds_interface;

// COOJA variables
unsigned char simLedsValue;

/*-----------------------------------------------------------------------------------*/
void leds_arch_init() {
  simLedsValue = 0;
}
/*-----------------------------------------------------------------------------------*/
unsigned char leds_arch_get() {
  return simLedsValue;
}
/*-----------------------------------------------------------------------------------*/
void leds_arch_set(unsigned char leds) {
  if(leds != simLedsValue) {
    simLedsValue = leds;
  }
}
/*-----------------------------------------------------------------------------------*/
static void
doInterfaceActionsBeforeTick(void)
{
}
/*-----------------------------------------------------------------------------------*/
static void
doInterfaceActionsAfterTick(void)
{
}
/*-----------------------------------------------------------------------------------*/

SIM_INTERFACE(leds_interface,
	      doInterfaceActionsBeforeTick,
	      doInterfaceActionsAfterTick);
我们可以看到在最后调用了SIM_INTERFACE这个宏,我们可以展开看:
// Definition for registering an interface
#define SIM_INTERFACE(name, doActionsBeforeTick, doActionsAfterTick) \
const struct simInterface name = { doActionsBeforeTick, doActionsAfterTick }
是定义了一个包含有2个函数指针的接口结构体对象。

CFS

这里是文件系统的驱动实现,与DEV里面的驱动类似,都是采用相同的simEnvChange方式来注册;

以后的就是软件来实现的cooja平台部分,但是还有一个最重要的部分:contiki-cooja-main.c


contiki-cooja-main.c

可以看到在这个文件里面是没有main入口函数的,这个与我们通常认为的程序有出入,为什么?因为这不是一个可执行的程序,而是一个动态库!

我们可以看到:

JNIEXPORT void JNICALL
Java_se_sics_cooja_corecomm_CLASSNAME_init(JNIEnv *env, jobject obj)
这是JAVA调用C/C++的JNI接口: 是JAVA与动态链接库交互的接口。

所以我们在cooja平台下用gcc编译出来的是一个动态链接库,这些接口提供了上层java与嵌入式底层之间的交互,然后java可以实例化出多个嵌入式节点,通过调用JNI程序类的native方法,就是与底层嵌入式节点交互。实现软件仿真contiki的目的。








  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值