cooja的原理
最近一直在关注cooja的实现,看了很多源代码,大概理解了一点点,总结一下:1,contiki的代码里面:platform目录里面有cooja这个平台,在这个平台里面有软件实现contiki仿真的底层实现:SYS首先我们看到sys,这部分代码是软件实现了线程,与contiki里的线程是不同的,这个线程是linux平台的NET这里是net的抽象接口,与通常contiki平
最近一直在关注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)