morimayu
2018年3月5日 12時24分
いつもお世話になっております。森と申します。
カーネルモジュール内で、5ms以内のタイマ処理を実装したいと思っております。
カーネルタイマ(add_timer、mod_timer)で試したところ、
HZが100であるため、10msより早くタイマを機能させることができませんでした。
そのため、HZを1000に設定変更させようと思いますが、問題ありませんでしょうか。
以下の箇所を100から1000に変更しカーネルのリコンパイル、再ロードを考えております。
include\uapi\asm-generic\param.h(5): #define HZ 100
手順としては、あっておりますでしょうか。
以上、よろしくお願いいたします。
コメント
morimayu
morimayu
at_mizo
溝渕です。
> こちら少々気になっており、
> HWタイマで実現する方法も並行して検討してみようと思います。
> 正確に5ms以内で刻めるタイマとして使用でき、
LinuxカーネルはリアルタイムOSではない(最悪応答時間を保証する設計となっ
ていない)ため、 *正確に* 指定した時間内に処理をすることができません。
> HW使用可能なタイマ情報も教えていただけませんでしょうか。
i.MX 7Dの実装では、タイマにHWを利用しています。i.MX 7DのGeneral
Purpose Timer(GPT)を利用しています。
> 恐れ入りますが、このあたりを実現するための情報等ありますでしょうか。
>
> > また、より分解能の高いタイマーとしてハイレゾリューションタイマーもあります。
概要については、以下のドキュメントが参考になると思います。
Documentation/timers/hrtimers.txt
API使用については、カーネルドキュメントに記載が無いことから、以下のヘッ
ダに記載の機能の実装を調べるか、WEBで調査することになると思います。
include/linux/hrtimer.h
ハイレゾリューションタイマーを利用しても、「正確に5ms以内で刻む」こと
を保障することはできないと思います。
morimayu
森です。
度々、初歩的な質問で申し訳ございません。
> i.MX 7Dの実装では、タイマにHWを利用しています。i.MX 7DのGeneral
> Purpose Timer(GPT)を利用しています。
i.MX 7Dでは、4つのGPTをサポートしているとの記載があるのですが、
現状のままでは、GPT2を使用することができませんでした。
(2から4のレジスタをリードするとリブートする。)
GPT2を使用可能にするためには、どのようにしたら良いのでしょうか?
現状使用されているGPT1をそのまま共有で使用することも可能なのでしょうか?
その場合、GPT1で5msタイマとして機能させる事ができますか?
以上、よろしくお願いいたします。
at_mizo
溝渕です。
> i.MX 7Dでは、4つのGPTをサポートしているとの記載があるのですが、
> 現状のままでは、GPT2を使用することができませんでした。
> (2から4のレジスタをリードするとリブートする。)
> GPT2を使用可能にするためには、どのようにしたら良いのでしょうか?
恐らくGPTのコアにクロックが供給されていないのではないでしょうか?
arch/arm/mach-imx/time.c
を参考にクロックを供給してみてください。
> 現状使用されているGPT1をそのまま共有で使用することも可能なのでしょうか?
> その場合、GPT1で5msタイマとして機能させる事ができますか?
ハイレゾリューションタイマーを利用すると、5msの分解能での利用も可能です。
morimayu
溝渕様
最初にご教授いただいた、以下の確認を行っております。
> カーネルコンフィギュレーションで、以下を変更するのがスマートと思います。
> Kernel Features --->
> Timer frequency (100 Hz) --->
ただ、make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm
すると以下のエラーが発生します。
(1000Hzではなく100Hzに戻すとエラーはなくなります)
Restart config...で入力を求められる内容については、全てエンターしています。
念のため、カーネルmake時の出力内容も添付いたします。
====
arch/arm/kernel/devtree.o: 関数 `of_free_overlay_info' 内:
devtree.c:(.text+0x0): `of_free_overlay_info' が重複して定義されています
arch/arm/kernel/setup.o:setup.c:(.text+0x29c): ここで最初に定義されています
arch/arm/kernel/perf_event_cpu.o: 関数 `of_free_overlay_info' 内:
perf_event_cpu.c:(.text+0x1120): `of_free_overlay_info' が重複して定義されています
arch/arm/kernel/setup.o:setup.c:(.text+0x29c): ここで最初に定義されています
scripts/Makefile.build:387: recipe for target 'arch/arm/kernel/built-in.o' failed
make[1]: *** [arch/arm/kernel/built-in.o] Error 1
Makefile:845: recipe for target 'arch/arm/kernel' failed
make: *** [arch/arm/kernel] Error 2
root@atde6:/home/atmark/linux-3.14-x1-at17# make menuconfig
scripts/kconfig/mconf Kconfig
====
恐れ入りますが、解決方法をご教授いただけますでしょうか。
よろしくお願いいたします。
ファイル | ファイルの説明 |
---|---|
kernel_make_errlog.txt | カーネルmake時のログ |
at_mizo
溝渕です。
> Restart config...で入力を求められる内容については、全てエンターしています。
> 念のため、カーネルmake時の出力内容も添付いたします。
恐らく、x1_defconfigが適用されていない状態だと思います。
以下のページを参照し、x1_defconfigを適用した後に1000Hzに設定してみてく
ださい。
https://manual.atmark-techno.com/armadillo-iot-g3l/armadillo-iotg-g3l_p…
morimayu
at_mizo
morimayu
at_mizo
2018年3月5日 12時47分
溝渕です。
> カーネルモジュール内で、5ms以内のタイマ処理を実装したいと思っております。
Linuxカーネルは、リアルタイムOSではないので、5msでタイマーをかけると、
5ms以上後にイベントが発生する点に注意してください。
> 以下の箇所を100から1000に変更しカーネルのリコンパイル、再ロードを考えております。
>
> include\uapi\asm-generic\param.h(5): #define HZ 100
>
> 手順としては、あっておりますでしょうか。
カーネルコンフィギュレーションで、以下を変更するのがスマートと思います。
Kernel Features --->
Timer frequency (100 Hz) --->
また、より分解能の高いタイマーとしてハイレゾリューションタイマーもあり
ます。