Contiki:如果ELF文件包含带有几个unsigned int的计算,则会出错

时间:2014-10-07 16:10:41

标签: file elf linear-regression contiki

我在使用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从主进程获取数据, 因为如果我只使用常数,计算斜率是有效的。

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

Ca Way Le

1 个答案:

答案 0 :(得分: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时会发生什么

对于 symbol not found 错误的情况,这对我有用。