メモ帳
メモ帳
スポンサーサイト
--年--月--日 (--) --:-- | 編集
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
セマフォを使う(その2)
2007年05月18日 (金) 14:29 | 編集
というわけで、その1では概念だけを説明したので
今回はセマフォの関数の覚書。
void sema_init(struct semaphore *sem, int val)
セマフォの初期化を行う。
引数1:セマフォ構造体。セマフォを識別するのに使う。
引数2:セマフォの初期化時点で持つ資源の数。

DECLARE_MUTEX(name)
DECLARE_MUTEX_LOCKED(name)

セマフォの生成、初期化を行うマクロ。
引数は生成するセマフォ構造体名。
ミューテックスとは相互排他(MUTual EXclusion)のことで、排他制御に使える。
要するに、DECLARE_MUTEXは初期資源として1つのセマフォ資源を持つセマフォを初期化する。
DECLARE_MUTEX_LOCKEDは名前のとおり、セマフォ資源を持たない、はじめからロックされた状態の
セマフォを生成、初期化する。

void init_MUTEX(struct semaphore *sem)
void init_MUTEX_LOCKED(struct semaphore *sem)

上記マクロとは生成、初期化を行ったが、こちらは初期化のみを行う。

void down(struct semaphore *sem)
引数1のセマフォ構造体から資源をひとつとる。
資源が0ならば、資源が取得できる(1になって、確保できるまで)待ち続ける。

int down_interruptible(struct semaphore *sem)
上のdownとほぼ同じ。
ちがうのは、待ちに入っている間に割り込みが入ることが出来る。
割り込みが発生すると、0以外の値を返し、待ちから復帰します。

int down_trylock(struct semaphore *sem)
待たないセマフォ。
確保するセマフォ資源がなかった場合は即座に0以外の値を返します。

void up(struct semaphore *sem)
確保しているセマフォ構造体のセマフォ資源を1つ返します。


例)

/* includeは省略 */

#define DRV_VERSION 1.0.0
#define LOCAL_VERSION 0.0.1

//cdevを定義。
struct cdev hoge_cdev;
//セマフォを定義
struct semaphore hoge_sem;

static int hoge_read_proc( char* page, char** start, off_t offset,
                   int count, int* eof, void* data )
{
int len = 0;

    /* セマフォで排他処理開始(セマフォ確保) */
if ( down_interruptible( &hoge_sem ) ) {
printk("down_interruptible error\n" );
return -ERESTARTSYS;
}

len += sprintf(page + len, "hoge Driver Version : %s - %s \n", DRV_VERSION , LOCAL_VERSION);
len += sprintf(page + len, "hoge Driver Compiled : "__DATE__" "__TIME__"\n");

    /* セマフォで排他処理終了(セマフォ解放) */
up( &hoge_sem );
return len;
}
int hoge_open(struct inode *inode, struct file *filp)
{
  //なんかopen処理
}
int hoge_close(struct inode *inode, struct file *filp)
{
  //なんかrelease処理
}
static long tuner_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
  //なんかioctl処理
}

//ファイルオペレーション構造体
//このサンプルドライバを使ってopenとかcloseとかioctlを呼び出すと
//hoge_openやらhoge_closeやらhoge_ioctlが呼び出される。
static struct file_operations fops =
{
  .owner = THIS_MODULE,
  .unlocked_ioctl = hoge_ioctl,
  .open = hoge_open,
  .release = hoge_close,

};

static int __init hoge_init(void)
{

  //適当。
  int hoge_major = 202, hoge_minor = 0;
  dev_t hoge_dev_t;
  struct proc_dir_entry *hoge_entry = 0;

  //セマフォの初期化(ミューテックス)
  init_MUTEX(&hoge_sem);

  /* procファイルのエントリ作成 */
  hoge_entry = create_proc_read_entry("driver/hogeinfo", 0, NULL, hoge_read_proc, NULL);
  if(hoge_entry == NULL) return -1;

#if 1
  /* 自分で指定したメジャー番号を使いたいときはこっち */
  /* MKDEV(メジャー番号, マイナー番号)ってマクロでdev_t生成*/
  hoge_dev_t = MKDEV(hoge_major, hoge_minor)
  register_chrdev_region(hoge_dev_t, 1, "hoge")
#else
  /* 空いているメジャー番号を動的に取得したいときはこっち */
  alloc_chrdev_region(&hoge_dev_t, hoge_minor, 1, "hoge");
#endif
  cdev_init(&hoge_cdev, &hoge_fops);
  hoge_cdev.owner = THIS_MODULE;

  ret = cdev_add(&hoge_cdev, , 1);
  if(ret < 0){
    remove_proc_entry("driver/hogeinfo", NULL);
    return -1;
  }
  return 0;
}

static void __exit hoge_exit(void)
{
  remove_proc_entry("driver/hogeinfo", NULL);
  cdev_del(&hoge_cdev);
  unregister_chrdev_region(hoge_dev_t, 1);
}

module_init(hoge_init);
module_exit(hoge_exit);

/procファイルを使うのコードの使いまわし。
procファイルの出力に排他処理をかけてます。
コメント
この記事へのコメント
コメントを投稿する
URL :
コメント :
パスワード :
秘密 : 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
copyright © 2004 Powered By FC2 allrights reserved. / template: sukechan
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。