パソコンをつくろう!(パソコン自作のすすめ)
組み立てキットを使って自作に挑戦!
[第271回]
●パラレルポート出力プログラム(2)
このところ何回か書いております、Ubuntu11.10用のパラレルポート出力プログラムは、こちら(http://funini.com/kei/io/)のサイトにありましたものをほとんどそのまま拝借して使わせていただきました。
自分で考えたのではなくて人様がお書きになったものをそのまま拝借したりいたしますと、自分では十分理解しないままいただいてしまうことになりがちです。
ことにプログラムを書くときなどは、そういうことにならないよう、納得できるところまでよく考えることが必要だと思います。
そうすることで、借り物ではなくて、自分自身の知識として身につけることができます。
何回も登場しております、これがいわば借り物の、パラレルポート出力プログラムです。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/io.h> #define OUT_PORT 0x378 int main(void){ int i; ioperm(OUT_PORT, 4, 1); for(i = 0; i < 10; i++){ outb(0xff, OUT_PORT); sleep(1); outb(0x00, OUT_PORT); sleep(1); } return 0; } |
/* outtest3.c */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define OUT_PORT 0x378 int main(void){ int i; ioperm(OUT_PORT, 4, 1); for(i = 0; i < 10; i++){ outb(0xff, OUT_PORT); sleep(1); outb(0x00, OUT_PORT); sleep(1); } return 0; } |
”outb”が未定義である、というエラーが出てコンパイルできませんでした。
”ioperm”は通ったようです。
うーん。
iopermと同じように考えて、実はoutbも探ってみたのですけれど。
以下はiopermの書式について参照したLinux Programmer’s Manual(英文サイト)のoutbについてのページ(http://www.kernel.org/doc/man-pages/online/pages/man2/outb.2.html)からの引用です。
NAME
outb, outw, outl, outsb, outsw, outsl, inb, inw, inl, insb, insw, insl,
outb_p, outw_p, outl_p, inb_p, inw_p, inl_p - port I/O
DESCRIPTION
This family of functions is used to do low-level port input and output. The
out* functions do port output, the in* functions do port input; the b-suffix
functions are byte-width and the w-suffix functions word-width; the _p-suffix
functions pause until the I/O completes.
They are primarily designed for internal kernel use, but can be used from user
space.
You compile with -O or -O2 or similar. The functions are defined as inline
macros, and will not be substituted in without optimization enabled, causing
unresolved references at link time.
You use ioperm(2) or alternatively iopl(2) to tell the kernel to allow the
user space application to access the I/O ports in question. Failure to do
this will cause the application to receive a segmentation fault.
(下線は筆者)
残念なことに、ここにはiopermのページにはあった#include文がありません。
ですからどのヘッダーファイルに含まれているのか不明なのです。
しかし#include<sys/io.h>を削除したら、”outb”が未定義である、というエラーが出てしまったことからしますと、outbはsys/io.hで定義されているらしいということが推測されます。
ところで上記マニュアルでは−O または −O2 をつけてコンパイルしないと、unresolved referencesエラーになると書いてあります。
んでも#include<sys/io.h>を削除する前は−Oオプションをつけなくてもエラーにはならなかったわけですから、それはちょっと違うのではないかと。
でもまあ、ついでですから−O、−O2オプションをつけてやってみましたが。
結果は変わりませんでした。
ところで(このように「ところで」で話をつないでいくのは最もへたくそな書き方だということになっているのだそうでありますが)。
ここで出てきましたgccのオプション−O、−O2を、私は−0、−02だと思ってしまいました(このように書きましても、同じじゃないの?と思ってしまいますでしょう)。
おかしい、変だ、オプションを認識してくれない。
とそこでしばし悩んでおりました。
こんな具合です。
−Oは−0(数字のゼロ)ではなくてアルファベットOの大文字だったのですよね。
上でお見せしましたように、マニュアルページからコピーして貼り付けてみてはじめて0(ゼロ)ではなくてO(オー)らしいことがわかりました。
You compile with -O or -O2 or similar.
でももとのページをそのまま見ましたら、どう見たってゼロでありましょう?
せめてプログラムに関わる表記は一見してそれとわかる書体にしていただきたいものであります。
●ゼロとオーの区別
その昔、プログラムのコーディングが手書きでありましたころは、0(ゼロ)とO(オー)、あるいは2とZ(ゼット)などの区別を明瞭に書き分けることはプログラマのイロハでありました。
あー。
どんどん本題から離れていってしまうのでありますが。
ゼロとオーの区別ができる書体につきましてネットを検索いたしましたら、ここ(http://wiki.fdiary.net/font/?unixuser200403-1)に行きつきました。
そこで紹介されておりました「アニト等幅フォント」は、その両者の区別がつくフォントとのことでありました。
そのページにありましたアニト等幅フォントへのリンクは切れておりましたので、「アニト等幅フォント」でgoogle検索をいたしました。
こちら(http://www.type-labo.jp/Hanpuanito.html)のサイトです。
おお。
ゼロに斜線がついております。
(http://www.type-labo.jp/GIF.IMAGE/Anitomono.gif)より一部分をコピーいたしました。
そういえばUbuntu11.10の「端末」ではちゃんと0(ゼロ)は区別がついておりました。
私はもっぱら斜線をつけておりましたが、真中に点をつけてゼロを表記するというルールもあったように記憶しております。
一方こちらはWindowsのMSDOSプロンプトです。
よく見れば幅の違いによって区別はつきますけれど、うっかりすると間違ってしまいそうです。
あっ。
そういえば…。
今、気がついたのですけれど。
これはUbuntu11.10のテキストエディタ(gedit)です。
なんと。
ちゃんとゼロは区別がつくようになっておりました。
さすが!
リナックスです。
余計なことばかりを書いておりますうちに、時間がなくなってしまいました。
今回は完全に脱線してしまいましたので、そもそもの本題につきましては次回にあらためて書くことにいたします。
パソコンをつくろう![第271回]
2011.12.16upload
前へ
次へ
目次へ戻る
ホームページトップへ戻る