討論區: 幫助論壇 (Thread #2970)

比較的低水準なI/O (2003-07-16 23:21 by j_akita #5299)

秋田と申します。

uClinux/H8でいろいろプログラムを書いているのですが、主に比較的低水準なI/Oに関して5点ほどわからない点がありまして、こちらで質問させてください。
(uClinux的には的外れなことを書いているかもしれませんが、ご指摘いただければ幸いです)

1) I/Oポートを直接いじるとき、以前佐藤さんのHPから関連情報(たしかWiKi上)にリンクがあり、そちらで公開されていたものがあったと覚えているのですが、こちらは現在は公開されていませんでしょうか?(たしかioperm()だったような・・・)

2) uClinux/H8でH8のタイマで割り込みをかけてISRを呼び出す、ということは、やっぱり無理でしょうか?(たしかにOSなら無理そうなんですけど)

3) UDPの受信をタイムアウト付きで行いたいのですが、select()関数は実装されているのでしょうか・・・?
select()関数を使ったプログラムをいくつか書いてためしてみたのですが、データを受信していても常にタイムアウトで返ってくるような動作をしているように見えます。

4) 佐藤さんがサンプルとして公開されているユーザランド内のinitは、いわゆるふつうのinitだと思うのですが、/etc/init.d/* のような、起動スクリプトは記述することができるのでしょうか?

5) このinitで起動されるshでは、「&」でバックグラウンドでプログラムを実行することが可能なように見えるのですが、これはどのように実装されているのでしょうか?(fork()は実装されていない(実装できない)んですよね)

回覆 #5299×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 比較的低水準なI/O (2003-07-19 02:04 by ysato #5326)

>1) I/Oポートを直接いじるとき、以前佐藤さんのHPから関連情報(たしかWiKi上)にリンク
>があり、そちらで公開されていたものがあったと覚えているのですが、こちらは現在は公
>開されていませんでしょうか?(たしかioperm()だったような・・・)

消した記憶はないので、どこかに残っているはずです。
ただ、あそこに書いてあるものは、デバイスドライバ用のインタフェースなので、
アプリケーションから呼び出すことはできません。
/proc/gpioで現在の状況を取得できるので、それをうまく使えばなんとかなると思いますが…

一つのポートを完全に占有できるのであれば、細かいことは気にしないで叩くのが一番簡単です。
MMUがないから出来る大技ですが。

>2) uClinux/H8でH8のタイマで割り込みをかけてISRを呼び出す、ということは、やっぱり
>無理でしょうか?(たしかにOSなら無理そうなんですけど)

割り込みをフックするために使っているテーブルを書き換えれば出来てしまいます。
普通にrequest_irqした場合は呼ばれるまで結構時間がかかるので、応答速度が問題になる場合は
有効な手法かもしれません。

>3) UDPの受信をタイムアウト付きで行いたいのですが、select()関数は実装されているの
>でしょうか・・・?
>select()関数を使ったプログラムをいくつか書いてためしてみたのですが、データを受信
>していても常にタイムアウトで返ってくるような動作をしているように見えます。

システムコールはあります。なんとなく時間管理が怪しそうですね、調べてみます。

>4) 佐藤さんがサンプルとして公開されているユーザランド内のinitは、いわゆるふつうの
>initだと思うのですが、/etc/init.d/*
>のような、起動スクリプトは記述することができるのでしょうか?

起動スクリプトは書けますが、いわゆるSysV initではないので/etc/rcを起動するだけです。
他のものを使ったほうがいいと思います。

>5) このinitで起動されるshでは、「&」でバックグラウンドでプログラムを実行すること
>が可能なように見えるのですが、これはどのように実装されているのでしょうか?(fork()
>は実装されていない(実装できない)んですよね)

vforkしてexecしているだけです。execすれば親も動けるようになるので。
forkはENOSYSになります。
回覆: #5299

回覆 #5326×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 比較的低水準なI/O (2003-07-23 14:18 by j_akita #5364)

佐藤様、早速のコメントありがとうございました。

実はいままでkernel-2.0をいじっていたので、
selectまわりの話などは、kernel-2.4で解決できるような気もしてきました。

・I/Oレジスタの件
A/Dコンバータをいじってみたのですが、A/D変換後に読み出す値がどうもヘンで、質問してみました。
もしかしたらunsigned short型の読み出しかもしれないので、基本的に他で使われていない?I/Oポートは直接いじってOK、とのことですので、それでやってみます。

・割り込みの件
request_irqを使うんだったのですね。
今回はそれほどタイミングがシビアでもないので、これを試してみたいと思います。

・execの件
勉強不足で恐縮なのですが、exec()って、親を止めて子に移す、という関数なんだと思っていました。
http://www.paw.hi-ho.ne.jp/takadayouhei/technic/5.html
↑このあたりを読んでそう思っていました
これもちょっと試してみます。
回覆: #5326

回覆 #5364×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 比較的低水準なI/O (2003-07-25 17:16 by ysato #5397)

>・I/Oレジスタの件
>A/Dコンバータをいじってみたのですが、A/D変換後に読み出す値がどうもヘンで、質問し
>てみました。
>もしかしたらunsigned
>short型の読み出しかもしれないので、基本的に他で使われていない?I/Oポートは直接い
>じってOK、とのことですので、それでやってみます。

A/Dは今の所誰も使っていないので、何をやっても大丈夫です。
今使っているのはSCI・タイマ・一部ポートだけなので、他は自由にさわれます。

>・execの件
>勉強不足で恐縮なのですが、exec()って、親を止めて子に移す、という関数なんだと思っ
>ていました。
>http://www.paw.hi-ho.ne.jp/takadayouhei/technic/5.html
>↑このあたりを読んでそう思っていました
>これもちょっと試してみます。

vforkがそれですね。
execは現在のプロセスで新しいプログラムを起動するものです。
vforkで作られたプロセスの場合は、副作用で寝ていた親が起きます。
回覆: #5364

回覆 #5397×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 比較的低水準なI/O (2003-08-09 15:38 by j_akita #5531)

佐藤さま、ご回答ありがとうございました。

いろいろと試行錯誤してみます。(追ってご報告します)

ところで先に出てきた request_irq() なのですが、
これはuClinux/H8でもふつうのLinuxのように使える、と理解していいでしょうか?

デバイスドライバを書いたことがないのでこの関数を使うのがはじめてで、的外れな質問かもしれませんが、
request_irq(H8でのIRQ番号, ISR関数名, SA_INTERRUPT, デバイス名(/IRQ0割り込みなら"IRQ0"とかなるんでしょうか?));
で割り込みハンドラを登録できる、ということなのでしょうか。
(上記の中のデバイス名のところが少し怪しい。あと、もう1つ引数が必要?)

ご情報いただければ幸いです。
回覆: #5397

回覆 #5531×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 比較的低水準なI/O (2003-08-09 22:52 by ysato #5532)

同じ使いかたです。
細かいところまで把握できていませんが、デバイスドライバから呼ぶ必要のある関数は、
普通のlinuxと同じ仕様になっているはずです。

IRQの指定はその通りです。

デバイス名の用途は/proc/interruptに出るくらいなので、適当に付けてください。
カーネルの中では特に見ていません。

デバイス名の後ろにもう一個ありますが、特に用がなければNULLでいいです。
回覆: #5531

回覆 #5532×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 比較的低水準なI/O (2003-08-11 16:46 by j_akita #5550)

irq_request()の件、ありがとうございました。
それを試す前に、kernel2.4でI/Oポートをいじろうとして、
使っていないだろうとふんだPBあたりの下のほう(PB-0, PB-1)あたりを使おうと思って直接レジスタをいじったら
次のようにでました。
これは、例えばPBの他のビットがCSなどで使われているので、
PB自体へのアクセスができない、という理解でよろしいでしょうか?
------------
BINFMT_FLAT: reloc outside program 0xfee008 (0 - 0xb594/0x9a00), killing eplanpm
!
BINFMT_FLAT: reloc outside program 0xfee008 (0 - 0xb594/0x9a00), killing eplanpm
!
SIGSEGV
#
------------
回覆: #5532

回覆 #5550×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 比較的低水準なI/O (2003-08-11 23:08 by ysato #5554)

なんでそのエラーが…と思ったら、elf2fltで作ったバイナリが引っかかるんですね。
他が使っているからではなくて、いろいろな部分の仕様でそうなっています。

不便なのでelf2fltを直しました。新しいパッチを当ててください。
それでロードできるはずですが、それでもエラーになる様だったら、
ソースとgcc/asのバージョンを教えてください。
回覆: #5550

回覆 #5554×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 比較的低水準なI/O (2003-08-12 09:56 by j_akita #5563)

早速のご回答、ありがとうございます
いまリリースファイルを見に行ったら
elf2flt.patch でファイルが見つかりません、でした。
お手数をおかけします、ご確認いただけませんでしょうか。

ちなみにh8300-elf-gccは3.2.1(パッチあて)、
h8300-elf-asは2.12.1です
回覆: #5554

回覆 #5563×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 比較的低水準なI/O (2003-08-12 21:46 by j_akita #5572)

たびたびすいません。

先のrequest_irq()の件なのですが、
カーネルのソース(ints.cなど)を読んでいるうちに、
直接ベクタを書き換えたほうが楽な気がしてきました。

RedBootのROMの割り込みベクタを見ると、
0xffbf50などの内蔵RAM内のアドレスが書いてありますが、
RedBootでこのアドレスをダンプすると
たとえば JSR @0x200 のように書いてありますが、
ここを書き換えてあげればOK、ということですよね。
(もちろん割り込みは別途許可した上で)
#結局先にパッチをあげていただいた、
 elf2fltの修正で解決できる、ということですよね

回覆: #5563

回覆 #5572×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 比較的低水準なI/O (2003-08-12 23:51 by j_akita #5574)

たびたびたびすいません、
ついでに質問させてください。
こちらで公開されているユーザランドやカーネルのコンパイル方法はh8300-hitachi-hms-*を使う方法ですが、
elf2fltは、どこのものからのpatchを公開していただいているのでしょうか?
CVSの中にはないようですが、uclinux.orgにあるもとのelf2fltからの差分、ということでしょうか?
回覆: #5572

回覆 #5574×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 比較的低水準なI/O (2003-08-13 01:50 by ysato #5575)

全部まとめて…

elf2fltのパッチはuclinux.orgのCVSで配布されているものに対応しています。
HTTP DownloadにあるものはH8/300に対応していません。

最新はこれです。
http://prdownloads.sourceforge.jp/uclinux-h8/5236/elf2flt.patch

割り込みのほうはそれで合ってます。
jmp @fooという形に書き換えてください。

#理想的には、元の割り込み処理を呼ぶべきですが…
#そうするとかえって手間が増えますね。
回覆: #5574

回覆 #5575×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 比較的低水準なI/O (2003-08-13 08:03 by j_akita #5576)

早速のご回答、ありがとうとざいます。

あれ、まだelf2flt.patchが見つかりません、でした。
たびたびお手数をおかけします、ご確認いただけませんでしょうか。

#おかげさまで、いま仕事(研究)で作っているものがもう一息で完成しそうです。完成しましたらこちらにご報告もします。
回覆: #5575

回覆 #5576×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 比較的低水準なI/O (2003-08-13 08:32 by ysato #5577)

あれ、見えてるのに落とせませんね。
再登録しました。
http://prdownloads.sourceforge.jp/uclinux-h8/5236/elf2flt.patch
です。
回覆: #5576

回覆 #5577×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 比較的低水準なI/O (2003-08-13 19:34 by j_akita #5583)

あげていただいたelf2fltを使って(ちょっと細工はいりましたが)無事I/Oレジスタ等にアクセスできました。ありがとうございました。

割り込み(/IRQ0)を、こんな感じでかけてみました。
------
#pragma interrupt
void hoge()
{
...
(clear InterruptFlag)
}

main()
{
(write 'jmp @(&hoge)' at address branched from /IRQ0 interrupt vector)
IER |= 0x01 // enable /IRQ0 interrupt
while(1);
}
------
おおむね良好なのですが、「ときどき」(というのが困りもの)こんなメッセージととともにカーネルが止まってしまいます。(No interrupt...のところの数字は違う値のこともある)
------
Kernel panic: No interrupt handler for 7

In interrupt handler - not syncing
Scheduling in interrupt
Kernel panic: BUG!
In interrupt handler - not syncing
Scheduling in interrupt
Kernel panic: BUG!
...
------
カーネルでタイムスロットを切っているタイマ割り込みと、/IRQ0が重なったときのような気がするのですが、これはしょうがないものなのでしょうか?
回覆: #5577

回覆 #5583×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 比較的低水準なI/O (2003-08-14 00:13 by ysato #5584)

ISRの処理がどうなっているのかわからないので、推測になりますが…

割り込み処理をステータスクリアだけにしても問題がおきますか?

カーネルが関知していない割り込みなので、長時間割り込み禁止にしたり、
中でカーネルの内部を呼び出すと。おそらくそういう症状が発生するはずです。

#すみません、そのへんの説明をすっかり忘れていました。
回覆: #5583

回覆 #5584×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 比較的低水準なI/O (2003-08-14 09:37 by j_akita #5586)

さっそくのご回答、ありがとうございます
たしかにISR内でちょっと時間のかかる処理をしているのと、
printf()などを使っていました。

ISR内でflagをたてて、main()内のwhile(1)ループ内で
そのフラグをみて処理をする、というように書き換えてみたいと思います。

#request_irqを使うと、「カーネルが感知している」割り込みになってこういう問題は起こらなくなるものなのでしょうか?
回覆: #5584

回覆 #5586×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 比較的低水準なI/O (2003-08-14 12:10 by ysato #5587)

そういうことです。
ただし、なんでもありではなく、それなりに考慮しないといけない事も有ります。
そのあたりは、デバイスドライバ関連の資料に書いてあると思うので、興味があったら読んで見てください。
回覆: #5584

回覆 #5587×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: 比較的低水準なI/O (2003-08-14 12:19 by j_akita #5588)

早速のご回答、ありがとうございます。
今回はちょっと急ぎの仕事で切羽詰っているので、
ISRでフラグを立てることで乗り切ってみます。
回覆: #5587

回覆 #5588×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入