0

我正在尝试对驱动程序进行的某些函数调用进行计时。所以我打电话do_gettimeofdaystruct timeval时间。它编译,但链接器因此抱怨:

drivers/built-in.o: In function `SPC_TIMING_add':
hid-quirks.c:(.text+0x31354): undefined reference to `__aeabi_i2d'
hid-quirks.c:(.text+0x31384): undefined reference to `__aeabi_i2d'
hid-quirks.c:(.text+0x31398): undefined reference to `__aeabi_dadd'
make: *** [.tmp_vmlinux1] Error 1

我尝试直接读取 的值xtime,并得到相同的结果。

显然,链接顺序存在某种错误,但是由于我不确定从哪里来__aeabi_i2d__aeabi_dadd所以我不知道要编辑哪个makefile。

更新:原来“aeabi”是指 ARM 架构的“嵌入式应用程序二进制接口”(EABI)。该dadd指令是双精度加法,并且i2d是整数到双精度的转换(根据this)。我想这意味着我的问题不仅仅是链接,而是说服编译器使用正确的指令或代理指令(这似乎是在 中所做的arch/arm/lib/lib1funcs.S)。

更新:根据谷歌搜索,__aeabi_dadd通常别名为__adddf3,并__aeabi_i2d别名为__floatsidf.

更新:仔细查看实际编译器的输出后,发现错误与do_gettimeofday. 只是注释掉调用do_gettimeofday允许编译器的优化器删除对执行双精度浮点运算的函数的引用。一旦不再调用该函数,该错误就不会出现。这就是为什么我认为它是由do_gettimeofday.

4

1 回答 1

2

如果你在内核中,你可能不应该使用do_gettimeofday().

我认为正确的方法是使用ktime函数族,例如:

ktime_t start, end, delta;

start = ktime_get();
...
end = ktime_get();

delta = ktime_sub(end, start);

然后有一堆转换例程ktime.h用于转换delta为毫秒/纳米/等秒。

于 2012-08-14T08:18:40.630 回答