亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        嵌入式框架QP_nano的51單片機(jī)移植與應(yīng)用

        2016-01-26 08:18:19張東杰王俊璞
        關(guān)鍵詞:狀態(tài)機(jī)

        張東杰,王俊璞

        (上海交通大學(xué) 儀器科學(xué)與工程系,上海 200240)

        ?

        嵌入式框架QP_nano的51單片機(jī)移植與應(yīng)用

        張東杰,王俊璞

        (上海交通大學(xué) 儀器科學(xué)與工程系,上海 200240)

        摘要:本文旨在為單片機(jī)開發(fā)引入一套輕量級(jí)軟件框架QPnano。首先以簡(jiǎn)易數(shù)字時(shí)鐘設(shè)計(jì)為例,展示了使用QPnano的開發(fā)過(guò)程,然后詳述了QPnano到Keil C51的移植,通過(guò)使用QPnano,將一些經(jīng)典的軟件思想和技術(shù),如面向?qū)ο蟆⑹录?qū)動(dòng)、狀態(tài)機(jī)等,很自然地引入到單片機(jī)的軟件開發(fā)中。

        關(guān)鍵詞:QPnano;事件驅(qū)動(dòng);狀態(tài)機(jī);軟件框架;MCU

        引言

        在計(jì)算機(jī)軟件開發(fā)方面,面向?qū)ο笤O(shè)計(jì)、UML、測(cè)試驅(qū)動(dòng)開發(fā)、基于框架開發(fā)等,是比較成熟的開發(fā)方式,但它們很少被引入到傳統(tǒng)的單片機(jī)開發(fā)領(lǐng)域。究其原因,除了嵌入式芯片廠家眾多、軟件開發(fā)與硬件耦合度過(guò)高、硬件資源有限等因素外,缺少相關(guān)領(lǐng)域的研究和推廣也是一個(gè)主要原因。傳統(tǒng)的中低端單片機(jī),如8051、PIC、AVR等,因其價(jià)格低廉、結(jié)構(gòu)簡(jiǎn)單、已有大批用戶使用等因素,在工業(yè)、消費(fèi)類電子等領(lǐng)域,仍占有很大的市場(chǎng)份額,因此提高這些單片機(jī)的開發(fā)效率和軟件質(zhì)量,對(duì)提高產(chǎn)業(yè)效率和產(chǎn)品質(zhì)量有重要意義。

        相對(duì)于傳統(tǒng)的單片機(jī)開發(fā)使用前后臺(tái)系統(tǒng)和多任務(wù)系統(tǒng),基于框架開發(fā)在代碼重用、設(shè)計(jì)簡(jiǎn)易性等方面有很大優(yōu)勢(shì)。作為為數(shù)不多的嵌入式軟件框架,QP_nano基于UML狀態(tài)機(jī)和事件驅(qū)動(dòng)[1],用C語(yǔ)言實(shí)現(xiàn),具備輕量級(jí)、便于移植等優(yōu)勢(shì),特別適合嵌入式應(yīng)用。

        本文首先通過(guò)使用QP_nano設(shè)計(jì)數(shù)字時(shí)鐘的全過(guò)程,展示QP_nano的面向?qū)ο?、狀態(tài)設(shè)計(jì)等應(yīng)用特征給設(shè)計(jì)帶來(lái)的簡(jiǎn)易性,之后詳述QP_nano移植到Keil C51平臺(tái)需要做的配置、代碼調(diào)整以及平臺(tái)相關(guān)函數(shù)的實(shí)現(xiàn)。

        1基于QP_nano設(shè)計(jì)簡(jiǎn)易數(shù)字時(shí)鐘

        1.1設(shè)計(jì)方案

        設(shè)計(jì)一個(gè)簡(jiǎn)易數(shù)字時(shí)鐘,實(shí)現(xiàn)時(shí)鐘的運(yùn)行和設(shè)置功能設(shè)計(jì)方案如下:

        ① 采用24小時(shí)制,用4個(gè)數(shù)碼管分別顯示小時(shí)和分鐘。

        ② 使用SET(設(shè)置鍵)、UP(加鍵)和DOWN(減鍵),調(diào)整時(shí)鐘。

        ③ 數(shù)字時(shí)鐘上電的時(shí)候,進(jìn)入時(shí)鐘運(yùn)行狀態(tài);從12:00開始計(jì)時(shí),每隔1分鐘,分鐘數(shù)加1;分鐘數(shù)計(jì)滿60后,小時(shí)數(shù)加1,分鐘數(shù)清零并重新開始計(jì)時(shí);小時(shí)數(shù)計(jì)到24時(shí),小時(shí)數(shù)清零并重新開始計(jì)時(shí)。

        ④ 在時(shí)鐘運(yùn)行狀態(tài),按SET,進(jìn)入小時(shí)設(shè)置狀態(tài),小時(shí)顯示開始閃爍。

        ⑤ 在小時(shí)設(shè)置狀態(tài),按SET,小時(shí)數(shù)確認(rèn)并進(jìn)入分鐘設(shè)置狀態(tài),分鐘顯示開始閃爍。

        ⑥ 在分鐘設(shè)置狀態(tài),按SET,分鐘數(shù)確認(rèn),并進(jìn)入時(shí)鐘運(yùn)行狀態(tài)。

        ⑦ 在小時(shí)或分鐘設(shè)置狀態(tài),按UP或DOWN,對(duì)應(yīng)的小時(shí)或分鐘加1或減1,小時(shí)變化范圍是0~23,分鐘變化范圍是0~59。

        1.2硬件設(shè)計(jì)

        ① 搭建一個(gè)51單片機(jī)的最小系統(tǒng),具體方案請(qǐng)參照所選芯片的數(shù)據(jù)手冊(cè)。

        ② 添加4個(gè)數(shù)碼管及相應(yīng)的驅(qū)動(dòng)電路到系統(tǒng),采用動(dòng)態(tài)刷新方式,分配4個(gè)單片機(jī)I/O口連接到數(shù)碼管片選,分配8個(gè)I/O口連接到數(shù)碼管段碼。

        ③ 添加3個(gè)按鍵及相應(yīng)的電路到系統(tǒng),分配單片機(jī)3個(gè)I/O口連接到按鍵輸入。

        1.3軟件設(shè)計(jì)

        使用QP_nano,最重要的是劃分活動(dòng)對(duì)象[1],不同的活動(dòng)對(duì)象負(fù)責(zé)不同的處理功能。每個(gè)活動(dòng)對(duì)象都是一個(gè)狀態(tài)機(jī)[1],某一時(shí)刻只能處在一個(gè)狀態(tài)?;顒?dòng)對(duì)象和活動(dòng)對(duì)象之間通過(guò)事件[1]通信,活動(dòng)對(duì)象可以發(fā)送或處理事件。處理事件包括改變狀態(tài)、調(diào)用一些硬件驅(qū)動(dòng)函數(shù)等。使用QP_nano開發(fā)單片機(jī)應(yīng)用的過(guò)程一般包括劃分活動(dòng)對(duì)象、定義事件信號(hào)和編寫活動(dòng)的狀態(tài)處理函數(shù)等。

        1.3.1劃分活動(dòng)對(duì)象

        根據(jù)系統(tǒng)功能分解出3個(gè)活動(dòng)對(duì)象:Display、Counter和Keyboard。其中,Display負(fù)責(zé)刷新數(shù)碼管顯示,Counter負(fù)責(zé)時(shí)鐘計(jì)時(shí)和設(shè)置,Keyboard負(fù)責(zé)掃描鍵盤。

        在動(dòng)態(tài)刷新方式下,Display每隔一個(gè)Tick(系統(tǒng)嘀嗒)都要刷新一次,而Counter僅需要一個(gè)慢速時(shí)鐘驅(qū)動(dòng),且與Display有共享顯示緩沖區(qū)的需求,為簡(jiǎn)化實(shí)現(xiàn),將Counter活動(dòng)嵌套到Display內(nèi)部,構(gòu)成層次嵌套關(guān)系。因此,定義Display和Keyboard兩個(gè)活動(dòng)即可,代碼如下:

        typedef struct Display {

        QActive super;

        uint32_t counter;

        uint16_t refreshingCtr;

        uint16_t countingCtr;

        uint8_t buf[4];

        } Display;

        typedef struct Keyboard {

        QActive super;

        } Keyboard;

        其中,super表示活動(dòng),Display和Keyboard擴(kuò)展(繼承)了活動(dòng),因此可以使用向下轉(zhuǎn)型(down_cast)的方式,擁有活動(dòng)的響應(yīng)事件等功能;counter為時(shí)鐘的秒計(jì)數(shù)變量;refreshingCtr對(duì)刷新次數(shù)進(jìn)行計(jì)數(shù),每隔250個(gè)計(jì)數(shù)周期給Display活動(dòng)發(fā)送計(jì)數(shù)信號(hào);countingCtr用于對(duì)計(jì)數(shù)信號(hào)進(jìn)行統(tǒng)計(jì),計(jì)滿4個(gè)counter加1,表示時(shí)鐘前進(jìn)1 s;buf表示時(shí)鐘顯示的緩沖區(qū)。

        1.3.2定義用戶信號(hào)

        用戶信號(hào)用來(lái)標(biāo)記事件的類型,即確定事件的含義。數(shù)字時(shí)鐘共定義了4個(gè)信號(hào),代碼如下:

        enum ClockSignals {

        CLOCK_COUNT_SIG = Q_USER_SIG, //計(jì)數(shù)信號(hào)

        CLOCK_SET_SIG, //設(shè)置信號(hào)

        CLOCK_UP_SIG, //加信號(hào)

        CLOCK_DOWN_SIG, //減信號(hào)

        };

        1.3.3活動(dòng)順序圖

        QP_nano活動(dòng)之間的通信關(guān)系,用UML順序圖描述。數(shù)字時(shí)鐘的順序圖如圖1所示,QP_nano每隔一個(gè)Tick(配置為1 ms)發(fā)送一個(gè)TIME_OUT事件(系統(tǒng)保留)給Keyboard和Display;Keyboard每計(jì)滿10個(gè)TIME_OUT,掃描一次鍵盤,連續(xù)兩次發(fā)現(xiàn)有鍵按下就發(fā)送對(duì)應(yīng)的鍵盤事件給Display;Display每收到一個(gè)TIME_OUT就刷新一次數(shù)碼管,并同時(shí)對(duì)該事件計(jì)數(shù),計(jì)滿250個(gè)后給自身發(fā)送CLOCK_COUNT事件,并更新一次顯示緩沖區(qū),如果在計(jì)時(shí)狀態(tài),累加4次后,時(shí)鐘變量加1 s;如果在設(shè)置狀態(tài),則切換消隱(清空顯示緩沖區(qū))和正常顯示,實(shí)現(xiàn)閃爍功能(為簡(jiǎn)便起見,信號(hào)末尾未加_SIG,下同)。

        圖1 活動(dòng)順序圖

        1.3.4活動(dòng)狀態(tài)圖

        活動(dòng)和活動(dòng)之間的通信關(guān)系由活動(dòng)順序圖展現(xiàn),而活動(dòng)內(nèi)部的狀態(tài)及運(yùn)行情況則通過(guò)UML狀態(tài)圖描述。

        圖2 Keyboard狀態(tài)圖

        活動(dòng)Keyboard的狀態(tài)圖如圖2所示,Scanning狀態(tài)用于掃描鍵盤,Keyboard由初始狀態(tài)轉(zhuǎn)換到該狀態(tài)后,一直運(yùn)行于該狀態(tài)。

        圖3 Display狀態(tài)圖

        活動(dòng)Display的狀態(tài)圖如圖3所示,Refreshing狀態(tài)用于刷新數(shù)碼管,Counting狀態(tài)用于時(shí)鐘計(jì)數(shù),Set_Hour狀態(tài)用于調(diào)整小時(shí),Set_Min狀態(tài)用于調(diào)整分鐘;Display從初始狀態(tài)進(jìn)入Refreshing狀態(tài),又繼續(xù)進(jìn)入Counting狀態(tài);在Counting狀態(tài)、Set_Hour狀態(tài)和Set_Min狀態(tài)下,若收到TIME_OUT事件,則自動(dòng)返回到Refreshing狀態(tài)處理。

        1.3.5編寫活動(dòng)的狀態(tài)處理函數(shù)和硬件驅(qū)動(dòng)函數(shù)

        活動(dòng)狀態(tài)圖中的每一個(gè)狀態(tài)都對(duì)應(yīng)一個(gè)狀態(tài)處理函數(shù)處理事件,如Keyboard的Scanning狀態(tài)響應(yīng)TIME_OUT事件(計(jì)數(shù)滿10個(gè),調(diào)用鍵盤掃描函數(shù)),Display的Counting狀態(tài)響應(yīng)CLOCK_SET事件(轉(zhuǎn)換到Set_Hour狀態(tài))。

        硬件驅(qū)動(dòng)函數(shù)用來(lái)初始化和控制外設(shè),本測(cè)試中定義了bsp_init()、bsp_keyboard()和bsp_display()三個(gè)硬件相關(guān)函數(shù)。其中,bsp_init()用于初始化芯片時(shí)鐘、鍵盤和顯示I/O口狀態(tài),在啟動(dòng)QP_nano運(yùn)行前調(diào)用;bsp_keyboard()用于鍵盤掃描,即讀取鍵盤I/O口的狀態(tài),在Keyboard的Scanning狀態(tài)調(diào)用;bsp_display()用于刷新一位數(shù)碼管,在Display的Refreshing狀態(tài)調(diào)用。

        1.3.6主程序

        基于QP_nano的主程序簡(jiǎn)單,只需調(diào)用活動(dòng)的構(gòu)造函數(shù)及硬件初始化函數(shù),然后啟動(dòng)QP_nano內(nèi)核即可。數(shù)字時(shí)鐘的主程序如下:

        intmain(void) {

        Display_ctor();

        Keyboard_ctor();

        bsp_init();

        return QF_run();

        while(1);

        }

        1.3.7文件部署

        數(shù)字時(shí)鐘的文件部署如下(.表示項(xiàng)目路徑,main()函數(shù)在clock.c定義):

        ./boot/startup.a51

        ./bsp/bsp.c,bsp_display.c,bsp_keyboard.c,bsp.h,bsp_display.h,bsp_keyboard.h

        ./nano_51/qepn.c,qfn.c,qepn.h,qfn.h,qassert.h

        ./obj

        ./usr/clock.uvproj,qpn_port.h,clock.c,display.c,keyboard.c,clock.h,display.h,keyboard.h

        最后編譯結(jié)果顯示,ROM空間使用約11 KB,RAM空間使用約170 B。

        2移植QP_nano到Keil C51

        2.1獲取QP_nano的代碼文件

        訪問(wèn)網(wǎng)站http://www.state-machine.com/psicc2/,點(diǎn)擊 QP_nano的資源鏈接,轉(zhuǎn)到sourceforge網(wǎng)站下載安裝文件或壓縮包(本文使用的是2014年發(fā)布的5.3.0版),安裝或解壓的默認(rèn)路徑是c:qp。需要移植的文件包括:

        ① qpn_port.h:QP_nano和平臺(tái)相關(guān)的聲明,都要在此文件聲明(如QP_nano使用的數(shù)據(jù)類型,typedef int int16_t)或包含(如#include "qassert.h")。在安裝例程位置拷貝一個(gè)做模版,比如C:qpqpnexamplesmsp430iarlinky_eZ430qpn_port.h。

        ② qp_nano的實(shí)現(xiàn)頭文件:QP_nano的實(shí)現(xiàn)聲明,位于C:qpqpninclude目錄下,包括qassert.h、qepn.h、qfn.h、和qkn.h。

        ③ qp_nano的實(shí)現(xiàn)文件:QP_nano的實(shí)現(xiàn)代碼,位于C:qpqpnsource目錄下,包括qepn.c、qfn.c、qfn_init.c和qkn.c。

        2.2Keil配置

        2.2.1修改啟動(dòng)文件STARTUP.A51

        本文測(cè)試使用外部RAM作為可重入堆棧,需對(duì)啟動(dòng)文件做如下配置:

        ① XDATALEN:外部RAM的尺寸,與所選芯片匹配,如果是1 KB, 則為3FFH;

        ② XBPSTACK:設(shè)為1,標(biāo)記外部RAM作為可重入堆棧;

        ③ XBPSTACKLEN:配置堆棧棧頂,與芯片匹配,如果是1 KB,則為3FFH+1;

        2.2.2菜單配置

        ① 在目標(biāo)配置窗口目標(biāo)選項(xiàng)卡(Flash->Configure-Target)選擇內(nèi)存模型為大模式。

        ② 在目標(biāo)配置窗口C51選項(xiàng)卡,添加包含文件的路徑(根據(jù)文件部署添加)。

        2.3QP_nano文件調(diào)整

        由于部分函數(shù)傳遞參數(shù)較多,必須加reentrant關(guān)鍵字,告訴編譯器要使用堆棧傳遞參數(shù)。為了減輕工作量,本文測(cè)試中所有函數(shù)的聲明和定義都添加了reentrant關(guān)鍵字。

        2.4實(shí)現(xiàn)QP_nano平臺(tái)相關(guān)函數(shù)

        QP_nano只需要平臺(tái)提供幾個(gè)函數(shù)就可以工作了,本文測(cè)試創(chuàng)建了一個(gè) bsp.c文件來(lái)實(shí)現(xiàn)這些函數(shù),內(nèi)容包括:

        ① 定時(shí)器中斷函數(shù):用來(lái)調(diào)用QP_nano的Tick函數(shù)QF_tickXISR(0),驅(qū)動(dòng)QP_nano工作。

        ② 啟動(dòng)QP_nano框架的函數(shù)void QF_onStartup(void):在該函數(shù)中啟動(dòng)定時(shí)器。

        ③ 空閑函數(shù)void QF_onIdle(void):沒有事件發(fā)生時(shí)被框架調(diào)用。

        ④ QP_nano的斷言函數(shù) void Q_onAssert():打印出錯(cuò)信息,并停止程序運(yùn)行。

        2.5demo的文件部署

        本文仿照qpn提供的一個(gè)demo例程blinky(模擬發(fā)光二極管以1 Hz頻率閃爍),移植到Keil C51后的文件部署如下所示(.表示項(xiàng)目路徑,main()函數(shù)位于blinky.c):

        ./nano/qepn.c, qfn.c

        ./include/qassert.h,qepn.h,qfn.h,qkn.h

        ./user/blinky.uvproj, blinky.c,bsp.c,startup.a51, blinky.h, bsp.h, qpn_port.h

        ./obj

        2.6編譯結(jié)果

        blinky移植成功后,編譯結(jié)果顯示,ROM空間使用約9 KB,RAM約120 B。

        結(jié)語(yǔ)

        參考文獻(xiàn)

        [1] Miro Samek.Practical UML STATECHARTS in C/C++,Event-Driven Programming for Embedded Systems[M].Second Edition.Amstel dam:Elsevier Inc,2008.

        張東杰(工程碩士),研究方向?yàn)橹悄軆x器;王俊璞(助理研究員),研究方向?yàn)閷?dǎo)航制導(dǎo)與控制。

        Atmel攜手Intel 提升物聯(lián)網(wǎng)應(yīng)用安全水平

        Atmel公司與英特爾公司合作,推出更加安全的物聯(lián)網(wǎng)(IoT)應(yīng)用。通過(guò)此次合作,Atmel將在所有Atmel SmartConnect無(wú)線解決方案中支持英特爾增強(qiáng)隱私身份(Intel EPID)技術(shù)。隨著物聯(lián)網(wǎng)市場(chǎng)的迅猛發(fā)展,智能聯(lián)網(wǎng)設(shè)備數(shù)量不斷增加,在物聯(lián)網(wǎng)節(jié)點(diǎn)與云之間實(shí)現(xiàn)相互身份驗(yàn)證,提升云部署的安全性變得日益重要。

        到2020年,全球聯(lián)網(wǎng)設(shè)備數(shù)量將達(dá)到數(shù)百億臺(tái)。為了在邊緣節(jié)點(diǎn)與云之間達(dá)成無(wú)縫連接,安全成為其中一項(xiàng)關(guān)鍵因素。為此,Atmel提供了完整的物聯(lián)網(wǎng)解決方案,整合了Atmel|SMART微控制器(MCU),支持Wi-Fi、802.15.4和藍(lán)牙的Atmel SmartConnect無(wú)線技術(shù)以及Atmel的安全產(chǎn)品。與英特爾的攜手合作,使得采用Atmel無(wú)線解決方案的開發(fā)者可以在自己的解決方案當(dāng)中應(yīng)用值得信任的英特爾EPID身份識(shí)別標(biāo)準(zhǔn)。Atmel公司副總裁兼無(wú)線解決方案部門總經(jīng)理Kaivan Karimi表示:“英特爾EPID技術(shù)的應(yīng)用,為物聯(lián)網(wǎng)設(shè)計(jì)者提供了一個(gè)真正無(wú)縫的邊緣節(jié)點(diǎn)對(duì)云物聯(lián)網(wǎng)平臺(tái)。該平臺(tái)具有值得信賴的安全性能,并且擁有Atmel廣泛的物聯(lián)網(wǎng)產(chǎn)品組合。Atmel的SmartConnect無(wú)線和物聯(lián)網(wǎng)解決方案從現(xiàn)在起可以支持英特爾EPID技術(shù),該技術(shù)的安全性已經(jīng)在過(guò)去5年得到了充分驗(yàn)證?!?/p>

        英特爾EPID是一項(xiàng)用于身份驗(yàn)證和隱私保護(hù)的ISO標(biāo)準(zhǔn),該標(biāo)準(zhǔn)自2011年以來(lái)一直運(yùn)用于英特爾平臺(tái)。這項(xiàng)技術(shù)能夠提供硬件可信根,并兼容公鑰基礎(chǔ)設(shè)施(PKI)。采用英特爾EPID技術(shù),設(shè)備身份將可得到驗(yàn)證,并在經(jīng)過(guò)驗(yàn)證的設(shè)備之間建立安全的通信鏈路。并且,可在避免暴露具體平臺(tái)身份的條件下確定設(shè)備組成員身份,再添一層安全保護(hù)。同時(shí),英特爾EPID技術(shù)還可以動(dòng)態(tài)分配取消單個(gè)組成員身份,且符合內(nèi)容和數(shù)據(jù)保護(hù)協(xié)議對(duì)保護(hù)密鑰傳送的最新要求。

        Porting and Application of Embedded Frame QP_nano on 51 MCU

        Zhang Dongjie,Wang Junpu

        (Department of Instrument Science and Engineering,Shanghai Jiao Tong University,Shanghai 200240,China)

        Abstract:This article introduces QPnano to MCU,which is a light weight software framework.Firstly,taking a simple digital clock design as an example,the process of develement using QPnano is described,then the porting QPnano to Keil C51 is described in detail.So some classic software concepts and technologies such as object oriented programming,event driven and state machine are brought into the software development of MCU naturally.

        Key words:QPnano;event driven;state machine;software framework;MCU

        收稿日期:(責(zé)任編輯:薛士然2015-05-12)

        中圖分類號(hào):TP368

        文獻(xiàn)標(biāo)識(shí)碼:A

        猜你喜歡
        狀態(tài)機(jī)
        FPGA狀態(tài)機(jī)綜合可靠性探究 ①
        基于有限狀態(tài)機(jī)的交會(huì)對(duì)接飛行任務(wù)規(guī)劃方法
        基于Spring StateMachine的有限狀態(tài)機(jī)應(yīng)用研究
        三段式狀態(tài)機(jī)在單片機(jī)中的實(shí)現(xiàn)
        基于單片機(jī)運(yùn)行的多線程任務(wù)狀態(tài)機(jī)
        基于狀態(tài)機(jī)比對(duì)的狀態(tài)機(jī)推斷方案
        江蘇通信(2015年5期)2015-03-16 01:16:51
        雙口RAM讀寫正確性自動(dòng)測(cè)試的有限狀態(tài)機(jī)控制器設(shè)計(jì)方法
        FPGA設(shè)計(jì)中狀態(tài)機(jī)安全性研究
        基于反熔絲FPGA的有限狀態(tài)機(jī)加固設(shè)計(jì)
        μC/OS 的層次式狀態(tài)機(jī)在人機(jī)界面中的應(yīng)用
        精品久久亚洲中文字幕| 日本专区一区二区三区| 日本高清不卡一区二区三区| 国产三区三区三区看三区| 九九影院理论片私人影院| 欧美人与动牲猛交xxxxbbbb| 97日日碰日日摸日日澡| 国产午夜精品av一区二区三| 日出白浆视频在线播放| 人人爽久久涩噜噜噜av| 精品国产av无码一道| 国产精品黄页免费高清在线观看| 久久精品免费中文字幕| 国产国拍精品av在线观看按摩| 久久久精品国产亚洲AV蜜| 漂亮人妻被强中文字幕乱码 | 又色又爽又黄又硬的视频免费观看| 妺妺窝人体色www在线直播| 日本久久黄色高清视频| 亚洲av无码国产精品久久| 中文无码乱人伦中文视频在线v| 久久免费观看国产精品| 成人在线观看视频免费播放| 国产欧美日韩va另类在线播放| 精品无码国产自产野外拍在线| 91久久国产情侣真实对白| 人妻少妇被粗大爽视频| 99精品国产丝袜在线拍国语| 国产一区二区波多野结衣| 久久一二三四区中文字幕| 婷婷久久国产综合精品| a级毛片无码免费真人| 国产主播无套内射一区| 日本免费视频一区二区三区| 又爽又黄又无遮挡网站| 一本久道久久综合婷婷五月| 亚洲av中文字字幕乱码| 手机在线看片| 亚洲 欧美 激情 小说 另类 | 亚洲av综合一区二区在线观看| 开心婷婷五月激情综合社区|