Armadilloフォーラム

カーネルモジュールにて5ms性能タイマ実装

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

手順としては、あっておりますでしょうか。

以上、よろしくお願いいたします。

コメント

溝渕です。

> カーネルモジュール内で、5ms以内のタイマ処理を実装したいと思っております。

Linuxカーネルは、リアルタイムOSではないので、5msでタイマーをかけると、
5ms以上後にイベントが発生する点に注意してください。

> 以下の箇所を100から1000に変更しカーネルのリコンパイル、再ロードを考えております。
>
> include\uapi\asm-generic\param.h(5): #define HZ 100
>
> 手順としては、あっておりますでしょうか。

カーネルコンフィギュレーションで、以下を変更するのがスマートと思います。

Kernel Features --->
Timer frequency (100 Hz) --->

また、より分解能の高いタイマーとしてハイレゾリューションタイマーもあり
ます。

溝渕様

ありがとうございます。

> Linuxカーネルは、リアルタイムOSではないので、5msでタイマーをかけると、
> 5ms以上後にイベントが発生する点に注意してください。

こちら少々気になっており、
HWタイマで実現する方法も並行して検討してみようと思います。
正確に5ms以内で刻めるタイマとして使用でき、
HW使用可能なタイマ情報も教えていただけませんでしょうか。

以上、よろしくお願いいたします。

溝渕様

何度も申し訳ありません。
まずは、以下を試してみようと思います。
恐れ入りますが、このあたりを実現するための情報等ありますでしょうか。

> また、より分解能の高いタイマーとしてハイレゾリューションタイマーもあります。

溝渕です。

> こちら少々気になっており、
> 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以内で刻む」こと
を保障することはできないと思います。

森です。

度々、初歩的な質問で申し訳ございません。

> i.MX 7Dの実装では、タイマにHWを利用しています。i.MX 7DのGeneral
> Purpose Timer(GPT)を利用しています。

i.MX 7Dでは、4つのGPTをサポートしているとの記載があるのですが、
現状のままでは、GPT2を使用することができませんでした。
(2から4のレジスタをリードするとリブートする。)
GPT2を使用可能にするためには、どのようにしたら良いのでしょうか?

現状使用されているGPT1をそのまま共有で使用することも可能なのでしょうか?
その場合、GPT1で5msタイマとして機能させる事ができますか?

以上、よろしくお願いいたします。

溝渕です。

> i.MX 7Dでは、4つのGPTをサポートしているとの記載があるのですが、
> 現状のままでは、GPT2を使用することができませんでした。
> (2から4のレジスタをリードするとリブートする。)
> GPT2を使用可能にするためには、どのようにしたら良いのでしょうか?

恐らくGPTのコアにクロックが供給されていないのではないでしょうか?

arch/arm/mach-imx/time.c

を参考にクロックを供給してみてください。

> 現状使用されているGPT1をそのまま共有で使用することも可能なのでしょうか?
> その場合、GPT1で5msタイマとして機能させる事ができますか?

ハイレゾリューションタイマーを利用すると、5msの分解能での利用も可能です。

溝渕様

最初にご教授いただいた、以下の確認を行っております。

> カーネルコンフィギュレーションで、以下を変更するのがスマートと思います。
> 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時のログ

溝渕です。

> Restart config...で入力を求められる内容については、全てエンターしています。
> 念のため、カーネルmake時の出力内容も添付いたします。

恐らく、x1_defconfigが適用されていない状態だと思います。

以下のページを参照し、x1_defconfigを適用した後に1000Hzに設定してみてく
ださい。
https://manual.atmark-techno.com/armadillo-iot-g3l/armadillo-iotg-g3l_p…

森です。

何度か、make ARCH=arm x1_defconfig は試しております。(元の状態に戻すため)
x1_defconfigを実行した後、make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm ではエラーになりません。
その後、100Hzを1000Hzに変更して make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm を行うとエラーとなってしまいます。

以上、よろしくお願いいたします。

溝渕です。

> その後、100Hzを1000Hzに変更して

100Hzを1000Hzに変更するコマンドは、

make ARCH=arm menuconfig

でしょうか(ARCH=armを付けていますか)。

森です。

申し訳ございません。

make menuconfig で設定しておりました。

ご指摘いただいた通り以下で実施したところ、
正常にコンパイルが通りました。
HZも1000で動作することを確認できました。

>
> make ARCH=arm menuconfig
>
> でしょうか(ARCH=armを付けていますか)。