驅動 訊號機制

2021-06-02 02:37:26 字數 2831 閱讀 4765

一、實驗平台:開發板fs2410,採用三星s3c2410的cpu,linux作業系統。

二、實現功能:主程式讓四個led燈形成流水燈,當按下開關k1時,熄滅所有燈,並推出程序。

三、實驗原理:

阻塞和poll機制都是應用程式進行查詢,應用程式是主動的,而裝置時是被動的。訊號機制可以讓裝置主動向應用程式發訊息,如當按鍵按下時,會給應用程式發訊號(本例中位sigio訊號),當應用程式收到裝置發來的訊號後,就可以執行訊號處理函式,完成相應的功能。這樣,應用程式就不必再去查詢裝置了,可以幹自己的事情,當裝置有事件響應時(如按下開關),應用程式再完成相應功能。

四、實驗現象:

應用程式執行後,四個led燈形成流水燈閃爍,一直閃爍,直到開關k1被按下後,led燈才熄滅,並退出應用程式。

五、實驗總結:

訊號由驅動來發出,應用程式來接收。本例中將訊號的發出功能放在中斷處理程式中,當開關k1按下時,進入中斷程式,發出sigio訊號,再通過核心傳送給應用程式。應用程式首先要設定自己為訊號的擁有者,還要設定為非同步通知機制,並註冊訊號處理函式,這樣當核心傳送過來的訊號到來時,就進入訊號處理函式完成相應的功能。

六、示例**:

/*驅動**keys.c*/

#include#include#include#include#include#include#include#include#include#include#include#includechar key_value = 0;

static unsigned int keys_major = 0;

static struct class *keys_class = null;

static wait_queue_head_t key_wait; //定義等待佇列頭

static struct fasync_struct *key_fasync; //定義與非同步通知相關的結構體

int kscan_pin[4] = ;

struct key;

struct key keys_desc[16] = ,

, ,

, , ,

, ,

,, ,

, , ,

, ,

};void wait(unsigned long dly)

static irqreturn_t keys_irq(int irq, void *dev_id)

} /*再將kscan0~3(gpe11,gpg6,gpe13,gpg2)輸出0*/

s3c2410_gpio_cfgpin(kscan_pin[i], s3c2410_gpio_output);

s3c2410_gpio_setpin(kscan_pin[i], 0);

} /*產生中斷的引腳設為中斷功能*/

s3c2410_gpio_cfgpin(key_pin->pin, s3c2410_gpio_irq);

//喚醒

wake_up_interruptible(&key_wait);

return irq_handled;

}static int keys_open(struct inode *inode,struct file *file)

return 0;

}static ssize_t keys_read(struct file *file,char __user *buf,size_t count,loff_t *opps)

//休眠

wait_event_interruptible(key_wait, key_value);

ret = copy_to_user(buf, &key_value, count);

key_value = 0;

return ret;

}static ssize_t keys_write(struct file *file,const char __user *buf,size_t count,loff_t *opps)

static int keys_fasync(int fd, struct file *file, int on)

struct file_operations keys_fops = ;

int __init keys_init(void)

//初始化等待佇列頭

init_waitqueue_head(&key_wait);

return 0;

}void __exit keys_exit(void)

module_init(keys_init);

module_exit(keys_exit);

module_license("gpl");

/*測試**keys_signal_test.c*/

#include#include#include#include#include#include#include#includeint key_fd,led_fd;

void light_off(int sig)

int main(void)

; if((key_fd = open("/dev/keys",o_rdwr)) == -1)

if((led_fd = open("/dev/led",o_rdwr)) == -1)

signal(sigio,light_off);

fcntl(key_fd,f_setown,getpid());

flag = fcntl(key_fd,f_getfl);

flag |= fasync;

fcntl(key_fd,f_setfl,flag);

while(1)

return 0;

}

Linux 信 號 機 制

前面介紹了訊號的基本概念,在這一節中,我們將介紹核心如何實現訊號機制。即核心如何向乙個程序傳送訊號 程序如何接收乙個訊號 程序怎樣控制自己對訊號的反應 核心在什麼時機處理和怎樣處理程序收到的訊號。還要介紹一下setjmp和longjmp在訊號中起到的作用。1 核心對訊號的基本處理方法 核心給乙個程序...

linux 訊號機制

本文旨在弄懂linux中的訊號工作原理 kill l 命令可以檢視linux下所有訊號 2.1 使用者在終端按下某些鍵時,終端驅動程式會傳送訊號給前台程序 例如ctrl c產生sigint訊號,ctrl 產生sigquit訊號,ctrl z產生sigtstp訊號 2.2 硬體異常產生訊號,這些條件由...

LINUX訊號機制

在電腦科學中,訊號是unix 類unix以及其他posix相容的作業系統中程序間通訊的一種有限制的方式。它是一種非同步的通知機制,用來提醒程序乙個事件已經發生。當乙個訊號傳送給乙個程序,作業系統中斷了程序正常的控制流程,此時,任何非原子操作都將被中斷。如果程序定義了訊號的處理函式,那麼它將被執行,否...