| 最終更新 2006/08/17 | ||||||||||||||||||||||||||||||
![]() ![]()  | 
    ||||||||||||||||||||||||||||||
| 簡易リアルタイム処理 | ||||||||||||||||||||||||||||||
| 1 簡易とはいいながらカーネルモードになり難しい | ||||||||||||||||||||||||||||||
| リアルタイム関係のプログラムはカーネルモードでプログラムしなければならない。カーネルモードでの使用できる関数には制限があり、Linuxの多くの機能が使用可能ではない。例えばLAN通信でさえ使用することは難しい、多くの場合ユーザモードに回して実行することになる。この場合、ユーザプログラム+ I/Oシステムコール+デバイスドライバとなり、それなりにややこしい。 | ||||||||||||||||||||||||||||||
| 2 カーネルモードとユーザモードをシームレスにつなぐ | ||||||||||||||||||||||||||||||
| せっかくリアルタイムプログラムを導入したのだから、IPC であるitMessageSend/Receive() を用いてカーネルモードとユーザモードを接続する。併せて、デバイスドライバ部が itMessageSend/receive() に吸収され、構造がすっきりする。 | ||||||||||||||||||||||||||||||
| 3 デバッグが容易 | ||||||||||||||||||||||||||||||
| ユーザモードでデバッグできるところは、ユーザモードで開発したほうが、各種ツールが使ええるので楽でである。ユーザモードとカーネルモードをシームレスにつなぐことにより、デバッグ時はユーザモードで開発し、デバッグ終了とともにカーネルモードに移行することができる。ただし、メモリ空間が異なるので、グローバル変数等は注意が必要である。 | ||||||||||||||||||||||||||||||
| 4 構造 | ||||||||||||||||||||||||||||||
| ユーザモードとカーネルモードのプログラムは原則的に同様であるが、プロセス間通信の 
        itMesageReceive/Send 関数を少し工夫する。 ItMessageCreate() 呼び出し時に、ItMesgaeReceive/Send 関数は ioctl() を経由して、カーネルモードの itMessageReceive/Send に接続するモードを追加する。 図示すると下記のようになる。  | 
    ||||||||||||||||||||||||||||||
![]()  | 
    ||||||||||||||||||||||||||||||
| 5 ユーザモードAPI | ||||||||||||||||||||||||||||||
|  ユーザモードでのAPIとしてpthread を用いて
      itThreadCreate 及びitMessageSend/Receive
      をデバイスドライバとしてインプリメントした。 itMessageSend/Receive は2種類あり、一つはカーネルと通信するO_RDONLY/O_WRONLY モードです。他にユーザモードから使用できるMessageSend/Receive(O_RDWR) がある。  | 
    ||||||||||||||||||||||||||||||
| 
       int itThreadCreate (void *entrypoint, void
      *arg, int tid) 
      
 int itMessageCreate (int flags) 
      
 itMessageSend/Receiveは共通。 ユーザモードからitMessageSend/Receiveの例 
       デバイスドライバ内にある messageSend/Receive
      を使えるようにしただけなんですが、ドライバ内とユーザプロセス内で共通になり、ユーザプロセスでデバッグしてから、ドライバへ移行という手が使える。 | 
    ||||||||||||||||||||||||||||||
| 6 感想 | ||||||||||||||||||||||||||||||
|  作り込むと、カーネルモードと通信するユーザタスクは1個で、すべての通信を賄う形になるが、それでもシステム全体はすっきりと論理的に出来上がる。 また、ユーザモードとカーネルモードで同一ソースを#ifdefで使い分けるのであるが、これも予想とおり論理的見通しの良さに貢献している。  | 
    ||||||||||||||||||||||||||||||