如何在Contiki OS中的运行时执行其他二进制文件?

Par*_*des 9 c elf contiki

我试图制作一个在Contiki OS上运行的传感器,以执行新的二进制文件并替换当前的二进制文件(如果发生事件)。

我正在使用Cooja模拟器和Sky note,并且将二进制文件上传到节点的Coffee文件系统中(使用Cooja脚本),我想执行hello-world.ce

要编译我将动态加载模块的当前程序(reboot.c),我使用了以下命令:

  1. 使TARGET =天空干净CLEAN =符号。
  2. 使reboot.sky TARGET = sky
  3. 使CORE = reboot.sky TARGET = sky reboot.sky

对于将要加载的hello-world,我使用了:

  1. 使TARGET = sky hello-world.ce

这是我试图执行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();
}
Run Code Online (Sandbox Code Playgroud)

似乎elfloader_autostart_processes设置为null,因为print语句未在for循环中执行。该程序继续并打印“重启程序结束”,我期望它可以打印hello-world,以指示二进制文件已加载并启动。

您能提供什么帮助吗?

Par*_*des 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();
}
Run Code Online (Sandbox Code Playgroud)

库贾脚本

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");
Run Code Online (Sandbox Code Playgroud)