[Armadillo:03139] Re: Armadillo-220のインターバルタイマ
Shin-ya Koga
email@hidden
2008年 7月 11日 (金) 23:33:50 JST
サムシングプレシャスの古賀です。
>>インターバル時間を10msecに設定し実行してみたところ、
>>インターバル時間が約3倍になっているようなのです。
>
>10msを指定しても、30msになるってことですよね?
>linuxだとスケジュールされるので他のプロセスが動いている場合や割り込み
>で時間を使われている場合は、保証できません。
>
>プロセスのプライオリティを上げたらどうなります?
2.6.12.3-a9-13 では、include/asm-arm/param.h で
# ifndef HZ
# define HZ 100 /* Internal kernel timer frequency */
# endif
となっていますから、カーネルのタイマー割り込みの間隔、
つまりスケジューラの時間分解能が 10ms なわけですよね。
10ms でユーザプロセスのタイマーを使いたいのであれば、
カーネルのタイマー割り込みの間隔が、それと同じ値の
10ms だと、厳しいんじゃないかなと思います。
>>次に、メーリングリスト(Armadillo:01031)を参照し、
>>
>>include/asm-arm/arch-ep93xx/param.h
>>に
>>#define HZ 1000
>>
>>を追加してみたところ、タイマは10msec周期で動作を
>>するようになりました。ところが、ボードの電源投入
>>起動時に、
>>
>>eth0: Link is down!
>>
>>が表示され、イーサネットが使えない状態になりました。
>
>ごめんなさい。今のところ100HZ以外サポートしていません。
>
>ドライバ内で、HZが100だという前提で書かれている場所があるんだと
>思います。
ですね。linux-2.6.12.3-a9-14/drivers/net/ep93xx_eth.c
を見ると、HZ を参照している箇所が3つあります。どれが
上記の直接の原因になっているかは分かりませんが、要は、
リンク検出時に早過ぎる時間でタイムアウトしちゃってい
るわけですよね。
SHOJI さんが書かれたように、他にも、暗黙裡に HZ の値
が 100 であることを前提にしている部分があると思います
ので、そこを直しても他に不具合が出る可能性はあります
が・・・とりあえず試してみるのであれば、
・drivers/net/ep93xx_eth.c の冒頭部に、
#define HZ_NORMAL 100
というような行を追加する。
・drivers/net/ep93xx_eth.c の HZ の出現を、
HZ_NORMAL で置換する。
という対応を行ってみるのが安直かも知れません。
・・・HZ については、Linux 2.6.13-rc1 の時にデフォルト
値が変更されて問題になったことがあるみたいですね:
http://www.atmarkit.co.jp/flinux/rensai/watch2005/watch08a.html
# 「その手のパラメータに依存しないようにドライバを
# 実装するべし」ということでもあるんでしょうが、
# 動作テストで確認して値を設定するうちに、特定の
# パラメータ値に依存した実装になってしまうというのは、
# ままあることだろうとも思います。
--
古賀信哉 (株)サムシングプレシャス
armadillo メーリングリストの案内