0

我在使用 contiki ELF-loader 时遇到了一些问题,希望有人能提供更多的见解或一些提示来解决这些问题。在下文中,我尽量保持问题描述简短。

我的目标是:

  • 在 T-Mote-Sky 上执行 ELF 文件。

  • 此 ELF 文件包含一个带有计算的 contiki 过程(数据样本随时间的线性回归)。

  • 使用“cooja”进行模拟

代码具体信息:

  • ELF 文件大小约 2000 字节

  • 几个 unsigned-int-16 数字的相当大的计算:


    for (i = 0; i < 10; i++) {
    sum_x += records[i].index;
    sum_y += records[i].energy;
    sum_xx += ((uint16_t) records[i].index) * ((uint16_t) records[i].index);
    sum_xy += ((uint16_t) records[i].index) * ((uint16_t) records[i].energy);
    }
    slope = ((size * sum_xy) - (sum_x * sum_y)) / ((size * sum_xx) - (sum_x * sum_x));

  • “记录”在调用elfloader的主进程中初始化和定义,并通过extern定义访问

  • 如果我使用常量进行计算,它会起作用

问题:

  • 如果我尝试将乘法与“*”一起使用,则会导致错误消息:Symbol not found: __MPY

  • 如果我尝试将除法与“/”一起使用,则会导致类似的错误消息

    • 所以我的解决方法是乘法和除法基于加法,并且它有效(在大多数情况下)
  • 尽管如此,当我尝试计算斜率时,我仍然收到错误:“未找到段:”。

    • 我推断这是内存大小的问题或试图通过 extern 从主进程获取数据,因为如果我只使用常量,计算斜率是有效的。

非常感谢您的帮助和问候,

卡威乐

4

1 回答 1

0

在尝试加载包含浮点计算的 elf 文件时,我遇到了类似的问题(未找到符号),因此我使用了一种解决方法以防万一有人感兴趣

  • 编译elf文件

    make elfname.ce SMALL=0
    
  • 使用十六进制查看器打开 elf 文件并找到存储符号的部分。它接近文件末尾。

  • 假设存储在那里的符号是:timer_set __addsf3 __subsf3, printf puts autostart_processes。(要加载的进程的名称也在这些值中,但忽略它)
  • 在项目目录下新建文件mysymbols.c ,内容如下

    #include "loader/symbols.h"
    
    extern int __addsf3();
    extern int __subsf3();
    extern int etimer_set();
    int printf(const char *, ...);
    extern int puts();
    
    const int symbols_nelts = 7;
    const struct symbols symbols[7] = {
    { "__addsf3", (void *)&__addsf3 },
    { "__subsf3", (void *)&__subsf3 },
    { "autostart_processes", (void *)&autostart_processes },
    { "etimer_set", (void *)&etimer_set },
    { "printf", (void *)&printf },
    { "puts", (void *)&puts },
    { (const char *)0, (void *)0} };
    

    (注意符号必须排序)

  • 在makefile中添加以下代码

    ifdef CORE
    .PHONY: symbols.c symbols.h
    symbols.c:
         $(NM) $(CORE) | awk -f $(CONTIKI)/tools/mknmlist > symbols.c
    else
         symbols.c symbols.h:
         cp mysymbols.c symbols.c
         cp ${CONTIKI}/tools/empty-symbols.h symbols.h
    endif
    
  • 现在编译包含主进程的文件

    make TARGET=sky clean CLEAN=symbols.?
    make your-file.sky TARGET=sky SMALL=0
    
  • 将elf文件加载到运行主进程的mote中,看看elfloader加载elf时会发生什么

对于找不到符号错误的情况,这对我有用。

于 2015-01-12T19:06:06.350 回答