我在使用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
如果我尝试使用“/”分区,则会导致类似 错误消息
仍然,我收到错误:“未找到细分:” 我试着计算斜率。
非常感谢您的帮助和最好的问候,
Ca Way Le
答案 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 错误的情况,这对我有用。