如果发生事件,我试图制造一个在Contiki OS上运行的传感器以执行新的二进制文件并替换当前的二进制文件。
我正在使用Cooja模拟器和sky note,并将二进制文件上传到节点的coffee文件系统中(使用cooja脚本),我想执行hello-world.ce
要编译我当前要从其中动态加载模块的程序(reboot.c),请使用以下命令:
对于要加载的问候世界,我使用了:
这是我试图执行hello-world的代码(reboot.c)的一部分
#include "contiki.h"
#include "core/loader/elfloader.h"
#include "cfs/cfs.h"
PROCESS(hello_world_process, "Reboot process");
AUTOSTART_PROCESSES(&hello_world_process);
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(hello_world_process, ev, data)
{
PROCESS_BEGIN();
int i;
int binFile,ret;
elfloader_init();
binFile=cfs_open("hello-world.ce",CFS_READ);
printf("cfs_open:%d\n",binFile); //returns 0 so the file is opened
ret=elfloader_load(binFile);
cfs_close(binFile);
printf("loader returned: %d\n",ret); //returns 0 ->meaning everything is ok
if(ret == ELFLOADER_OK){
printf("elf OK\n");
for(i=0; elfloader_autostart_processes[i] != NULL; i++) {
printf("exec: starting process %s. \n", elfloader_autostart_processes[i]->name);
}
autostart_start(elfloader_autostart_processes);
}
printf("end of rebooting program\n”);
PROCESS_END();
}
由于未在for循环中执行print语句,因此elfloader_autostart_processes似乎设置为null。该程序继续并打印“重启程序结束”,我希望它能打印hello-world来指示二进制文件已加载并启动。
您能提供任何帮助吗?
答案 0 :(得分:0)
我设法使用Contiki库中的另一个版本来实现它。具体来说,我使用负责执行文件的shell-exec.c,并将要在运行时执行的文件作为参数提供给它。我使用了Cooja脚本将文件上传到Cooja模拟器中的传感器上。
#include "contiki.h"
#include "shell-exec.c"
#include "serial-shell.h"
#include "cfs/cfs.h"
#include <stdio.h> /* For printf() */
/*---------------------------------------------------------------------------*/
PROCESS(rebooting, "Reboot process");
AUTOSTART_PROCESSES(&rebooting);
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(rebooting, ev, data)
{
PROCESS_BEGIN();
static struct etimer et;
/* Allow some time for the file to upload using cooja. */
etimer_set(&et, 10 * CLOCK_SECOND);
PROCESS_WAIT_UNTIL(etimer_expired(&et));
process_start(&shell_exec_process,"hello-world.ce\0");
PROCESS_END();
}
Cooja脚本
WAIT_UNTIL(msg.startsWith('Starting'));
log.log("Mote started\n");
mymote = mote; /* store mote reference */
fs = mote.getFilesystem();
DIR="~/hello-world"; /* Directory that the binary is stored in the host machine running cooja */
mote_file=DIR+ "hello-world.ce";
ret=fs.insertFile(mote_file);
log.log("inserted");