《電子技術應用》
您所在的位置:首頁 > 其他 > 業界動態 > GCC編譯器在DCS組態軟件中的應用

GCC編譯器在DCS組態軟件中的應用

2008-03-26
作者:劉金龍

摘? 要:本文介紹了ConMaker編譯功能的設計與實現,對ConMaker編譯器的各個子模塊的實現分別進行了說明,闡述了如何應用GCC實現ConMaker的編譯功能。

關鍵詞:DCS,GCC,編譯,編譯器

?

??? 北京和利時系統工程股份有限公司是以工業過程控制為基礎的企業,公司2001年從德國3S公司引進了控制編程軟件CoDeSys。實踐證明,CoDeSys是一款符合IEC61131-3標準的、功能強大、運行效率較高的算法組態軟件" title="組態軟件">組態軟件。但是CoDeSys也存在著不足之處,如對組態人員計算機素質要求較高,缺少參數回讀等DCS系統必備的功能。另外,由于知識產權保護等各方面原因,包括CoDeSys在內幾乎所有商業化工業組態軟件的源碼都不公開,這在很大程度上制約了和利時公司在CoDeSys基礎上進一步改進和完善的空間,從而限制了公司產品發展的可持續性。

為了提高組態軟件的持續改進能力,實現控制組態軟件的完全自主化,增強企業的核心競爭力,和利時公司自主研發了適合DCS工程需求的自主化組態軟件ConMaker。

1? ConMaker系統介紹

ConMaker從可用性與易用性兩方面考慮,在結合和利時公司以往使用與開發DCS系統的經驗,借鑒國外先進工控軟件優點的基礎上開發的新一代組態工具。ConMaker系統分為4個主要部分:

(1)???? 算法編輯界面

??? 算法編譯界面包括圖3-2-1中的算法編輯(ST, CFC, LD)、變量定義、硬件配置和庫管理器。用戶可以通過ConMaker友好的編輯界面,使用IEC61131-3標準中定義的語言進行工藝算法邏輯的編寫、工程任務的配置、DP等硬件的配置及工程輔助信息的填寫。

(2)???? 編譯與執行

??? 編譯與執行部分包括預編譯和編譯。編輯好的組態算法通過ConMaker編譯模塊進行編譯。編譯過程先檢查組態算法的邏輯錯誤,在進行組態的預編譯和編譯、鏈接、裝載和代碼整理,最后根據配置文件生成特定格式的二進制代碼。編譯模塊配合通訊模塊可實現組態工程的全下裝、增量下裝、強制、參數回讀等功能。

(3)???? 通訊與在線監視

??? 通訊與在線監視部分包括參數回讀、下裝、在線、網絡變量和通訊。ConMaker的通訊模塊可將編譯好的二進制代碼下裝到控制器上,并可周期讀取監控點的實時值。ConMaker通訊模塊還可以對監控的組態工程進行在線操作,如寫變量、強制、任務啟停等。

(4)???? 系統框架程序

ConMaker通過系統框架程序對各ConMaker模塊進行統籌管理,處理模塊間的消息傳遞。此外,ConMaker系統還提供了日志記錄、用戶管理、權限控制和支持主要功能點的快捷鍵操作等輔助功能,方便用戶對組態工程進行操控和管理。

2? ConMaker編譯功能的需求與分析

2.1? 編譯模塊功能需求

ConMaker的編譯功能需要實現,對預編譯模塊從用戶組態的IEC算法轉換得到的邏輯等價的C語言描述文件進行編譯,生成二進制文件。具體實現的主要功能點有:

(1)????? ConMaker編輯界面定義的變量要分配在特定的內存相對地址上。

(2)????? ConMaker支持任務調用、過程調用、函數調用和功能塊調用。

(3)????? 某站編譯成功后ConMaker會輸出該站的本次編譯相關信息。編譯相關信息包括:工程大小(PRG文件大?。?、共有多少個POU參與編譯、分配在各內存區域的變量所占空間、網絡變量數目、有參數回讀屬性變量所占空間等。

(4)????? 編譯并下裝后的進行在線監視時可以進行讀寫變量、強制和強制釋放等操作。

(5)????? 編譯、下裝、強制、寫入等操作要記錄日志。

2.2? 編譯模塊需求分析

下面對ConMaker編譯功能的需求逐條分析,達到對ConMaker編譯模塊的詳細理解和剖析。

(1)???????? 由于ConMaker需要和RTS搭配使用,RTS中對下裝工程的變量所在的內存區域進行了限制,在RTS中變量分為Memory、Input、Output、RetainGlobal五類,各類所屬內存彼此獨立,互相不重疊。在編譯過程中需要按照預編譯階段已經指定好的各個變量的相對偏移,將各變量分配到指定的相對地址上。

(2)???????? 由于RTS采用函數指針列表的方式來實現函數的調用和訪問,所以在控制器上最終運行的機器碼只能只用函數相對地址調用的方式來實現。這就要求對C文件初步編譯生成匯編語言描述的.s文件進行二次處理,提取出其中函數訪問的部分,然后按照函數指針列表中的相對地址更新.s文件中函數調用部分(x86call***語句),并對函數返回值部分的指令做相應處理。

(3)???????? 為實現ConMaker的強制功能,需要借助強制信息文件來記錄ConMaker中變量強制相關的信息。強制信息文件中包含PRG文件中可能會被真正強制的每一個變量的賦值語句的機器碼信息。

2.3? 選擇開源" title="開源">開源編譯器

ConMaker開發的關鍵技術之一就是編譯功能的實現。由于編譯器開發的代價太高,出于成本和風險控制的考慮,在現有情況下可以利用開源的編譯器來實現ConMaker編譯功能,借助于開源編譯器實現ConMaker編譯功能積累的經驗,對以后自主開發安全級編譯器也可起到很好的借鑒和幫助作用。

在選擇開源編譯器時ConMaker重點考慮編譯器生成目標代碼的正確性、目標代碼的高效性和編譯過程所用的時間?,F在較常用的開源編譯器有20多種,大多是由國外的高校和開源組織開發的。其中GCC是目前公認的最穩定、高效的開源編譯器,運行速度快,可實現多種高級語言、多種目標代碼的交叉編譯,最重要的一點是使用GCC的項目和程序員非常多,經過反復的測試、應用和維護,GCC的正確性有了很好的保證。鑒于以上的情況,ConMaker選用開源編譯器GCC來實現其編譯功能。

3? ConMaker編譯功能的設計與實現

3.1? 編譯模塊體系結構設計與子模塊劃分

ConMaker的系統結構圖(圖4-1)中可看到,編譯模塊位于ConMaker的底層,主要與預編譯模塊和通訊模塊交互。編譯模塊中編譯預處理相關的操作與預編譯有緊密聯系,編譯后生成的PRG文件通過通訊模塊實現控制器下裝。

ConMaker編譯模塊的內部,大體上可劃分為5個子模塊:

[1]????? 初始化處理模塊;

[2]????? 編譯預處理模塊;

[3]????? 編譯處理模塊;

[4]????? 相關配置數據生成模塊;

[5]????? 相關文件生成模塊。

ConMaker編譯器的子模塊劃分如圖4-1所示。

?

4-1ConMaker編譯器子模塊邏輯圖

3.1.1? 初始化子模塊

初始化子模塊主要完成兩個功能,一是用來實現通過ConMaker的配置文件(Target文件)對編譯模塊進行相關數據和編譯選項的設置;二是生成根據編譯配置生成一些獲取工程標識號等ConMaker中必須有且功能固定的函數的二進制機器碼。

3.1.2? 編譯預處理子模塊

編譯預處理主要設置函數表信息和生成工程變量賦初值的二進制機器碼。

函數表信息包括工程中涉及到的每一個可能被調用的函數名稱、函數索引值、函數類型、函數代碼長度等信息。

由于ConMaker預編譯模塊生成的C文件中不包括各變量的初始化部分代碼,因此要實現變量賦初值需要額外生成賦初值的機器碼和重定位" title="重定位">重定位數據,這部分代碼是無法借助GCC實現的。編譯預處理子模塊根據ConMaker預編譯模塊提供的變量表結合CPU類型生成變量賦初值的機器碼。

3.1.3? 編譯處理子模塊

編譯處理子模塊是ConMaker編譯的核心。經過前期的準備和預處理,對ConMaker組態算法邏輯等價的C文件進行編譯,這里需要ConMaker預編譯模塊保證C語言描述文件的詞法、語法和語義的正確性。

由于在編譯的過程中,需要調用GCC進行編譯,當GCC編譯結束后ConMaker才能進行后續處理,因此需單獨啟用一個進程完成GCC的調用,當GCC執行結束后ConMaker進行后續的處理,在GCC執行過程中ConMaker其它進程都處于等待狀態。

整個編譯過程分多步進行,包括匯編-〉修改匯編代碼-〉編譯-〉鏈接等。具體的處理過程如下:

3.1.3.1? 生成匯編文件

調用GCC編譯C文件生成匯編文件。從C文件到匯編文件的生成對編譯器而言是非常重要的一步,GCC在編譯C文件到匯編文件的過程中進行了詞法檢查、語法檢查、語義分析檢查、中間代碼生成、中間代碼優化和目標代碼生成幾步關鍵處理,首先將C文件經過前端處理生成抽象語法樹AST(Abstract Syntax Tree),然后轉換成中間代碼的表示形式RTS(Register Transfer Language),最后經代碼生成器生成最終的匯編語言描述文件。

3.1.3.2? 修改匯編文件

修改匯編代碼。如前文系統分析中提到的,要使GCC編譯生成的匯編文件能符合ConMaker 的編譯要求,需要修改匯編文件中函數調用語句的匯編代碼。

由于C語言的編譯和鏈接乃至運行過程中發生的與編譯相關的錯誤大多與函數調用約定(Call Convertion)有關,所以這里我們對使用GCC的編譯方式和C文件的語法的限定作相關說明,保證ConMaker編譯、鏈接生成的目標代碼的正確性,因此ConMaker需要修改GCC編譯生成的匯編文件中所有“call _函數名”格式的指令。

3.1.3.3 ?生成未重定位目標代碼

調用GCC編譯修改后的匯編文件生成未重定位的目標代碼。從匯編語言到機器語言的轉換主要工作是由匯編器完成的。GCC后臺調用的匯編器是asas可編譯GCC生成的AT&T格式匯編語言得到目標代碼,另外as可在生成的目標代碼中包含被編譯程序的符號表,這可是ConMaker編譯模塊以后實現組態工程的調試功能打下基礎。

3.1.3.4? 連接

連接是編譯過程中很重要的一個環節,連接負責的工作是為程序分配相關的地址和完成重定位以使編譯的程序可以在目標機器上運行。在連接的過程中涉及到一些與其相關的概念。

重定位:編譯器和匯編其一般在建立目標代碼文件的時候都令程序的地址從零開始,但很少有計算機允許你將你的程序加載" title="加載">加載到零地址。如果一個程序由多個子程序組成,所有的子程序必須被加載到不交叉的地址中。重定位就是為程序的各個部分分配加載地址,并調整程序的代碼和數據以反映已分配的地址的過程。在很多系統中,重定位發生不止一次。一個連接器從多個子程序建立一個程序并且從零開始連接輸出程序非常常見,多個子程序會重定位到大程序中的指定位置。之后在程序加載時,系統會決定實際的地址,連接后的程序會作為一個整體重定位到加載地址。

符號確定:當一個程序由多個子程序構成時,一個子程序對其他子程序的引用由符號(symbol)完成;一個主程序可能要用到一個稱為sqrt的平方根例程,而數學庫中定義了sqrt。連接器通過計算sqrt在庫中分配的位置并根據調用者的目標代碼來修正這個位置,最后給call指令提供正確的地址。

加載:指將程序從其它存儲器復制到內存中,另外還進行系統保護設置和將虛擬內存地址映射到磁盤頁上等工作。

可完成連接功能的軟件稱為連接器,GCC使用的連接器是ld。像通常的連接器一樣,ld通過兩遍連接來完成連接工作的,以未重定位的目標文件和連接腳本、調用命名參數為輸入,生成最終的目標文件和其它輔助信息。

ld的第一遍連接運行時,先掃描輸入文件,以確定輸出目標代碼中各段(Segment)的大小,收集所有符號的定義和引用,之后,ld建立一個輸入文件的框架圖并記錄輸入文件中包含的所有段信息和輸入文件的符號表。經過第一遍的連接,ld可根據連接腳本文件為符號表中的需要地址分配的變量分配數值地址,確定輸出文件中包含的段及各段的大小和位置,最后標記出輸出文件所包含的內容。

ld第二遍連接使用了第一遍所收集的信息,用以確定實際的連接過程。它讀取并重定位目標代碼,用符號引用來替換數值地址,并調整代碼和數據中的內存地址以反映重定位段地址,最后將從定位代碼寫入到輸出文件中。接下來它寫出這個輸出文件,通常還要加上頭信息、重定位段和符號表信息。如果程序使用了動態連接,符號表還要包含能夠提供信息以供運行時連接器確定動態符號所需。在很多情況下,ld本身會在輸出文件中產生少量的代碼或數據,諸如用于在復用或動態連接庫中調用例程的“粘貼代碼(glue?code)”,或者指向用于在程序開始時執行的初始化例程的指針數組。

不論程序是否使用動態連接,輸出文件中都會包含一個符號表用以重新連接或調試,這個符號表并不會有程序本身使用,但是其他處理輸出文件的程序可能會用到。

ld工作的核心是重定位和代碼修正。為重定位目標代碼中的代碼所使用的數據和定義的代碼通常是從0開始的,要使這些代碼被目標機器運行需要進行重定位和修正目標代碼以反映實際情況的地址分配。在連接過程中,一些指針等數據和指令也可能會進行重定位,所以代碼修正不僅影響到具體的某些指令,目標文件的數據部分中的所有指針可能都同時需要調整。

ConMaker編譯模塊中,變量分為多種類型,不同類型變量分配的地址空間也不一樣,可通過連接腳本來進行具體控制。

3.1.4? 配置數據生成子模塊

ConMaker編譯組態工程最后生成的二進制文件中包含了一些工程配置信息,如組態工程中的硬件配置信息和任務配置信息、I/O點信息的數據都由配置數據生成子模塊實現。這些數據主要以信息說明為主,不包含組態邏輯部分。

任務配置信息的數據按照組態工程中設置的任務信息填充,包括任務數、任務名、任務周期、調用方式、看門狗設置等按固定的格式組織,以二進制數據形式存放在CI文件中。

ConMaker的硬件配置在硬件配置模塊處理,生成二進制格式數據,在編譯過程中被編譯模塊的配置數據生成子模塊獲取填入到CI文件中。

I/O點信息數據是組態中參與運算的I/O點的描述信息,只有添加描述信息的I/O點才可能在實際的數據采集和輸出中起作用。

3.1.5? 相關文件生成子模塊

在編譯的過程中需要生成一些相關文件,這些文件的生成過程貫穿整個編譯模塊,包括最終需要的PRG文件、FV文件等與通訊相關的磁盤文件和一些編譯過程中產生的臨時文件。下文中將重點介紹ConMaker生成的磁盤文件的過程及各文件的作用。

ConMaker在編輯和預編譯階段將組態工程的邏輯轉換成C語言的描述形式,將其保存在C文件中,文件的內容大多采用ANSI C89語法規定的規則描述,唯一的區別是C文件中采用了GCCC語言擴充的_attribute_屬性,這使得ConMaker預編譯生成的C語言文件不能用其它編譯器編譯。

ConMaker在編譯階段以C文件為輸入通過調用GCC及整理數據得到編譯的臨時文件.asd,如果用戶此時選擇對ConMaker編譯結果進行保存則編譯模塊會將.asd文件轉換成編譯信息文件.ci,之后整理ci文件的內容生成PRG文件。對于工程組態中定義的所有變量類型和每個變量的具體信息,編譯模塊將其統一記錄在符號表文件.SDB 中。

ConMaker編譯成功后,這時用戶可通過ConMaker的通訊模塊來操作PRG文件進行下裝和在線的操作,如果進行了組態工程的下裝,通訊模塊會根據本次下裝的PRG文件經過處理后生成下裝信息文件.di,di文件將記錄下本次下裝所有的信息,包括控制器的IP地址、下裝的工程標識及工程的組態信息等。另外,通訊模塊在下裝后會將強制臨時文件轉換成強制信息文件.fv,在下裝后才進行強制信息文件的生成可以減少編譯執行的時間。由于ConMaker支持增量下裝的功能,所以在每次編譯生成PRG文件后,編譯模塊會比較ci文件和di文件的數據并以此判斷在下次可能進行的增量下裝時需要傳遞的通訊內容,將這些通訊內容保存在.OL文件中。

4? 總結

本文介紹了和利時自主研發的組態軟件ConMaker,對其編譯功能的需求進行了說明和分析,并對如何借助GCC實現ConMaker的編譯功能做了詳細介紹。通過一年半時間的預研和開發,經過初步測試,ConMaker編譯的工程運行快速、穩定,滿足實際應用的需要。

?

參考文獻

[1]????? Alfred V.Aho Ravi Sethi,Jeffrey D.Ullman著:Compilers : Principles Techniques and Tools,機械工業出版社,1987

[2]????? Andrew W.Appel,Maia Ginsburg著:Modern Compiler Implementation in C,人民郵電出版社,2000

[3]????? Brian W.Kernighan,Dennis M.Ritchi著:The C Programming Language? (2nd Edition),機械工業出版社,1991

[4]????? John E.Hopcroft,Rajeev Motwani,Jeffrey D.Ullman著:Introduction to Automata Theory Languages and Computation (2nd Edition)機械工業出版社,1990

[5]????? 沈美明,溫冬嬋著:80x86匯編語言程序設計,清華大學出版社,2001

[6]????? http://gcc.gnu.org/onlinedocs/gccint/

[7]?? GB/T 15969.3--2005/IEC 61131-3:2002
本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          在线观看国产成人av片| 国产精自产拍久久久久久蜜| 午夜精品久久久久久久99水蜜桃| 欧美在线啊v| 欧美二区在线| 亚洲日本激情| 国模私拍一区二区三区| 国产一区二区三区在线观看免费| 亚洲人成精品久久久久| 国产精品久久久久久久久久三级| 国产精品一区二区久激情瑜伽| 亚洲福利视频免费观看| 国产精品豆花视频| 午夜精彩国产免费不卡不顿大片| 欧美激情女人20p| 国产精品一区视频| 亚洲一区二区三区四区在线观看| 一本色道精品久久一区二区三区| 99精品国产热久久91蜜凸| 中文无字幕一区二区三区| 一区二区三区在线不卡| 影音先锋久久精品| 国产精品免费视频xxxx| 久久精品欧美日韩| 国产精品私拍pans大尺度在线| 亚洲毛片一区二区| 亚洲欧美在线高清| 欧美午夜视频网站| 欧美日韩国产经典色站一区二区三区| 欧美午夜宅男影院在线观看| 久久夜色精品一区| 亚洲男人的天堂在线aⅴ视频| 欧美色精品天天在线观看视频| 国产精品一区在线播放| 欧美精品在线一区| 国产精品入口日韩视频大尺度| 亚洲精品永久免费| 亚洲一区二区综合| 国产伦精品一区二区三区免费| 欧美一区免费| 亚洲高清在线观看| 欧美性理论片在线观看片免费| 欧美日韩国产不卡在线看| 亚洲午夜久久久久久尤物| 男人的天堂亚洲在线| 久久精品中文字幕一区二区三区| 国产精品久久久久一区二区三区| 亚洲人成绝费网站色www| 亚洲国产老妈| 亚洲精品免费在线播放| 狼人天天伊人久久| 在线成人免费观看| 久久久久久网址| 久久久www成人免费无遮挡大片| 亚洲第一福利视频| 欧美精品激情在线观看| 中文欧美字幕免费| 亚洲欧美激情视频| 欧美精品系列| 国产日韩精品视频一区| 亚洲一区二区三区在线看| 久久这里只有精品视频首页| 久久精品国产99国产精品| 亚洲高清一区二| 亚洲视频大全| 亚洲美女视频在线观看| 日韩午夜激情电影| 欧美亚洲尤物久久| 久久综合久久综合九色| 欧美激情综合亚洲一二区| 免费成人av| 欧美日韩一区二区三区在线观看免| 美女精品在线观看| 免费在线看一区| 欧美专区日韩视频| 欧美在线短视频| 老色鬼精品视频在线观看播放| 亚洲国产精品精华液网站| 亚洲综合成人婷婷小说| 韩国一区二区在线观看| 国内精品久久久久伊人av| 亚洲人成网站在线观看播放| 欧美日韩少妇| 这里只有精品电影| 亚洲小少妇裸体bbw| 亚洲一区二区在| 亚洲精品孕妇| 影音先锋国产精品| 国产精品欧美经典| 欧美午夜大胆人体| 国产一区二区三区奇米久涩| 亚洲一区二区在线免费观看视频| 国产精品电影观看| 欧美一级大片在线免费观看| 亚洲一区二区在线播放| 欧美一级二级三级蜜桃| 久久综合成人精品亚洲另类欧美| 日韩午夜在线观看视频| 在线免费观看成人网| 免费观看亚洲视频大全| 亚洲在线成人| 亚洲精品久久| 国产亚洲一级高清| 欧美一级视频免费在线观看| 国产一区二区精品丝袜| 欧美一乱一性一交一视频| 一本一本久久a久久精品综合妖精| 欧美性猛交xxxx免费看久久久| 久久精品国产精品亚洲综合| 欧美日韩精品高清| 欧美日韩亚洲国产一区| 国产精品视频网站| 黄色影院成人| 国产欧美韩日| 宅男噜噜噜66国产日韩在线观看| 亚洲国产一成人久久精品| 99re6热在线精品视频播放速度| 欧美乱妇高清无乱码| 狠狠综合久久av一区二区老牛| 午夜精品久久久久久99热软件| 久久久久久久久伊人| 亚洲免费激情| 国产精品一区久久久| 久久久久久夜精品精品免费| 久久久久九九视频| 亚洲高清激情| 牛牛国产精品| 国内一区二区在线视频观看| 久久精品人人做人人综合| 女同性一区二区三区人了人一| 欧美精品在线免费观看| 亚洲一二三区视频在线观看| 国产精品天美传媒入口| 国产精品永久免费观看| 在线观看日韩专区| 在线不卡a资源高清| 国产精品视频网址| 亚洲视频一二区| 亚洲国产精品久久久久婷婷884| 亚洲欧美伊人| 国产精品高潮粉嫩av| 午夜精品免费视频| 欧美精品在线观看91| 欧美1区免费| 欧美jizzhd精品欧美巨大免费| 久久久99爱| 国产精品高潮呻吟久久av无限| 欧美一区二视频在线免费观看| 欧美另类视频| 国产精品女同互慰在线看| 欧美精品黄色| 亚欧美中日韩视频| 在线免费观看日韩欧美| 久久免费精品日本久久中文字幕| 亚洲欧美福利一区二区| 欧美日韩国产一区精品一区| 国产日韩在线看| 影音先锋久久精品| 欧美成人自拍| 美女视频黄 久久| 国产精品久久久久久妇女6080| 亚洲七七久久综合桃花剧情介绍| 亚洲一区二区三区免费在线观看| 中日韩高清电影网| 欧美一级夜夜爽| 欧美va天堂va视频va在线| 国产精品一区一区三区| 国产亚洲精品综合一区91| 最近中文字幕mv在线一区二区三区四区| 国产精品久久久久久久久婷婷| 久久精品久久99精品久久| 欧美一区二区三区免费大片| 国产日韩一区二区三区| 亚洲免费在线电影| 黄色在线一区| 国产精品日韩欧美| 亚洲一区二区不卡免费| 国产人妖伪娘一区91| 久久av一区| 久久国产66| 极品少妇一区二区三区| 欧美三级乱码| 欧美日韩亚洲综合一区| 一区二区三区www| 欧美日韩精品一区视频| 久久久久久午夜| 亚洲国产欧美一区二区三区丁香婷| 欧美视频不卡| 欧美日韩少妇| 久久国产欧美日韩精品| 久热精品在线视频| 欧美日韩亚洲免费| 一本色道婷婷久久欧美| 亚洲国产欧美在线人成| 国产欧美婷婷中文| 免费试看一区| 欧美精品精品一区| 欧美极品在线视频| 欧美一区成人| 国产亚洲欧美一区二区| 国产精品一区免费观看| 欧美体内she精视频在线观看| 韩国美女久久| 国产裸体写真av一区二区| 亚洲免费视频一区二区| 国产精品乱码一区二三区小蝌蚪| 亚洲美女黄色片| 国产精品第十页| 久久久精品性| 99日韩精品| 欧美成人一二三| 一区在线影院| 久久伊伊香蕉| 99精品视频免费| 欧美日韩国产三级| 欧美伦理在线观看| 136国产福利精品导航网址| 欧美午夜电影一区| 久久国产主播| 欧美亚洲一区在线| 性欧美xxxx视频在线观看| 国产精品亚洲不卡a| 在线日韩av永久免费观看| 亚洲天堂第二页| 久久久久久91香蕉国产| 午夜精品电影| 欧美一区二区三区在线| 欧美岛国在线观看| 亚洲欧美在线x视频| 夜夜嗨av一区二区三区免费区| 欧美不卡在线| 久久精品国产久精国产思思| 狂野欧美激情性xxxx欧美| 日韩亚洲视频| 欧美日韩另类一区| 亚洲精品在线三区| 亚洲看片免费| 国产精品v欧美精品v日韩精品| 老司机免费视频一区二区三区| 欧美高清视频一区| 99精品欧美一区| 国产日韩欧美日韩| 在线免费观看日本一区| 国产精品高潮呻吟视频| 亚洲欧美日韩区| 欧美另类99xxxxx| 日韩视频在线观看免费| 国产香蕉97碰碰久久人人| 亚洲夜间福利| 国产一区亚洲一区| 免费在线欧美黄色| 欧美69视频| 国产欧美一区二区三区在线老狼| 韩国一区二区三区在线观看| 91久久久久久久久久久久久| 国产精品无码永久免费888| 国产欧美一区二区色老头| 久久一区二区三区四区| 日韩午夜三级在线| 国产一区二区三区四区在线观看| 久久成年人视频| 99爱精品视频| 欧美午夜宅男影院在线观看| 亚洲福利在线视频| 亚洲天堂男人| 久久中文在线| 欧美夫妇交换俱乐部在线观看| 欧美在线不卡视频| 欧美一区二区三区电影在线观看| 欧美精品久久久久久久久老牛影院| 国产精品美女一区二区在线观看| 亚洲精品久久久久中文字幕欢迎你| 久久久精品一区二区三区| 91久久午夜| 欧美丝袜第一区| 欧美欧美在线| 亚洲免费电影在线| 国产精品一二一区| 一区二区三区导航| 国产欧美一区二区精品忘忧草| 亚洲黄色在线| 免费不卡亚洲欧美| 欧美 日韩 国产精品免费观看| 国产婷婷97碰碰久久人人蜜臀| 亚洲欧美偷拍卡通变态| 亚洲在线视频| 欧美女同视频| 亚洲国产精品成人综合色在线婷婷| 国产精品高潮粉嫩av| 欧美日本在线播放| 欧美日韩hd| 亚洲天堂网站在线观看视频| 欧美激情综合网| 136国产福利精品导航网址应用| 亚洲高清av| 久久久精品视频成人| 欧美视频在线一区二区三区| 羞羞视频在线观看欧美| 亚洲人成网站777色婷婷| 欧美精品激情blacked18| 亚洲国产电影| 一区二区欧美日韩视频| 一区二区在线观看av| 欧美成熟视频| 久久天天狠狠| 欧美日韩成人激情| 亚洲免费av观看| 欧美区二区三区| 在线看无码的免费网站| 老**午夜毛片一区二区三区| 午夜精彩国产免费不卡不顿大片| 欧美图区在线视频| 激情成人亚洲| 黄色欧美成人| 欧美性大战久久久久久久蜜臀| 久久一区二区视频| 欧美激情一区二区在线| 国产亚洲欧洲| 国产永久精品大片wwwapp| 久久久久久久激情视频| 欧美aaaaaaaa牛牛影院| 日韩午夜一区| 欧美国产一区二区在线观看| 欧美日韩大陆在线| 国产一区二区观看| 一区二区三区三区在线| 亚洲午夜精品一区二区三区他趣| 亚洲国产精品免费|