[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 メーリングリストの案内