一、實驗平台:開發板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相容的作業系統中程序間通訊的一種有限制的方式。它是一種非同步的通知機制,用來提醒程序乙個事件已經發生。當乙個訊號傳送給乙個程序,作業系統中斷了程序正常的控制流程,此時,任何非原子操作都將被中斷。如果程序定義了訊號的處理函式,那麼它將被執行,否...