Armadilloフォーラム

POSIX割り込みタイマーにおけるMONOTONIC使用について

hiroyuki_miyake

2014年5月23日 16時34分

三宅と申します。

現在、armadllo-220,230およびarmaggio-9を用いて開発を行っております。
カーネル:linux-2.6.12.3-a9-18

event.sigev_notify = SIGEV_THREAD; 
event.sigev_notify_function =(void *)aFunc; 
if (timer_create((clockid_t)CLOCK_REALTIME,&event,&timerId )==(-1)) 
{ 
    return (ERROR); 
} 
itspec.it_interval.tv_sec = itspec.it_value.tv_sec; 
itspec.it_interval.tv_nsec =  itspec.it_value.tv_nsec; 
 
if (timer_settime( timerId, 0, &itspec, NULL)==(-1)) 
{ 
    return (ERROR); 
}

を用いて定周期タイマーを生成し、動作させています。
しかし、システムの時刻がNTPと時刻整合し、大きく変更された際に、
このタイマーが一定期間停止してしまい、困っております。

過去のメーリングリストを参照させていただきましたところ、CLOCK_MONOTONICを
用いればシステム時刻に影響されないというものを知りました。
それを参照し、ソースを書き換えてみましたところ、ビルドはできましたが、
実行時に
timer_create関数にてエラー(EINVAL)が発生してしまい動作しませんでした。
ためしに、メーリングリストに掲載されておりましたソースをそのままビルド、実行させても同じ結果でした。

パッチ情報や何か設定方法等についてご存知の方おられましたらご教授いただけないでしょうか。

ファイル ファイルの説明
attachment.c
コメント

shkoga

2014年5月24日 9時15分

サムシングプレシャスの古賀です。

>現在、armadllo-220,230およびarmaggio-9を用いて開発を行っております。
>カーネル:linux-2.6.12.3-a9-18

>を用いて定周期タイマーを生成し、動作させています。
>しかし、システムの時刻がNTPと時刻整合し、大きく変更された際に、
>このタイマーが一定期間停止してしまい、困っております。
>
>過去のメーリングリストを参照させていただきましたところ、CLOCK_MONOTONICを
>用いればシステム時刻に影響されないというものを知りました。
>それを参照し、ソースを書き換えてみましたところ、ビルドはできましたが、
>実行時に
>timer_create関数にてエラー(EINVAL)が発生してしまい動作しませんでした。
>ためしに、メーリングリストに掲載されておりましたソースをそのままビルド、実行させても同じ結果でした。
>
>パッチ情報や何か設定方法等についてご存知の方おられましたらご教授いただけないでしょうか。

これですが、glibc が CLOCK_MONOTONIC に対応していないようです。
Armadillo-9/2x0 用のユーザランド(v20120222)のソースを見たところ、pthreads も LinuxThreads も、CLOCK_REALTIME と CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID にしか対応しておらず、CLOCK_MONOTONIC には対応していません。このため、timer_create() が EINVAL を返すのでしょう。

glibc は対応していませんが、カーネルは対応しているようですので、glibc の timer_create(), timer_settime() を使わず、カーネルを自前でシステムコールすれば、 CLOCK_MONOTONIC を使えるでしょう。Armadillo ではありませんが、以前に同様のことをやったことがあります。
timer_create(), timer_settime() に相当するのは、sys_timer_create(), sys_timer_settime() です。

hiroyuki_miyake

2014年5月26日 20時20分

サムシングプレシャス 古賀さま

ご教授いただいたsyscallを用いた方法で、CLOCK_MONOTONICが正常に動作することが
確認できました。

大変たすかりました。
ありがとうございました。

> サムシングプレシャスの古賀です。
>
>
> >現在、armadllo-220,230およびarmaggio-9を用いて開発を行っております。
> >カーネル:linux-2.6.12.3-a9-18
> …
> >を用いて定周期タイマーを生成し、動作させています。
> >しかし、システムの時刻がNTPと時刻整合し、大きく変更された際に、
> >このタイマーが一定期間停止してしまい、困っております。
> >
> >過去のメーリングリストを参照させていただきましたところ、CLOCK_MONOTONICを
> >用いればシステム時刻に影響されないというものを知りました。
> >それを参照し、ソースを書き換えてみましたところ、ビルドはできましたが、
> >実行時に
> >timer_create関数にてエラー(EINVAL)が発生してしまい動作しませんでした。
> >ためしに、メーリングリストに掲載されておりましたソースをそのままビルド、実行させても同じ結果でした。
> >
> >パッチ情報や何か設定方法等についてご存知の方おられましたらご教授いただけないでしょうか。
>
> これですが、glibc が CLOCK_MONOTONIC に対応していないようです。
> Armadillo-9/2x0 用のユーザランド(v20120222)のソースを見たところ、pthreads も LinuxThreads も、CLOCK_REALTIME と CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID にしか対応しておらず、CLOCK_MONOTONIC には対応していません。このため、timer_create() が EINVAL を返すのでしょう。
>
> glibc は対応していませんが、カーネルは対応しているようですので、glibc の timer_create(), timer_settime() を使わず、カーネルを自前でシステムコールすれば、 CLOCK_MONOTONIC を使えるでしょう。Armadillo ではありませんが、以前に同様のことをやったことがあります。
> timer_create(), timer_settime() に相当するのは、sys_timer_create(), sys_timer_settime() です。

hiroyuki_miyake

2014年5月26日 20時20分

サムシングプレシャス 古賀さま

ご教授いただいたsyscallを用いた方法で、CLOCK_MONOTONICが正常に動作することが
確認できました。

大変たすかりました。
ありがとうございました。

> サムシングプレシャスの古賀です。
>
>
> >現在、armadllo-220,230およびarmaggio-9を用いて開発を行っております。
> >カーネル:linux-2.6.12.3-a9-18
> …
> >を用いて定周期タイマーを生成し、動作させています。
> >しかし、システムの時刻がNTPと時刻整合し、大きく変更された際に、
> >このタイマーが一定期間停止してしまい、困っております。
> >
> >過去のメーリングリストを参照させていただきましたところ、CLOCK_MONOTONICを
> >用いればシステム時刻に影響されないというものを知りました。
> >それを参照し、ソースを書き換えてみましたところ、ビルドはできましたが、
> >実行時に
> >timer_create関数にてエラー(EINVAL)が発生してしまい動作しませんでした。
> >ためしに、メーリングリストに掲載されておりましたソースをそのままビルド、実行させても同じ結果でした。
> >
> >パッチ情報や何か設定方法等についてご存知の方おられましたらご教授いただけないでしょうか。
>
> これですが、glibc が CLOCK_MONOTONIC に対応していないようです。
> Armadillo-9/2x0 用のユーザランド(v20120222)のソースを見たところ、pthreads も LinuxThreads も、CLOCK_REALTIME と CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID にしか対応しておらず、CLOCK_MONOTONIC には対応していません。このため、timer_create() が EINVAL を返すのでしょう。
>
> glibc は対応していませんが、カーネルは対応しているようですので、glibc の timer_create(), timer_settime() を使わず、カーネルを自前でシステムコールすれば、 CLOCK_MONOTONIC を使えるでしょう。Armadillo ではありませんが、以前に同様のことをやったことがあります。
> timer_create(), timer_settime() に相当するのは、sys_timer_create(), sys_timer_settime() です。