日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

异步通知实验(信号)

發(fā)布時(shí)間:2023/12/10 编程问答 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 异步通知实验(信号) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 異步通知
    • 異步通知簡(jiǎn)介
    • 驅(qū)動(dòng)中的信號(hào)處理
    • 應(yīng)用程序?qū)Ξ惒酵ㄖ奶幚?/li>
  • 硬件原理圖分析
  • 實(shí)驗(yàn)程序編寫
    • 修改設(shè)備樹文件
    • 程序編寫
    • 編寫測(cè)試APP
  • 運(yùn)行測(cè)試
    • 編譯驅(qū)動(dòng)程序和測(cè)試APP
    • 運(yùn)行測(cè)試

在前面使用阻塞或者非阻塞的方式來讀取驅(qū)動(dòng)中按鍵值都是應(yīng)用程序主動(dòng)讀取的,對(duì)于非阻塞方式來說還需要應(yīng)用程序通過poll 函數(shù)不斷的輪詢。最好的方式就是驅(qū)動(dòng)程序能主動(dòng)向應(yīng)用程序發(fā)出通知,報(bào)告自己可以訪問,然后應(yīng)用程序在從驅(qū)動(dòng)程序中讀取或?qū)懭霐?shù)據(jù),類似于我們?cè)诼銠C(jī)例程中講解的中斷。Linux 提供了異步通知這個(gè)機(jī)制來完成此功能,本章我們就來學(xué)習(xí)一下異步通知以及如何在驅(qū)動(dòng)中添加異步通知相關(guān)處理代碼。

異步通知

異步通知簡(jiǎn)介

我們首先來回顧一下“中斷”,中斷是處理器提供的一種異步機(jī)制,我們配置好中斷以后就可以讓處理器去處理其他的事情了,當(dāng)中斷發(fā)生以后會(huì)觸發(fā)我們事先設(shè)置好的中斷服務(wù)函數(shù),在中斷服務(wù)函數(shù)中做具體的處理。比如我們?cè)诼銠C(jī)篇里面編寫的GPIO 按鍵中斷實(shí)驗(yàn),我們通過按鍵去開關(guān)蜂鳴器,采用中斷以后處理器就不需要時(shí)刻的去查看按鍵有沒有被按下,因?yàn)榘存I按下以后會(huì)自動(dòng)觸發(fā)中斷。

Linux 應(yīng)用程序可以通過阻塞或者非阻塞這兩種方式來訪問驅(qū)動(dòng)設(shè)備;

  • 通過阻塞方式訪問的話應(yīng)用程序會(huì)處于休眠態(tài)(掛起),等待驅(qū)動(dòng)設(shè)備可以使用
  • 非阻塞方式的話會(huì)通過poll 函數(shù)來不斷的輪詢,查看驅(qū)動(dòng)設(shè)備文件是否可以使用。

這兩種方式都需要應(yīng)用程序主動(dòng)的去查詢?cè)O(shè)備的使用情況,如果能提供一種類似中斷的機(jī)制,當(dāng)驅(qū)動(dòng)程序可以訪問的時(shí)候主動(dòng)告訴應(yīng)用程序那就最好了,“信號(hào)”為此應(yīng)運(yùn)而生。

信號(hào)(異步通知):類似于我們硬件上使用的“中斷”,只不過信號(hào)是軟件層次上的。算是在軟件層次上對(duì)中斷的一種模擬,驅(qū)動(dòng)可以通過主動(dòng)向應(yīng)用程序發(fā)送信號(hào)的方式來報(bào)告自己可以訪問了,應(yīng)用程序獲取到信號(hào)以后就可以從驅(qū)動(dòng)設(shè)備中讀取或者寫入數(shù)據(jù)了。整個(gè)過程就相當(dāng)于應(yīng)用程序收到了驅(qū)動(dòng)發(fā)送過來了的一個(gè)中斷,然后應(yīng)用程序去響應(yīng)這個(gè)中斷,在整個(gè)處理過程中應(yīng)用程序并沒有去查詢驅(qū)動(dòng)設(shè)備是否可以訪問,一切都是由驅(qū)動(dòng)設(shè)備自己告訴給應(yīng)用程序的。

阻塞、非阻塞、異步通知,這三種是針對(duì)不同的場(chǎng)合提出來的不同的解決方法,沒有優(yōu)劣之分,在實(shí)際的工作和學(xué)習(xí)中,根據(jù)自己的實(shí)際需求選擇合適的處理方法即可。

異步通知的核心就是信號(hào),在arch/xtensa/include/uapi/asm/signal.h 文件中定義了Linux 所支持的所有信號(hào),這些信號(hào)如下所示:

34 #define SIGHUP 1 /* 終端掛起或控制進(jìn)程終止*/ 35 #define SIGINT 2 /* 終端中斷(Ctrl+C組合鍵) */ 36 #define SIGQUIT 3 /* 終端退出(Ctrl+\組合鍵) */ 37 #define SIGILL 4 /* 非法指令*/ 38 #define SIGTRAP 5 /* debug使用,有斷點(diǎn)指令產(chǎn)生*/ 39 #define SIGABRT 6 /* 由abort(3)發(fā)出的退出指令*/ 40 #define SIGIOT 6 /* IOT指令*/ 41 #define SIGBUS 7 /* 總線錯(cuò)誤*/ 42 #define SIGFPE 8 /* 浮點(diǎn)運(yùn)算錯(cuò)誤*/ 43 #define SIGKILL 9 /* 殺死、終止進(jìn)程*/ 44 #define SIGUSR1 10 /* 用戶自定義信號(hào)1 */ 45 #define SIGSEGV 11 /* 段違例(無效的內(nèi)存段) */ 46 #define SIGUSR2 12 /* 用戶自定義信號(hào)2 */ 47 #define SIGPIPE 13 /* 向非讀管道寫入數(shù)據(jù)*/ 48 #define SIGALRM 14 /* 鬧鐘*/ 49 #define SIGTERM 15 /* 軟件終止*/ 50 #define SIGSTKFLT 16 /* 棧異常*/ 51 #define SIGCHLD 17 /* 子進(jìn)程結(jié)束*/ 52 #define SIGCONT 18 /* 進(jìn)程繼續(xù)*/ 53 #define SIGSTOP 19 /* 停止進(jìn)程的執(zhí)行,只是暫停*/

在示例代碼53.1.1.1 中的這些信號(hào)中,除了SIGKILL(9)和SIGSTOP(19)這兩個(gè)信號(hào)不能被忽略外,其他的信號(hào)都可以忽略。這些信號(hào)就相當(dāng)于中斷號(hào),不同的中斷號(hào)代表了不同的中斷,不同的中斷所做的處理不同,因此,驅(qū)動(dòng)程序可以通過向應(yīng)用程序發(fā)送不同的信號(hào)來實(shí)現(xiàn)不同的功能。

我們使用中斷的時(shí)候需要設(shè)置中斷處理函數(shù),同樣的,如果要在應(yīng)用程序中使用信號(hào),那么就必須設(shè)置信號(hào)所使用的信號(hào)處理函數(shù),在應(yīng)用程序中使用signal 函數(shù)來設(shè)置指定信號(hào)的處理函數(shù),signal 函數(shù)原型如下所示:

sighandler_t signal(int signum, sighandler_t handler)

函數(shù)參數(shù)和返回值含義如下:
signum:要設(shè)置處理函數(shù)的信號(hào)。
handler:信號(hào)的處理函數(shù)。
返回值:設(shè)置成功的話返回信號(hào)的前一個(gè)處理函數(shù),設(shè)置失敗的話返回SIG_ERR。
信號(hào)處理函數(shù)原型如下所示:

typedef void (*sighandler_t)(int)

我們前面講解的使用“kill -9 PID”殺死指定進(jìn)程的方法就是向指定的進(jìn)程(PID)發(fā)送SIGKILL 這個(gè)信號(hào)。當(dāng)按下鍵盤上的CTRL+C 組合鍵以后會(huì)向當(dāng)前正在占用終端的應(yīng)用程序發(fā)出SIGINT 信號(hào),SIGINT 信號(hào)默認(rèn)的動(dòng)作是關(guān)閉當(dāng)前應(yīng)用程序。這里我們修改一下SIGINT 信號(hào)的默認(rèn)處理函數(shù),當(dāng)按下CTRL+C 組合鍵以后先在終端上打印出“SIGINT signal!”這行字符串,然后再關(guān)閉當(dāng)前應(yīng)用程序。新建signaltest.c 文件,然后輸入如下所示內(nèi)容:

1 #include "stdlib.h" 2 #include "stdio.h" 3 #include "signal.h" 4 5 void sigint_handler(int num) 6 { 7 printf("\r\nSIGINT signal!\r\n"); 8 exit(0);

在示例代碼53.1.1.2 中我們?cè)O(shè)置SIGINT 信號(hào)的處理函數(shù)為sigint_handler,當(dāng)按下CTRL+C向signaltest 發(fā)送SIGINT 信號(hào)以后sigint_handler 函數(shù)就會(huì)執(zhí)行,此函數(shù)先輸出一行“SIGINT signal!”字符串,然后調(diào)用exit 函數(shù)關(guān)閉signaltest 應(yīng)用程序。
使用如下命令編譯signaltest.c:

gcc signaltest.c -o signaltest

然后輸入“./signaltest”命令打開signaltest 這個(gè)應(yīng)用程序,然后按下鍵盤上的CTRL+C 組合鍵,結(jié)果如圖53.1.1.1 所示:

從圖53.1.1.1 可以看出,當(dāng)按下CTRL+C 組合鍵以后sigint_handler 這個(gè)SIGINT 信號(hào)處理函數(shù)執(zhí)行了,并且輸出了“SIGINT signal!”這行字符串。

驅(qū)動(dòng)中的信號(hào)處理

1、fasync_struct 結(jié)構(gòu)體

首先我們需要在驅(qū)動(dòng)程序中定義一個(gè)fasync_struct 結(jié)構(gòu)體指針變量,fasync_struct 結(jié)構(gòu)體內(nèi)容如下:

struct fasync_struct { spinlock_t fa_lock; int magic; int fa_fd; struct fasync_struct *fa_next; struct file *fa_file; struct rcu_head fa_rcu; };

一般將fasync_struct 結(jié)構(gòu)體指針變量定義到設(shè)備結(jié)構(gòu)體中,比如在上一章節(jié)的imx6uirq_dev結(jié)構(gòu)體中添加一個(gè)fasync_struct 結(jié)構(gòu)體指針變量,結(jié)果如下所示:

1 struct imx6uirq_dev { 2 struct device *dev; 3 struct class *cls; 4 struct cdev cdev; ...... 14 struct fasync_struct *async_queue; /* 異步相關(guān)結(jié)構(gòu)體*/ 15 };

第14 行就是在imx6uirq_dev 中添加了一個(gè)fasync_struct 結(jié)構(gòu)體指針變量。

2、fasync 函數(shù)
如果要使用異步通知,需要在設(shè)備驅(qū)動(dòng)中實(shí)現(xiàn)file_operations 操作集中的fasync 函數(shù),此函數(shù)格式如下所示:

int (*fasync) (int fd, struct file *filp, int on)

fasync 函數(shù)里面一般通過調(diào)用fasync_helper 函數(shù)來初始化前面定義的fasync_struct 結(jié)構(gòu)體指針,fasync_helper 函數(shù)原型如下:

int fasync_helper(int fd, struct file * filp, int on, struct fasync_struct **fapp)

fasync_helper 函數(shù)的前三個(gè)參數(shù)就是fasync 函數(shù)的那三個(gè)參數(shù),第四個(gè)參數(shù)就是要初始化的fasync_struct 結(jié)構(gòu)體指針變量。當(dāng)應(yīng)用程序通過“fcntl(fd, F_SETFL, flags | FASYNC)”改變fasync 標(biāo)記的時(shí)候,驅(qū)動(dòng)程序file_operations 操作集中的fasync 函數(shù)就會(huì)執(zhí)行。

驅(qū)動(dòng)程序中的fasync 函數(shù)參考示例如下:

1 struct xxx_dev { 2 ...... 3 struct fasync_struct *async_queue; /* 異步相關(guān)結(jié)構(gòu)體*/ 4 }; 5 6 static int xxx_fasync(int fd, struct file *filp, int on) 7 { 8 struct xxx_dev *dev = (xxx_dev)filp->private_data; 9 10 if (fasync_helper(fd, filp, on, &dev->async_queue) < 0) 11 return -EIO; 12 return 0; 13 } 14 15 static struct file_operations xxx_ops = { 16 ...... 17 .fasync = xxx_fasync, 18 ...... 19 };

在關(guān)閉驅(qū)動(dòng)文件的時(shí)候需要在file_operations 操作集中的release 函數(shù)中釋放fasync_struct,fasync_struct 的釋放函數(shù)同樣為fasync_helper,release 函數(shù)參數(shù)參考實(shí)例如下:

1 static int xxx_release(struct inode *inode, struct file *filp) 2 { 3 return xxx_fasync(-1, filp, 0); /* 刪除異步通知*/ 4 } 5 6 static struct file_operations xxx_ops = { 7 ...... 8 .release = xxx_release, 9 };

第3 行通過調(diào)用示例代碼53.1.2.3 中的xxx_fasync 函數(shù)來完成fasync_struct 的釋放工作,但是,其最終還是通過fasync_helper 函數(shù)完成釋放工作。

1、kill_fasync 函數(shù)
當(dāng)設(shè)備可以訪問的時(shí)候,驅(qū)動(dòng)程序需要向應(yīng)用程序發(fā)出信號(hào),相當(dāng)于產(chǎn)生“中斷”。kill_fasync函數(shù)負(fù)責(zé)發(fā)送指定的信號(hào),kill_fasync 函數(shù)原型如下所示:

void kill_fasync(struct fasync_struct **fp, int sig, int band)

函數(shù)參數(shù)和返回值含義如下:
fp:要操作的fasync_struct。
sig:要發(fā)送的信號(hào)。
band:可讀時(shí)設(shè)置為POLL_IN,可寫時(shí)設(shè)置為POLL_OUT。
返回值:無。

應(yīng)用程序?qū)Ξ惒酵ㄖ奶幚?/h2>

應(yīng)用程序?qū)Ξ惒酵ㄖ奶幚戆ㄒ韵氯?#xff1a;
1、注冊(cè)信號(hào)處理函數(shù)
應(yīng)用程序根據(jù)驅(qū)動(dòng)程序所使用的信號(hào)來設(shè)置信號(hào)的處理函數(shù),應(yīng)用程序使用signal 函數(shù)來設(shè)置信號(hào)的處理函數(shù)。前面已經(jīng)詳細(xì)的講過了,這里就不細(xì)講了。
2、將本應(yīng)用程序的進(jìn)程號(hào)告訴給內(nèi)核
使用fcntl(fd, F_SETOWN, getpid())將本應(yīng)用程序的進(jìn)程號(hào)告訴給內(nèi)核。
3、開啟異步通知
使用如下兩行程序開啟異步通知:

flags = fcntl(fd, F_GETFL); /* 獲取當(dāng)前的進(jìn)程狀態(tài)*/ fcntl(fd, F_SETFL, flags | FASYNC); /* 開啟當(dāng)前進(jìn)程異步通知功能*/

重點(diǎn)就是通過fcntl 函數(shù)設(shè)置進(jìn)程狀態(tài)為FASYNC,經(jīng)過這一步,驅(qū)動(dòng)程序中的fasync 函數(shù)就會(huì)執(zhí)行。

硬件原理圖分析

本章實(shí)驗(yàn)硬件原理圖參考15.2 小節(jié)即可。

實(shí)驗(yàn)程序編寫

本實(shí)驗(yàn)對(duì)應(yīng)的例程路徑為:開發(fā)板光盤-> 2、Linux 驅(qū)動(dòng)例程-> 16_asyncnoti。
本章實(shí)驗(yàn)我們?cè)谏弦徽聦?shí)驗(yàn)“15_noblockio”的基礎(chǔ)上完成,在其中加入異步通知相關(guān)內(nèi)容即可,當(dāng)按鍵按下以后驅(qū)動(dòng)程序向應(yīng)用程序發(fā)送SIGIO 信號(hào),應(yīng)用程序獲取到SIGIO 信號(hào)以后讀取并且打印出按鍵值。

修改設(shè)備樹文件

因?yàn)槭窃趯?shí)驗(yàn)“15_noblockio”的基礎(chǔ)上完成的,因此不需要修改設(shè)備樹。

程序編寫

新建名為“16_asyncnoti”的文件夾,然后在16_asyncnoti 文件夾里面創(chuàng)建vscode 工程,工作區(qū)命名為“asyncnoti”。將“15_noblockio”實(shí)驗(yàn)中的noblockio.c 復(fù)制到16_asyncnoti 文件夾中,并重命名為asyncnoti.c。接下來我們就修改asyncnoti.c 這個(gè)文件,在其中添加異步通知關(guān)的代碼,完成以后的asyncnoti.c 內(nèi)容如下所示(因?yàn)槭窃谏弦徽聦?shí)驗(yàn)的noblockio.c 文件的基礎(chǔ)
上修改的,因?yàn)榱藴p少篇幅,下面的代碼有省略):

#include <linux/types.h> #include <linux/kernel.h> #include <linux/delay.h> #include <linux/ide.h> #include <linux/init.h> #include <linux/module.h> #include <linux/errno.h> #include <linux/gpio.h> #include <linux/cdev.h> #include <linux/device.h> #include <linux/of.h> #include <linux/of_address.h> #include <linux/of_gpio.h> #include <linux/semaphore.h> #include <linux/timer.h> #include <linux/of_irq.h> #include <linux/irq.h> #include <linux/fcntl.h> #include <linux/wait.h> #include <linux/poll.h> #include <asm/mach/map.h> #include <asm/uaccess.h> #include <asm/io.h> /*************************************************************** Copyright ? ALIENTEK Co., Ltd. 1998-2029. All rights reserved. 文件名 : asyncnoti.c 作者 : 左忠凱 版本 : V1.0 描述 : 非阻塞IO訪問 其他 : 無 論壇 : www.openedv.com 日志 : 初版V1.0 2019/8/13 左忠凱創(chuàng)建 ***************************************************************/ #define IMX6UIRQ_CNT 1 /* 設(shè)備號(hào)個(gè)數(shù) */ #define IMX6UIRQ_NAME "asyncnoti" /* 名字 */ #define KEY0VALUE 0X01 /* KEY0按鍵值 */ #define INVAKEY 0XFF /* 無效的按鍵值 */ #define KEY_NUM 1 /* 按鍵數(shù)量 *//* 中斷IO描述結(jié)構(gòu)體 */ struct irq_keydesc {int gpio; /* gpio */int irqnum; /* 中斷號(hào) */unsigned char value; /* 按鍵對(duì)應(yīng)的鍵值 */char name[10]; /* 名字 */irqreturn_t (*handler)(int, void *); /* 中斷服務(wù)函數(shù) */ };/* imx6uirq設(shè)備結(jié)構(gòu)體 */ struct imx6uirq_dev{dev_t devid; /* 設(shè)備號(hào) */ struct cdev cdev; /* cdev */ struct class *class; /* 類 */struct device *device; /* 設(shè)備 */int major; /* 主設(shè)備號(hào) */int minor; /* 次設(shè)備號(hào) */struct device_node *nd; /* 設(shè)備節(jié)點(diǎn) */ atomic_t keyvalue; /* 有效的按鍵鍵值 */atomic_t releasekey; /* 標(biāo)記是否完成一次完成的按鍵,包括按下和釋放 */struct timer_list timer;/* 定義一個(gè)定時(shí)器*/struct irq_keydesc irqkeydesc[KEY_NUM]; /* 按鍵init述數(shù)組 */unsigned char curkeynum; /* 當(dāng)前init按鍵號(hào) */wait_queue_head_t r_wait; /* 讀等待隊(duì)列頭 */struct fasync_struct *async_queue; /* 異步相關(guān)結(jié)構(gòu)體 */ };struct imx6uirq_dev imx6uirq; /* irq設(shè)備 *//* @description : 中斷服務(wù)函數(shù),開啟定時(shí)器 * 定時(shí)器用于按鍵消抖。* @param - irq : 中斷號(hào) * @param - dev_id : 設(shè)備結(jié)構(gòu)。* @return : 中斷執(zhí)行結(jié)果*/ static irqreturn_t key0_handler(int irq, void *dev_id) {struct imx6uirq_dev *dev = (struct imx6uirq_dev*)dev_id;dev->curkeynum = 0;dev->timer.data = (volatile long)dev_id;mod_timer(&dev->timer, jiffies + msecs_to_jiffies(10)); /* 10ms定時(shí) */return IRQ_RETVAL(IRQ_HANDLED); }/* @description : 定時(shí)器服務(wù)函數(shù),用于按鍵消抖,定時(shí)器到了以后* 再次讀取按鍵值,如果按鍵還是處于按下狀態(tài)就表示按鍵有效。* @param - arg : 設(shè)備結(jié)構(gòu)變量* @return : 無*/ void timer_function(unsigned long arg) {unsigned char value;unsigned char num;struct irq_keydesc *keydesc;struct imx6uirq_dev *dev = (struct imx6uirq_dev *)arg;num = dev->curkeynum;keydesc = &dev->irqkeydesc[num];value = gpio_get_value(keydesc->gpio); /* 讀取IO值 */if(value == 0){ /* 按下按鍵 */atomic_set(&dev->keyvalue, keydesc->value);}else{ /* 按鍵松開 */atomic_set(&dev->keyvalue, 0x80 | keydesc->value);atomic_set(&dev->releasekey, 1); /* 標(biāo)記松開按鍵,即完成一次完整的按鍵過程 */} if(atomic_read(&dev->releasekey)) { /* 一次完整的按鍵過程 */if(dev->async_queue)kill_fasync(&dev->async_queue, SIGIO, POLL_IN); /* 釋放SIGIO信號(hào) */}#if 0/* 喚醒進(jìn)程 */if(atomic_read(&dev->releasekey)) { /* 完成一次按鍵過程 *//* wake_up(&dev->r_wait); */wake_up_interruptible(&dev->r_wait);} #endif }/** @description : 按鍵IO初始化* @param : 無* @return : 無*/ static int keyio_init(void) {unsigned char i = 0;char name[10];int ret = 0;imx6uirq.nd = of_find_node_by_path("/key");if (imx6uirq.nd== NULL){printk("key node not find!\r\n");return -EINVAL;} /* 提取GPIO */for (i = 0; i < KEY_NUM; i++) {imx6uirq.irqkeydesc[i].gpio = of_get_named_gpio(imx6uirq.nd ,"key-gpio", i);if (imx6uirq.irqkeydesc[i].gpio < 0) {printk("can't get key%d\r\n", i);}}/* 初始化key所使用的IO,并且設(shè)置成中斷模式 */for (i = 0; i < KEY_NUM; i++) {memset(imx6uirq.irqkeydesc[i].name, 0, sizeof(name)); /* 緩沖區(qū)清零 */sprintf(imx6uirq.irqkeydesc[i].name, "KEY%d", i); /* 組合名字 */gpio_request(imx6uirq.irqkeydesc[i].gpio, name);gpio_direction_input(imx6uirq.irqkeydesc[i].gpio); imx6uirq.irqkeydesc[i].irqnum = irq_of_parse_and_map(imx6uirq.nd, i); #if 0imx6uirq.irqkeydesc[i].irqnum = gpio_to_irq(imx6uirq.irqkeydesc[i].gpio); #endif}/* 申請(qǐng)中斷 */imx6uirq.irqkeydesc[0].handler = key0_handler;imx6uirq.irqkeydesc[0].value = KEY0VALUE;for (i = 0; i < KEY_NUM; i++) {ret = request_irq(imx6uirq.irqkeydesc[i].irqnum, imx6uirq.irqkeydesc[i].handler, IRQF_TRIGGER_FALLING|IRQF_TRIGGER_RISING, imx6uirq.irqkeydesc[i].name, &imx6uirq);if(ret < 0){printk("irq %d request failed!\r\n", imx6uirq.irqkeydesc[i].irqnum);return -EFAULT;}}/* 創(chuàng)建定時(shí)器 */init_timer(&imx6uirq.timer);imx6uirq.timer.function = timer_function;/* 初始化等待隊(duì)列頭 */init_waitqueue_head(&imx6uirq.r_wait);return 0; }/** @description : 打開設(shè)備* @param - inode : 傳遞給驅(qū)動(dòng)的inode* @param - filp : 設(shè)備文件,file結(jié)構(gòu)體有個(gè)叫做private_data的成員變量* 一般在open的時(shí)候?qū)rivate_data指向設(shè)備結(jié)構(gòu)體。* @return : 0 成功;其他 失敗*/ static int imx6uirq_open(struct inode *inode, struct file *filp) {filp->private_data = &imx6uirq; /* 設(shè)置私有數(shù)據(jù) */return 0; }/** @description : 從設(shè)備讀取數(shù)據(jù) * @param - filp : 要打開的設(shè)備文件(文件描述符)* @param - buf : 返回給用戶空間的數(shù)據(jù)緩沖區(qū)* @param - cnt : 要讀取的數(shù)據(jù)長(zhǎng)度* @param - offt : 相對(duì)于文件首地址的偏移* @return : 讀取的字節(jié)數(shù),如果為負(fù)值,表示讀取失敗*/ static ssize_t imx6uirq_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt) {int ret = 0;unsigned char keyvalue = 0;unsigned char releasekey = 0;struct imx6uirq_dev *dev = (struct imx6uirq_dev *)filp->private_data;if (filp->f_flags & O_NONBLOCK) { /* 非阻塞訪問 */if(atomic_read(&dev->releasekey) == 0) /* 沒有按鍵按下,返回-EAGAIN */return -EAGAIN;} else { /* 阻塞訪問 *//* 加入等待隊(duì)列,等待被喚醒,也就是有按鍵按下 */ret = wait_event_interruptible(dev->r_wait, atomic_read(&dev->releasekey)); if (ret) {goto wait_error;}}keyvalue = atomic_read(&dev->keyvalue);releasekey = atomic_read(&dev->releasekey);if (releasekey) { /* 有按鍵按下 */ if (keyvalue & 0x80) {keyvalue &= ~0x80;ret = copy_to_user(buf, &keyvalue, sizeof(keyvalue));} else {goto data_error;}atomic_set(&dev->releasekey, 0);/* 按下標(biāo)志清零 */} else {goto data_error;}return 0;wait_error:return ret; data_error:return -EINVAL; }/** @description : poll函數(shù),用于處理非阻塞訪問* @param - filp : 要打開的設(shè)備文件(文件描述符)* @param - wait : 等待列表(poll_table)* @return : 設(shè)備或者資源狀態(tài),*/ unsigned int imx6uirq_poll(struct file *filp, struct poll_table_struct *wait) {unsigned int mask = 0;struct imx6uirq_dev *dev = (struct imx6uirq_dev *)filp->private_data;poll_wait(filp, &dev->r_wait, wait); /* 將等待隊(duì)列頭添加到poll_table中 */if(atomic_read(&dev->releasekey)) { /* 按鍵按下 */mask = POLLIN | POLLRDNORM; /* 返回PLLIN */}return mask; }/** @description : fasync函數(shù),用于處理異步通知* @param - fd : 文件描述符* @param - filp : 要打開的設(shè)備文件(文件描述符)* @param - on : 模式* @return : 負(fù)數(shù)表示函數(shù)執(zhí)行失敗*/ static int imx6uirq_fasync(int fd, struct file *filp, int on) {struct imx6uirq_dev *dev = (struct imx6uirq_dev *)filp->private_data;return fasync_helper(fd, filp, on, &dev->async_queue); }/** @description : release函數(shù),應(yīng)用程序調(diào)用close關(guān)閉驅(qū)動(dòng)文件的時(shí)候會(huì)執(zhí)行* @param - inode : inode節(jié)點(diǎn)* @param - filp : 要打開的設(shè)備文件(文件描述符)* @return : 負(fù)數(shù)表示函數(shù)執(zhí)行失敗*/ static int imx6uirq_release(struct inode *inode, struct file *filp) {return imx6uirq_fasync(-1, filp, 0); }/* 設(shè)備操作函數(shù) */ static struct file_operations imx6uirq_fops = {.owner = THIS_MODULE,.open = imx6uirq_open,.read = imx6uirq_read,.poll = imx6uirq_poll,.fasync = imx6uirq_fasync,.release = imx6uirq_release, };/** @description : 驅(qū)動(dòng)入口函數(shù)* @param : 無* @return : 無*/ static int __init imx6uirq_init(void) {/* 1、構(gòu)建設(shè)備號(hào) */if (imx6uirq.major) {imx6uirq.devid = MKDEV(imx6uirq.major, 0);register_chrdev_region(imx6uirq.devid, IMX6UIRQ_CNT, IMX6UIRQ_NAME);} else {alloc_chrdev_region(&imx6uirq.devid, 0, IMX6UIRQ_CNT, IMX6UIRQ_NAME);imx6uirq.major = MAJOR(imx6uirq.devid);imx6uirq.minor = MINOR(imx6uirq.devid);}/* 2、注冊(cè)字符設(shè)備 */cdev_init(&imx6uirq.cdev, &imx6uirq_fops);cdev_add(&imx6uirq.cdev, imx6uirq.devid, IMX6UIRQ_CNT);/* 3、創(chuàng)建類 */imx6uirq.class = class_create(THIS_MODULE, IMX6UIRQ_NAME);if (IS_ERR(imx6uirq.class)) { return PTR_ERR(imx6uirq.class);}/* 4、創(chuàng)建設(shè)備 */imx6uirq.device = device_create(imx6uirq.class, NULL, imx6uirq.devid, NULL, IMX6UIRQ_NAME);if (IS_ERR(imx6uirq.device)) {return PTR_ERR(imx6uirq.device);}/* 5、始化按鍵 */atomic_set(&imx6uirq.keyvalue, INVAKEY);atomic_set(&imx6uirq.releasekey, 0);keyio_init();return 0; }/** @description : 驅(qū)動(dòng)出口函數(shù)* @param : 無* @return : 無*/ static void __exit imx6uirq_exit(void) {unsigned i = 0;/* 刪除定時(shí)器 */del_timer_sync(&imx6uirq.timer); /* 刪除定時(shí)器 *//* 釋放中斷 */ for (i = 0; i < KEY_NUM; i++) {free_irq(imx6uirq.irqkeydesc[i].irqnum, &imx6uirq);}cdev_del(&imx6uirq.cdev);unregister_chrdev_region(imx6uirq.devid, IMX6UIRQ_CNT);device_destroy(imx6uirq.class, imx6uirq.devid);class_destroy(imx6uirq.class); } module_init(imx6uirq_init); module_exit(imx6uirq_exit); MODULE_LICENSE("GPL");

第20 行,添加fcntl.h 頭文件,因?yàn)橐玫较嚓P(guān)的API 函數(shù)。
第64 行,在設(shè)備結(jié)構(gòu)體imx6uirq_dev 中添加fasync_struct 指針變量。
第109~112 行,如果是一次完整的按鍵過程,那么就通過kill_fasync 函數(shù)發(fā)送SIGIO 信號(hào)。
第114~120 行,屏蔽掉以前的喚醒進(jìn)程相關(guān)程序。
第269~273 行,imx6uirq_fasync 函數(shù),為file_operations 操作集中的fasync 函數(shù),此函數(shù)內(nèi)容很簡(jiǎn)單,就是調(diào)用一下fasync_helper。
第281~284 行,release 函數(shù),應(yīng)用程序調(diào)用close 函數(shù)關(guān)閉驅(qū)動(dòng)設(shè)備文件的時(shí)候此函數(shù)就會(huì)執(zhí)行,在此函數(shù)中釋放掉fasync_struct 指針變量。
第292~293 行,設(shè)置file_operations 操作集中的fasync 和release 這兩個(gè)成員變量。

編寫測(cè)試APP

測(cè)試APP 要實(shí)現(xiàn)的內(nèi)容很簡(jiǎn)單,設(shè)置SIGIO 信號(hào)的處理函數(shù)為sigio_signal_func,當(dāng)驅(qū)動(dòng)程序向應(yīng)用程序發(fā)送SIGIO 信號(hào)以后sigio_signal_func 函數(shù)就會(huì)執(zhí)行。sigio_signal_func 函數(shù)內(nèi)容很簡(jiǎn)單,就是通過read 函數(shù)讀取按鍵值。新建名為asyncnotiApp.c 的文件,然后輸入如下所示內(nèi)容:

#include "stdio.h" #include "unistd.h" #include "sys/types.h" #include "sys/stat.h" #include "fcntl.h" #include "stdlib.h" #include "string.h" #include "poll.h" #include "sys/select.h" #include "sys/time.h" #include "linux/ioctl.h" #include "signal.h" /*************************************************************** Copyright ? ALIENTEK Co., Ltd. 1998-2029. All rights reserved. 文件名 : asyncnotiApp.c 作者 : 左忠凱 版本 : V1.0 描述 : 異步通知測(cè)試APP 其他 : 無 使用方法 :./asyncnotiApp /dev/asyncnoti 打開測(cè)試App 論壇 : www.openedv.com 日志 : 初版V1.0 2019/8/13 左忠凱創(chuàng)建 ***************************************************************/static int fd = 0; /* 文件描述符 *//** SIGIO信號(hào)處理函數(shù)* @param - signum : 信號(hào)值* @return : 無*/ static void sigio_signal_func(int signum) {int err = 0;unsigned int keyvalue = 0;err = read(fd, &keyvalue, sizeof(keyvalue));if(err < 0) {/* 讀取錯(cuò)誤 */} else {printf("sigio signal! key value=%d\r\n", keyvalue);} }/** @description : main主程序* @param - argc : argv數(shù)組元素個(gè)數(shù)* @param - argv : 具體參數(shù)* @return : 0 成功;其他 失敗*/ int main(int argc, char *argv[]) {int flags = 0;char *filename;if (argc != 2) {printf("Error Usage!\r\n");return -1;}filename = argv[1];fd = open(filename, O_RDWR);if (fd < 0) {printf("Can't open file %s\r\n", filename);return -1;}/* 設(shè)置信號(hào)SIGIO的處理函數(shù) */signal(SIGIO, sigio_signal_func);fcntl(fd, F_SETOWN, getpid()); /* 設(shè)置當(dāng)前進(jìn)程接收SIGIO信號(hào) */flags = fcntl(fd, F_GETFL); /* 獲取當(dāng)前的進(jìn)程狀態(tài) */fcntl(fd, F_SETFL, flags | FASYNC); /* 設(shè)置進(jìn)程啟用異步通知功能 */ while(1) {sleep(2);}close(fd);return 0; }

第32~43 行,sigio_signal_func 函數(shù),SIGIO 信號(hào)的處理函數(shù),當(dāng)驅(qū)動(dòng)程序有效按鍵按下以后就會(huì)發(fā)送SIGIO 信號(hào),此函數(shù)就會(huì)執(zhí)行。此函數(shù)通過read 函數(shù)讀取按鍵值,然后通過printf 函數(shù)打印在終端上。
第69 行,通過signal 函數(shù)設(shè)置SIGIO 信號(hào)的處理函數(shù)為sigio_signal_func。
第71~73 行,設(shè)置當(dāng)前進(jìn)程的狀態(tài),開啟異步通知的功能。
第75~77 行,while 循環(huán),等待信號(hào)產(chǎn)生。

運(yùn)行測(cè)試

編譯驅(qū)動(dòng)程序和測(cè)試APP

1、編譯驅(qū)動(dòng)程序
編寫Makefile 文件,本章實(shí)驗(yàn)的Makefile 文件和第四十章實(shí)驗(yàn)基本一樣,只是將obj-m 變量的值改為asyncnoti.o,Makefile 內(nèi)容如下所示:

KERNELDIR := /home/zuozhongkai/linux/IMX6ULL/linux/temp/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek CURRENT_PATH := $(shell pwd)obj-m := asyncnoti.obuild: kernel_moduleskernel_modules:$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modulesclean:$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean

第4 行,設(shè)置obj-m 變量的值為asyncnoti.o。
輸入如下命令編譯出驅(qū)動(dòng)模塊文件:

make -j32

編譯成功以后就會(huì)生成一個(gè)名為“asyncnoti.ko”的驅(qū)動(dòng)模塊文件。

2、編譯測(cè)試APP
輸入如下命令編譯測(cè)試asyncnotiApp.c 這個(gè)測(cè)試程序:

arm-linux-gnueabihf-gcc asyncnotiApp.c -o asyncnotiApp

編譯成功以后就會(huì)生成asyncnotiApp 這個(gè)應(yīng)用程序。

運(yùn)行測(cè)試

將上一小節(jié)編譯出來asyncnoti.ko 和asyncnotiApp 這兩個(gè)文件拷貝到
rootfs/lib/modules/4.1.15 目錄中,重啟開發(fā)板,進(jìn)入到目錄lib/modules/4.1.15 中,輸入如下命令加載asyncnoti.ko 驅(qū)動(dòng)模塊:

depmod //第一次加載驅(qū)動(dòng)的時(shí)候需要運(yùn)行此命令 modprobe asyncnoti.ko //加載驅(qū)動(dòng)

驅(qū)動(dòng)加載成功以后使用如下命令來測(cè)試中斷:

./asyncnotiApp /dev/asyncnoti

按下開發(fā)板上的KEY0 鍵,終端就會(huì)輸出按鍵值,如圖53.4.2.1 所示:

從圖53.4.2.1 可以看出,捕獲到SIGIO 信號(hào),并且按鍵值獲取成功,大家可以自行以后臺(tái)模式運(yùn)行asyncnotiApp,查看一下這個(gè)應(yīng)用程序的CPU 使用率。如果要卸載驅(qū)動(dòng)的話輸入如下命令即可:

rmmod asyncnoti.ko

總結(jié)

以上是生活随笔為你收集整理的异步通知实验(信号)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

亚洲在线视频免费 | 久久高清毛片 | 97超碰免费在线观看 | 激情视频免费在线 | 天天躁日日躁狠狠 | 国产黄免费 | 中文字幕av播放 | 欧美日韩在线精品一区二区 | 国产三级精品三级在线观看 | 九色自拍视频 | 国产精品成久久久久 | 91免费观看视频在线 | 狠狠干在线 | 久久久国产精品一区二区中文 | 久久免费在线观看视频 | 手机成人av| 又黄又爽又湿又无遮挡的在线视频 | av一区二区在线观看中文字幕 | 国产精品刺激对白麻豆99 | 精品亚洲国产视频 | 亚洲综合网 | 成人影视免费 | 九九久久久久久久久激情 | 在线免费视频一区 | 成人黄色毛片视频 | 国产视频18 | 久久成人国产精品 | 欧美 日韩精品 | 中文字幕免费成人 | 欧美激情第十页 | 成人国产精品免费观看 | 成人av影院在线观看 | 精品在线二区 | 亚洲精品在线一区二区三区 | 日本三级吹潮在线 | 99国产精品免费网站 | 亚洲电影第一页av | 激情欧美一区二区免费视频 | 99在线精品视频在线观看 | 在线免费日韩 | 日韩色视频在线观看 | 在线午夜电影神马影院 | 中文字幕色播 | 天天操夜操视频 | 久久综合色天天久久综合图片 | 日本中文字幕网址 | 亚洲精品久久久久中文字幕m男 | 亚洲我射av | 在线中文字幕av观看 | 成人久久18免费 | 午夜丁香网 | 久草在线在线视频 | 久久这里只精品 | 天天躁日日躁狠狠躁av麻豆 | 久久精品这里都是精品 | 天堂在线免费视频 | 天天想夜夜操 | 婷婷丁香av| 欧美激情综合五月色丁香小说 | 一区二区三区免费看 | 美女网站在线观看 | 在线观看国产www | 亚洲人成影院在线 | 国产精品一区二区吃奶在线观看 | av黄色大片| 中文久久精品 | 国产精品一区二 | 久久免费视频7 | 国产激情小视频在线观看 | 超碰人人国产 | 国产操在线 | 中文字幕一区av | 日韩在线视频看看 | 少妇精品久久久一区二区免费 | 18网站在线观看 | bbbb操bbbb | 五月天激情综合 | 国产亚洲精品福利 | 婷婷狠狠操 | 日韩免费不卡av | 一区二区不卡高清 | 亚洲一级二级三级 | 免费看搞黄视频网站 | 最新在线你懂的 | 韩国中文三级 | 中文字幕在线观看完整版 | 久久社区视频 | 午夜精品久久久久久久久久久久 | 日本精品二区 | 国产在线精品一区二区 | 伊人天堂网 | 天天射天天色天天干 | 麻豆国产精品永久免费视频 | 久久再线视频 | 亚洲天堂色婷婷 | 日韩欧美一区二区在线播放 | 久草在线一免费新视频 | 六月丁香婷婷久久 | 天天干天天射天天插 | 美国av片在线观看 | 亚洲精品大片www | 日韩 在线观看 | 久色 网 | av午夜电影 | 日韩不卡高清 | 国产999精品久久久久久麻豆 | 日日爽夜夜爽 | 91精品国产麻豆 | 成人免费观看视频大全 | 久久综合久久鬼 | 97超碰总站 | 午夜黄网 | 国产v欧美 | 久草视频观看 | 欧美视屏一区二区 | 最近2019好看的中文字幕免费 | 欧美日韩中文在线视频 | 日日骑| 1024手机基地在线观看 | 天天插天天狠 | 又黄又爽又刺激视频 | 天天干天天拍天天操 | 五月天网页 | 欧美午夜激情网 | 九九交易行官网 | 手机看片福利 | 黄色av一区二区三区 | 在线看片日韩 | 成人国产网址 | 99视频在线观看视频 | 欧美综合久久 | 日日夜夜天天久久 | 欧美国产精品一区二区 | 日韩免费观看一区二区 | 国产精品 美女 | 国产一区在线视频 | www.黄色 | 国产精品自在欧美一区 | 丁香婷婷综合色啪 | www免费网站在线观看 | 国产理论免费 | 在线看国产日韩 | 日韩一二区在线 | 日韩亚洲在线观看 | 国产自产高清不卡 | 国产精品男女 | 97视频一区 | 婷婷久久网站 | 青草视频在线 | 久久久久网站 | 久久激情五月丁香伊人 | 激情大尺度视频 | 久草网在线 | 狠狠色丁香久久婷婷综合_中 | 在线精品在线 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 8x成人在线 | www.天天操| av 一区 二区 久久 | 国产黄色av | 九九视频免费观看视频精品 | 日韩av在线资源 | 免费观看第二部31集 | 亚洲精品视频一 | 国产亚洲成av人片在线观看桃 | 日韩 在线观看 | 国产精品国产三级国产aⅴ入口 | 欧美国产日韩一区 | 日躁夜躁狠狠躁2001 | 亚洲国产天堂av | 欧美精品久久久 | 中文字幕av影院 | 成人国产综合 | 亚洲美女久久 | 国产精品美女久久久久久 | 国内揄拍国产精品 | 国产精品久久久999 国产91九色视频 | 久久国产精品免费一区二区三区 | 在线看毛片网站 | 视频在线播放国产 | 97超碰资源站 | 精品福利在线 | 91视频在线播放视频 | 综合网伊人 | 中文字幕乱码亚洲精品一区 | 九九久久国产精品 | 日韩大陆欧美高清视频区 | 欧美少妇bbwhd | 成年人视频免费在线 | 精品国产免费观看 | 中文字幕网址 | 黄色免费在线视频 | 五月开心婷婷 | 国内视频一区二区 | 天天se天天cao天天干 | 毛片网在线观看 | 超碰人人在线观看 | 在线观影网站 | 日韩午夜电影网 | 亚洲精品国产品国语在线 | 99在线观看视频网站 | 中文在线免费一区三区 | 国产福利精品一区二区 | 综合激情av | 玖玖在线看 | 久久与婷婷 | 欧美成人91 | 国产精品久久久久久久久软件 | 超碰在线cao| 亚洲成年人免费网站 | 在线观看黄色小视频 | 蜜桃久久久 | 久久一区91 | av动态图片| av资源在线看 | 午夜精品麻豆 | 99久免费精品视频在线观看 | 蜜桃视频日韩 | 亚洲精品在线资源 | 91视频免费看片 | 日韩免费一区二区三区 | 五月天婷婷在线观看视频 | 激情在线五月天 | 婷婷在线视频观看 | av免费线看| 国产精品乱码高清在线看 | www欧美日韩 | 欧洲激情综合 | av免费看网站 | 99久久毛片| 97av免费视频 | 五月天综合在线 | 国产丝袜一区二区三区 | 国产精品一区二区三区四区在线观看 | 国产手机在线 | 天天干天天摸天天操 | 最近中文字幕完整视频高清1 | www日韩在线| www.夜夜爽 | 亚洲午夜精品在线观看 | av在线直接看 | 日韩最新av在线 | 久久免费av电影 | 国产在线a免费观看 | 91成品人影院 | 国内精品久久久久久久久久清纯 | 国产在线观看免费观看 | 91亚洲精品久久久蜜桃 | 四虎成人精品 | 成人免费视频a | 欧美一区二区三区免费观看 | 在线亚洲午夜片av大片 | 成年人视频免费在线播放 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 中文字幕亚洲精品在线观看 | 日韩在线网址 | 99精品国产在热久久 | 98超碰人人 | 国内免费的中文字幕 | 久久久国产精品人人片99精片欧美一 | 天天色天天干天天 | 国产精品9区 | 国内三级在线观看 | 亚洲精品乱码久久久久 | 久久网站最新地址 | 天天摸日日摸人人看 | 成人av在线直播 | 日本99久久 | 亚洲一区在线看 | 精品国产免费久久 | 婷婷六月在线 | 一区二区三区日韩在线观看 | 中文在线a∨在线 | 天天综合网久久 | 日韩在线观看免费 | 日韩高清免费观看 | 国产精品黄网站在线观看 | 国产综合香蕉五月婷在线 | 日韩欧美精品在线观看视频 | 在线观看黄色av | 成人亚洲网 | 99精品国产在热久久 | 在线视频成人 | 天天操夜夜逼 | 最新日本中文字幕 | 天天天色综合a | 国产精品一区二区美女视频免费看 | 亚洲资源在线网 | 国产精品久久久精品 | 成人影片在线播放 | 国产一区二区电影在线观看 | 久草视频资源 | 久久久国产一区 | 黄色片网站av | 中文字幕综合在线 | 国产综合在线观看视频 | www.狠狠操 | 久久精品99国产国产 | 日韩免费在线网站 | 亚洲午夜久久久影院 | 国产精品v欧美精品 | 精品久久免费看 | 国产录像在线观看 | 国产精品欧美在线 | 日韩精品视频免费在线观看 | 亚洲激情综合 | 日韩精品一区二区三区不卡 | 粉嫩av一区二区三区四区在线观看 | 亚洲91精品在线观看 | 三上悠亚一区二区在线观看 | 99久久婷婷国产 | 成人综合婷婷国产精品久久免费 | 91精品麻豆 | 黄色免费高清视频 | 亚洲三级精品 | 福利视频导航网址 | 免费国产ww | 欧美午夜久久久 | 久久99免费观看 | 免费在线观看中文字幕 | 五月开心激情网 | 国内精品久久久久久久影视麻豆 | 成人国产精品av | 国产免费美女 | 国产免费观看高清完整版 | 欧美日韩国产综合一区二区 | 69av国产 | 超碰在线观看av | 国产精品精品久久久久久 | www久久 | 中文字幕色婷婷在线视频 | 欧美性脚交 | 日韩大片在线 | 黄色片免费在线 | www.成人久久 | 网站在线观看日韩 | av资源免费在线观看 | 国产日产av | 亚洲在线免费视频 | av免费在线免费观看 | 国模精品一区二区三区 | 国产区精品视频 | 国产精品欧美久久久久久 | 久久久久免费观看 | 国产九色视频在线观看 | 久久久久久久久久久免费视频 | 99精彩视频在线观看免费 | 中文字幕欲求不满 | 久草在线免费看视频 | 日韩免费久久 | 久久久蜜桃 | 黄色资源在线 | 久久精品婷婷 | 人人插人人草 | 久久免费观看少妇a级毛片 久久久久成人免费 | 九九九九九精品 | 成年人免费在线观看网站 | 久久欧洲视频 | 99在线观看免费视频精品观看 | 五月婷婷综合在线视频 | 久久ww| 国产午夜一区二区 | 午夜成人影视 | 国产精品久久久久久一二三四五 | 美女又爽又黄 | 在线色吧 | av怡红院| 97超碰成人在线 | 日本久久综合视频 | 在线观看日韩精品视频 | 91精品国自产在线偷拍蜜桃 | 精品久久综合 | 免费成人av| 国产一区二区免费 | 521色香蕉网站在线观看 | 精品国自产在线观看 | 黄色av一级片 | 亚洲一区二区三区91 | 久久久久高清毛片一级 | 亚洲综合最新在线 | 色999精品| 日韩精品专区在线影院重磅 | 亚洲精品视频大全 | 久久久蜜桃一区二区 | 亚洲一区久久 | 在线视频 成人 | 国产在线精 | 黄色一级性片 | 天天干天天草天天爽 | 久久精品99国产 | 91黄色在线视频 | 激情久久小说 | 高清视频一区二区三区 | av天天色 | 免费99精品国产自在在线 | 日p在线观看 | 少妇视频在线播放 | 日本精品va在线观看 | 欧美91在线 | 欧美久久久久 | 欧美日韩一区二区在线观看 | v片在线播放 | av资源网在线播放 | 国产99久久99热这里精品5 | 国语麻豆| 久精品视频 | 色999视频 | 亚洲伊人色 | 国产成人免费 | 欧美精品首页 | 久久免费视频在线观看30 | 色综合中文字幕 | 久久久久久久精 | 四虎国产精品永久在线国在线 | 99久久婷婷国产一区二区三区 | 日日碰狠狠躁久久躁综合网 | 午夜性色| 日韩免费二区 | 亚洲国产中文在线 | 青青草国产成人99久久 | 精品久久久久一区二区国产 | 超碰在线个人 | 久久久久综合网 | 久久免费精彩视频 | 日韩v在线91成人自拍 | 久久短视频 | 国产色资源| 久久一区91 | 美女福利视频 | 在线观看国产福利片 | 婷婷丁香久久五月婷婷 | 欧美日韩在线观看一区二区三区 | 狠狠色丁香婷婷综合最新地址 | 2021国产精品| 欧美一二三视频 | 国产精品一区二区久久 | 久久黄色免费视频 | 五月婷婷影院 | 天天操天天色天天 | 麻豆精品传媒视频 | 久久天堂精品视频 | 97精品在线观看 | 二区三区视频 | 天天爱天天操天天爽 | 久久影视中文字幕 | 日日夜夜精品免费视频 | 天天综合狠狠精品 | 欧美日比视频 | 欧洲一区二区在线观看 | av免费在线观看网站 | 九九欧美视频 | 97电影院在线观看 | 欧美亚洲国产一卡 | 黄色视屏av | 探花视频在线观看免费 | 国产专区视频 | 日日爽日日操 | 久久免费福利 | 婷婷视频在线播放 | 亚洲精品乱码久久久久久高潮 | 五月开心婷婷网 | 97**国产露脸精品国产 | 一区二区精品视频 | 91看毛片 | 国产精品免费一区二区 | 在线国产黄色 | 丁香婷婷色综合亚洲电影 | 激情综合网五月 | 在线观看视频精品 | 久久久国产一区二区三区 | 国产精品男女视频 | 成人h电影在线观看 | 成 人 黄 色 视频播放1 | 日韩高清久久 | 国产 亚洲 欧美 在线 | 国产永久免费观看 | 久久久www成人免费精品 | 在线91观看| 久久婷婷色 | 天天天天天天操 | 婷婷精品在线视频 | 人人射网站 | 亚洲精品久久视频 | 国产精品成人免费一区久久羞羞 | 天天综合天天做 | 国产精品一区二区av | 中文 一区二区 | 精品国产理论 | 欧美日韩在线看 | 五月开心六月伊人色婷婷 | 天天曰天天爽 | 在线高清av | 综合色天天 | 激情欧美国产 | 黄视频网站大全 | 国产在线a不卡 | 国产九九热 | av官网 | 最新高清无码专区 | 国产精品原创 | 五月天久久久久久 | 91视频午夜 | 亚洲精品国产区 | 伊人手机在线 | 日本 在线 视频 中文 有码 | 久草五月| 在线观看精品一区 | 亚洲精品在线观 | 天天天天综合 | 中文字幕中文字幕 | 四虎国产精品免费观看视频优播 | 免费网站黄| 亚洲第一区精品 | 午夜精品av | 欧美日韩亚洲在线观看 | 久久综合久久综合久久 | 韩国av一区二区三区 | 国产在线中文字幕 | 天天干天天干天天 | 欧美 高跟鞋交 xxxxhd | 亚洲资源网 | 欧美日韩视频在线观看一区二区 | 亚洲精品资源在线 | 欧美在线视频日韩 | 在线播放 日韩专区 | 国产在线不卡精品 | 91亚洲国产| 992tv在线观看 | 亚洲精品国产精品乱码不99热 | 91九色精品 | 国内视频一区二区 | 日韩在线观看视频网站 | 国产成人99久久亚洲综合精品 | 色国产视频 | 国产一区二区精品久久91 | 丁香婷婷激情网 | 成人一区不卡 | 国产首页| 女人18精品一区二区三区 | 国产精品视频地址 | 激情婷婷亚洲 | av免费观看网站 | 国产精品一码二码三码在线 | 国产在线a不卡 | 久久好看| 国产黄色在线网站 | 丝袜av一区 | 亚洲综合色站 | 国产成年免费视频 | 丁香综合网 | 国产精品theporn | 欧美另类xxxxx | www亚洲一区 | 91视频电影| 99久久久久久久 | 国产精品毛片一区视频播不卡 | 超碰在97| 亚洲午夜电影网 | a级片韩国 | 亚洲精品久久久久中文字幕二区 | 成人欧美亚洲 | 伊人色**天天综合婷婷 | 国产美女被啪进深处喷白浆视频 | 91cn国产在线 | 热久久免费视频 | 欧美精品亚州精品 | 欧美日韩国产精品一区 | 91黄色免费看 | 97超碰国产精品女人人人爽 | 激情五月看片 | 久久久精品一区二区三区 | 99热这里只有精品在线观看 | 五月天丁香综合 | av永久网址| 国产日产高清dvd碟片 | 一二区av | 久久欧洲视频 | www.香蕉视频 | 成片人卡1卡2卡3手机免费看 | 久久伦理 | 成人av在线网 | 97av免费视频 | 日韩欧美在线视频一区二区 | 99亚洲天堂 | 91精品视频在线播放 | 精品美女视频 | 在线小视频 | 91麻豆精品 | 成人久久视频 | 精品久久久久久久久久久久久久久久久久 | 久久成人免费视频 | 一区二区三区免费在线观看视频 | 91九色最新 | 成人国产网址 | 五月天激情视频在线观看 | 日本久久久精品视频 | 亚洲三级在线免费观看 | 亚洲精品久久久久58 | 麻豆国产精品永久免费视频 | 美女免费网站 | 久草a在线 | 天天射,天天干 | 国产美女在线观看 | 黄色毛片在线观看 | 一区 二区电影免费在线观看 | 免费a视频在线 | 91社区国产高清 | 欧美一区二区在线免费看 | 在线观看免费一级片 | 国产一区二区高清 | 在线观看精品视频 | 欧美一级艳片视频免费观看 | 成人h电影| 国产日韩欧美视频在线观看 | 国产欧美高清 | 三级黄色网址 | 国产成人精品在线观看 | 精品亚洲一区二区 | 国内偷拍精品视频 | 色综合天天干 | 精品久久久久久久久久久院品网 | 亚洲影院天堂 | 亚洲在线成人精品 | 久草免费电影 | 日韩在线观看三区 | а中文在线天堂 | 国产精品网在线观看 | 五月天激情在线 | 欧美精品一区二区在线播放 | 片黄色毛片黄色毛片 | 波多野结衣在线播放视频 | 欧美亚洲三级 | 九九九九九精品 | 免费在线91 | 天天操天天干天天爱 | 亚洲成人一二三 | 一区二区三区精品在线视频 | 国产精品日韩在线播放 | 国产精品久久久区三区天天噜 | 免费福利在线 | 亚洲一区在线看 | 97av免费视频| 成 人 免费 黄 色 视频 | 99国内精品久久久久久久 | 久久99精品国产一区二区三区 | 丁香婷婷激情五月 | 日韩亚洲在线视频 | 亚洲激情 欧美激情 | 国产综合片 | 日韩精品在线观看视频 | www黄色com| 99国产精品久久久久久久久久 | 国产精品视频免费看 | 天天爱天天操天天射 | 在线免费观看不卡av | 日韩电影中文 | 免费在线观看黄 | 又黄又爽又色无遮挡免费 | 国产美女视频 | 亚洲伦理中文字幕 | 成片视频在线观看 | www.久久91 | 国产麻豆视频 | 精品国产成人在线影院 | 欧美福利视频 | 超碰人人乐 | 色网站免费在线看 | 国产一区影院 | 成人三级av | 91成人精品视频 | 在线播放日韩av | 国产精品第一视频 | 伊人永久在线 | 99久久精品国产欧美主题曲 | 五月开心六月伊人色婷婷 | 久久av不卡 | 欧美日韩不卡一区二区 | 亚洲精品国产区 | 在线视频 国产 日韩 | 国产.精品.日韩.另类.中文.在线.播放 | 天堂网av在线 | 伊人久操 | 97超级碰碰 | 在线免费观看欧美日韩 | 在线观看网站你懂的 | 天天色天天操综合 | 亚洲成av人片在线观看www | av 一区二区三区四区 | 成人黄色在线播放 | 久草在线一免费新视频 | 天天干天天怕 | 精品国产aⅴ一区二区三区 在线直播av | 久久精品99国产国产精 | 欧美精品免费视频 | 91精品啪| 久操视频在线免费看 | 98超碰在线观看 | 91成年人在线观看 | 日日爽天天 | 午夜久久 | 欧美日韩国产一区二区三区在线观看 | 天堂av免费看 | 91av在线不卡 | 正在播放日韩 | 久久高清视频免费 | 精品国产一区二区三区在线观看 | 一二三区av | 免费三级骚 | 91香蕉视频在线下载 | www.大网伊人| 成人影片在线播放 | 欧美一二三区在线播放 | 亚洲精品在线网站 | 国产尤物视频在线 | 久久久精品国产免费观看同学 | 日韩免费高清在线观看 | 成人一级电影在线观看 | 国产麻豆视频免费观看 | 一区二区欧美在线观看 | 国产视频久久 | 99热这里只有精品久久 | 国产欧美精品xxxx另类 | 国产精品久久久久亚洲影视 | 97国产精品亚洲精品 | 中文字幕一区二区在线观看 | 亚洲aⅴ一区二区三区 | 五月天六月丁香 | 国产中文字幕在线观看 | 99热最新在线 | 五月婷婷丁香激情 | 亚洲综合视频在线播放 | 欧美激情第28页 | 久草在线视频看看 | 天天人人综合 | 97高清免费视频 | 在线观看黄av | 色婷婷导航 | 99精品国产一区二区三区麻豆 | 国产精品v欧美精品 | av在线播放中文字幕 | 又黄又爽又湿又无遮挡的在线视频 | 亚洲国产美女精品久久久久∴ | 中文字幕在线电影 | 色综合久久五月 | 九九九在线| 久久99亚洲精品久久久久 | 97在线免费视频观看 | 亚洲黄色免费观看 | 1024在线看片 | 不卡中文字幕av | 91女子私密保健养生少妇 | 九热精品 | 国产日韩欧美在线播放 | 亚欧日韩av | 久久黄色影视 | 国内精品久久久久久久 | 亚洲区另类春色综合小说校园片 | 精品亚洲成人 | 欧美另类美少妇69xxxx | 国产成人精品一区二区三区在线观看 | 日韩欧美高清一区二区 | 不卡在线一区 | 97人人爽 | 日韩免费在线观看视频 | 鲁一鲁影院 | 国产成人久久精品 | 色瓜| 97视频免费观看 | 成年人免费在线观看网站 | 97免费在线观看视频 | 婷婷婷国产在线视频 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 国内三级在线观看 | 91av官网| 亚洲综合黄色 | 中文字幕你懂的 | 欧美日韩不卡一区 | 激情五月视频 | 2019久久精品 | 亚洲成人av在线 | a天堂最新版中文在线地址 久久99久久精品国产 | 四虎精品成人免费网站 | 女人18毛片a级毛片一区二区 | 久久这里只有精品久久 | 九九热在线精品视频 | 亚洲成人欧美 | 在线观看视频你懂得 | 亚洲精品午夜久久久久久久久久久 | 激情亚洲综合在线 | 天天摸天天舔 | 91精品视频在线免费观看 | 色婷婷成人| 久久免费播放 | 91精品爽啪蜜夜国产在线播放 | 成人av观看 | 亚洲欧美日本国产 | 亚洲激情六月 | 99免费| av在线影片 | 亚洲色综合 | www视频在线播放 | 日韩色一区二区三区 | 一本一本久久a久久精品综合 | 亚洲欧洲av在线 | 97精品国产91久久久久久 | www.婷婷色 | 一级黄色大片在线观看 | 国产小视频在线看 | 亚洲精品美女久久17c | 毛片美女网站 | 国产一区二区三区黄 | 日本三级久久久 | 九色91视频 | 欧美国产日韩在线观看 | 免费观看国产精品视频 | 成人av直播 | 欧美日韩后 | www.狠狠色 | 精品亚洲视频在线观看 | 亚洲综合欧美日韩狠狠色 | 五月天久久综合网 | 色999五月色| 国产成在线观看免费视频 | 91私密视频| 三级视频片 | 在线免费色 | 精品国自产在线观看 | 男女免费视频观看 | 夜夜高潮夜夜爽国产伦精品 | 人人干人人爽 | 日韩在线视频免费播放 | 在线观看亚洲国产精品 | 亚洲国产高清在线观看视频 | 九色琪琪久久综合网天天 | 久久精品成人热国产成 | 亚洲mv大片欧洲mv大片免费 | 国产精品免费人成网站 | 国产一区二区中文字幕 | 亚洲人av免费网站 | 天天干夜夜爽 | 手机av片 | 久久男人中文字幕资源站 | 国产亚洲久久 | 9在线观看免费高清完整版在线观看明 | 久久成人午夜视频 | 国产午夜精品一区二区三区欧美 | 成人黄在线 | 亚洲精品乱码久久久久久按摩 | 免费国产在线精品 | 黄免费在线观看 | 免费男女羞羞的视频网站中文字幕 | 91免费观看视频网站 | 天天干一干 | 激情在线五月天 | 国产精品免费久久久久 | 国产艹b视频 | 国产国语在线 | 中文字幕日韩在线播放 | 特黄色大片 | 天天激情天天干 | 国产成人综 | 狠狠色狠狠色综合系列 | 9999精品视频| 黄色大片日本免费大片 | av品善网 | 人人藻人人澡人人爽 | 福利一区视频 | 91av在线看 | 超碰国产在线播放 | 手机成人免费视频 | 91福利社区在线观看 | 色播99 | 美女免费视频观看网站 | 天天视频亚洲 | 91精品国自产在线偷拍蜜桃 | 一本大道久久精品懂色aⅴ 五月婷社区 | 国产高清永久免费 | 在线免费黄色毛片 | 精品国产精品久久 | 久久婷婷国产色一区二区三区 | 五月婷婷av在线 | 亚洲另类交 | 亚洲精品黄色在线观看 | 久久免费在线视频 | 亚洲综合色av | 在线观看色网站 | 国产不卡在线观看视频 | 国产美女久久久 | 97操操操| 在线免费观看视频a | 高清中文字幕 | 久色婷婷 | 国产亚洲精品日韩在线tv黄 | 亚洲视频456| 日本黄色免费在线观看 | 91麻豆精品国产91 | 久久精品一二三区白丝高潮 | 在线观看精品一区 | 日韩一区二区三区不卡 | 久久99精品久久久久久 | 中文字幕高清视频 | 最近日韩中文字幕中文 | 国内丰满少妇猛烈精品播放 | 天天操天天色天天射 | 欧美一级黄色视屏 | 久久久久久美女 | 国产成人1区 | 一区二区欧美日韩 | 欧美一区二区三区在线播放 | 在线之家免费在线观看电影 | 可以免费观看的av片 | 麻豆精品视频 | 又黄又爽的视频在线观看网站 | 在线一二区 | 精品国产欧美 | 成人亚洲网 | 亚洲国产美女精品久久久久∴ | av大全在线看 | 亚洲午夜大片 | 国产免费专区 | 天天插天天爱 | 国产综合精品一区二区三区 | 91女神的呻吟细腰翘臀美女 | www.人人草| 欧美亚洲久久 | 91av影视 | 人人澡人人爽欧一区 | 91成版人在线观看入口 | 免费在线电影网址大全 | 在线视频 精品 | 久久经典视频 | 99久久99 | 国产精品一区二区白浆 | 欧美日韩免费一区二区三区 | 天天操夜夜操天天射 | 97超碰在线视 | 日日干网| 精品久久久久久久久久久久久久久久 | 99免费在线播放99久久免费 | 999免费视频 | 久久影院一区 | 麻豆va一区二区三区久久浪 | 在线免费观看黄色小说 | 四虎影视久久久 | 国内小视频在线观看 | 久久综合久久综合久久综合 | 九九久久免费 | 精品久久久精品 | av网址在线播放 | 午夜视频免费播放 | 精品福利在线视频 | 亚洲黄色网络 | 在线观看视频色 | 99久久99久久精品国产片 | 丝袜美腿亚洲综合 | 国产精品观看 | 国产婷婷精品 | 成年人黄色在线观看 | av视屏在线| 国产精品久久久久婷婷二区次 | 亚洲免费视频观看 | 国产精品一区二区精品视频免费看 | 激情综合狠狠 | 精品亚洲一区二区 | a视频在线播放 | 亚洲精品中文字幕视频 | 国产一二三精品 | 99热在线观看免费 | 精品久久久久久久 | 色噜噜噜噜| 国产精品成人免费 | 综合久久2023 | 中文字幕在线观看完整版电影 | 亚洲午夜精品久久久久久久久 | 精品二区视频 | 国产精品中文久久久久久久 | 在线中文字幕av观看 | 亚洲精品自拍视频在线观看 | 狠狠色丁香婷婷综合欧美 | 国产黄色资源 | 日韩二区三区 | 欧美激情精品久久久 | 日韩黄在线观看 | 国产在线观看你懂得 | 国产又粗又硬又爽的视频 | 午夜10000 | 成年人精品| 中文字幕免费高清 | 91精品一区二区三区蜜桃 | 亚洲午夜久久久久久久久电影网 | 亚洲一区二区视频在线 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 五月婷婷视频在线 | 久久久国产精品亚洲一区 | 免费在线观看一区二区三区 | 午夜久久久精品 | 日韩一区在线免费观看 | 91av国产视频 |