0

ドライバーによって行われたいくつかの関数呼び出しの時間を計ろうとしています。だから私は時間do_gettimeofdayを取得するために電話をしstruct 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整数から倍精度への変換です(これによる。これは、私の問題が単にリンクしているのではなく、コンパイラに正しい命令または代理命令(で行われているように見える)を使用するように説得することを意味していると思います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 に答える