999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于CanFestival和μC/OS-II的CANopen平臺構(gòu)建*

2014-09-06 10:49:55張錚程和生賴世勛

張錚,程和生,賴世勛

(安徽省煤炭科學(xué)研究院 監(jiān)控技術(shù)中心,合肥 230001)

?

基于CanFestival和μC/OS-II的CANopen平臺構(gòu)建*

張錚,程和生,賴世勛

(安徽省煤炭科學(xué)研究院 監(jiān)控技術(shù)中心,合肥 230001)

基于開源的CANopen架構(gòu)CanFestival和嵌入式實(shí)時系統(tǒng)μC/OS-II,提出了一種構(gòu)建CANopen從站平臺的方法。詳細(xì)闡述CANopen協(xié)議棧的軟件結(jié)構(gòu)設(shè)計(jì),實(shí)現(xiàn)了μC/OS-II系統(tǒng)在MC9S12XF512上的移植,并將CANopen從站協(xié)議的狀態(tài)機(jī)封裝成任務(wù)后嵌入到μC/OS-II中運(yùn)行。該硬件平臺采用單片機(jī)MC9S12XF512和高速CAN總線收發(fā)器TJA1040來實(shí)現(xiàn)。通信測試表明CANopen從站通信穩(wěn)定,實(shí)現(xiàn)了DS301通信規(guī)范的功能。

CANopen協(xié)議;μC/OS-II;CanFestival

引 言

CanFestival作為一個開源的CANopen架構(gòu),實(shí)現(xiàn)了CANopen通信規(guī)范DS301的基本協(xié)議,并且在不斷升級[1]。本文結(jié)合CANopen開源協(xié)議棧CanFestival,分析CANopen的協(xié)議結(jié)構(gòu)、對象字典和通信對象,實(shí)現(xiàn)了嵌入式操作系統(tǒng)μC/OS-II在Freescale微控制器MC9S12XF512上的移植;進(jìn)一步修改CAN總線的底層驅(qū)動程序,將CANopen從站協(xié)議嵌入到μC/OS-II系統(tǒng)中,實(shí)現(xiàn)了一種CANopen從站平臺的方法。

1 CANopen協(xié)議通信機(jī)制分析

CANopen通信以CAN總線為基礎(chǔ),物理層遵循IS11898標(biāo)準(zhǔn),數(shù)據(jù)鏈路層遵循CAN2.0標(biāo)準(zhǔn),在應(yīng)用層上CANopen協(xié)議定義了一系列規(guī)范來實(shí)現(xiàn)高層通信,主要分為CANopen通信規(guī)范和CANopen設(shè)備規(guī)范。CANopen的通信規(guī)范主要包括DS301,DS301定義CANopen設(shè)備之間的通信方式和行為規(guī)范,所有設(shè)備必須實(shí)現(xiàn)DS301。 CANopen的設(shè)備規(guī)范則定義了特定類型設(shè)備進(jìn)入CAN總線的通信方式和功能。

CANopen設(shè)備模型分為三個部分[2,5],如圖1所示。通信接口實(shí)現(xiàn)CANopen四種通信對象的功能,來實(shí)現(xiàn)不同數(shù)據(jù)的收發(fā),包括服務(wù)數(shù)據(jù)對象(SDO)、過程數(shù)據(jù)對象(PDO)、網(wǎng)絡(luò)管理對象(NMT)以及一些特殊功能對象(SYNC、TIME和EMCY)。

圖1 CANopen設(shè)備模型

CANopen設(shè)備最核心的部分是對象字典,它是一個有序的對象組,每個對象采用一個16位的索引值來尋址,同時為允許訪問數(shù)據(jù)結(jié)構(gòu)中的單個元素,定義一個8位的子索引[7-8]。對象字典中的對象可以是輸入輸出信號、設(shè)備功能以及網(wǎng)絡(luò)變量。在應(yīng)用程序中,CANopen主從站進(jìn)行連接,通過SDO對CANopen設(shè)備對象字典進(jìn)行配置,同時通過PDO進(jìn)行實(shí)時數(shù)據(jù)的通信。

2 CANopen平臺構(gòu)建

2.1 CAN總線通信硬件實(shí)現(xiàn)

CANopen平臺的構(gòu)建使用飛思卡爾的芯片MC9S12XF512。CAN總線收發(fā)器采用TJA1040。如圖2所示,在CANH和CANL之間并聯(lián)兩個60 Ω的電阻并通過一個30 pF的小電容接地,從而濾除CAN總線上的高頻干擾。MSCAN控制器模塊上的TXD、RXD引腳與TJA1040的TXD、RXD相互連接,并通過TJA1040的CANH和CANL引腳接入到CAN總線網(wǎng)絡(luò)中。

圖2 CAN總線接口硬件電路

2.2 CANopen協(xié)議棧軟件設(shè)計(jì)

整個CANopen協(xié)議棧的軟件設(shè)計(jì)遵循模塊化的原則,并依據(jù)協(xié)議棧的分層結(jié)構(gòu)按照以下三個相對獨(dú)立的部分來進(jìn)行設(shè)計(jì),包括操作系統(tǒng)及硬件驅(qū)動接口層、CAN-open 通信協(xié)議層以及設(shè)備行規(guī)應(yīng)用層,如圖3所示。

圖3 CANopen協(xié)議棧軟件結(jié)構(gòu)

2.2.1 操作系統(tǒng)及硬件驅(qū)動接口層

底層提供操作系統(tǒng)與CAN總線驅(qū)動接口,操作系統(tǒng)接口使得CANopen協(xié)議棧可以嵌入到不同的系統(tǒng)中,實(shí)現(xiàn)任務(wù)的調(diào)度。CAN總線驅(qū)動接口處理CAN總線的數(shù)據(jù)幀信息,獲得其中的有效數(shù)據(jù)進(jìn)行存儲并提供給上層通信對象使用。基于MC9S12XF512芯片的CAN總線驅(qū)動程序主要包括CAN總線控制器初始化函數(shù)、CAN總線報文發(fā)送程序、CAN總線報文接收程序以及中斷函數(shù)的設(shè)置,其中初始化的內(nèi)容包括CAN總線波特率、濾波器的設(shè)置,CAN總線控制器時鐘的選擇。CAN總線驅(qū)動中定義結(jié)構(gòu)體Message來存儲CAN總線的信息幀:

typedef struct{

SHORT_CAN cob-id;

UNS8 rtr;

UNS8 len;

UNS8 data[8];

}Message

其中 32位的cob_id表示CAN幀ID值,兼容CAN2.0A/B;rtr表示是否為遠(yuǎn)程幀,0為數(shù)據(jù)幀,1為遠(yuǎn)程幀;len代表數(shù)據(jù)的長度,對應(yīng)CAN總線幀里DLC的數(shù)值;8字節(jié)數(shù)組data存儲CAN總線有效數(shù)據(jù)。 CAN總線驅(qū)動接口將CAN總線底層驅(qū)動的收發(fā)程序封裝在對應(yīng)于CanFestival的f_can_send和f_can_receive函數(shù)當(dāng)中,二者分別讀寫CAN總線收發(fā)程序的緩沖區(qū),獲取其中CAN總線數(shù)據(jù)cob_id、rtr、len、data的數(shù)值并存入到結(jié)構(gòu)體Message中。通過這種方式,在運(yùn)行高層協(xié)議時,CANopen通信對象不需要關(guān)心底層驅(qū)動的實(shí)現(xiàn)過程及執(zhí)行環(huán)境,從而將CANopen通信協(xié)議層和底層驅(qū)動分隔開來,便于移植。

2.2.2 CANopen通信協(xié)議層

CANopen通信協(xié)議層實(shí)現(xiàn)協(xié)議4種通信對象的功能,每個設(shè)備獨(dú)立擁有一個對象字典,它作為通信對象與上層應(yīng)用程序的接口,存放著設(shè)備的配置參數(shù)和過程參數(shù),設(shè)備之間配置參數(shù)的通信通過SDO以客戶機(jī)/服務(wù)器的方式來實(shí)現(xiàn)。SDO提供基于請求和應(yīng)答的點(diǎn)對點(diǎn)通信,允許大于8字節(jié)的數(shù)據(jù)采用分段或分塊的方式傳輸。過程參數(shù)的通信通過PDO采用生產(chǎn)者/消費(fèi)者方式來實(shí)現(xiàn),數(shù)據(jù)從一個生產(chǎn)者傳到一個或者多個消費(fèi)者,且數(shù)據(jù)長度在8字節(jié)以內(nèi)。PDO在對象字典中通過通信參數(shù)規(guī)定該P(yáng)DO所使用的cob-id、傳輸類型、抑制時間等參數(shù),通過映射參數(shù)設(shè)置映射到PDO中的對象字典里的具體對象。時間標(biāo)記、同步、應(yīng)急等預(yù)定義的報文則可以提高網(wǎng)絡(luò)利用率,NMT用來實(shí)現(xiàn)節(jié)點(diǎn)狀態(tài)的轉(zhuǎn)移和錯誤的控制。它采用主從結(jié)構(gòu),主節(jié)點(diǎn)對從節(jié)點(diǎn)進(jìn)行狀態(tài)管理和節(jié)點(diǎn)保護(hù),每個CANopen從節(jié)點(diǎn)以狀態(tài)機(jī)的方式接受主節(jié)點(diǎn)NMT對其狀態(tài)的切換。

圖4 報文處理

根據(jù)CANopen預(yù)定義連接集的描述,cob-id的高4位是用來區(qū)分不同通信對象的功能碼[2],報文接收到以后,通過判斷高4位功能碼來區(qū)分所接收到的通信對象,并通過一個指向函數(shù)的指針來調(diào)用相應(yīng)的函數(shù)對報文進(jìn)行處理,如圖4所示,通過接收中斷,CAN總線信息寫入到接收緩沖區(qū)后調(diào)用f_can_receive函數(shù),將CAN總線幀中的有效數(shù)據(jù)存入Message結(jié)構(gòu)體,而后通過ReceiveHandler函數(shù)讀取cob-id高4位功能碼,并根據(jù)不同的功能碼最終切換至4種通信對象的報文處理函數(shù)。

2.2.3 對象字典的建立

協(xié)議棧軟件的頂層主要包括對象字典的建立和訪問以及其他一些應(yīng)用包括節(jié)點(diǎn)反饋、網(wǎng)絡(luò)的設(shè)置等。由于CANopen對象字典采用主索引和子索引結(jié)構(gòu),二者形成天然的二維數(shù)組結(jié)構(gòu),因此協(xié)議棧對象字典的實(shí)現(xiàn)是基于數(shù)組和數(shù)組的變型。主索引和子索引不同的數(shù)組下標(biāo)在內(nèi)存中就代表索引數(shù)據(jù)距離對象字典首地址的偏移量,通過該偏移量,便可以訪問到對象字典中的數(shù)據(jù)。一個對象的信息應(yīng)該包括索引、子索引、數(shù)據(jù)、數(shù)據(jù)類型和訪問類型。這里通過定義兩個結(jié)構(gòu)體來表示主索引和子索引:

typedef struct td_subindex{

enum e_accessAttribute bAccessType;

UNS8 bDataType;

UNS8 size;

void* pObject;

} subindex;

typedef struct td_indextable{

subindex* pSubindex;

UNS8 bSubCount;

} indextable;

其中bAccessType表示數(shù)據(jù)的訪問類型,分為只讀、只寫和可讀寫,bDataType表示數(shù)據(jù)類型,指針*pObject指向所包含的數(shù)據(jù),通過結(jié)構(gòu)體indextable來定義主索引,其中bSubCount表示此索引下子索引的數(shù)目。以對象字典中索引為1001H的錯誤寄存器為例,其對象字典定義為:

UNS8 OBJNAME = 0x0;

subindex Index1001[] ={

{ RO, uint8, sizeof(UNS8), (void*)&OBJNAME }

};

3 μC/OS-II移植及CANopen的嵌入

3.1 μC/OS-II在MC9S12XF512上的移植

為了使μC/OS-II系統(tǒng)內(nèi)核能在某一特定的微控制器上運(yùn)行,必須對與處理器相關(guān)的代碼進(jìn)行修改。MC9S12XF512單片機(jī)有512 KB的片內(nèi)FLASH和 32 KB RAM[3],可以在占有資源相對較少的條件下,運(yùn)行操作系統(tǒng)的實(shí)時內(nèi)核。集成的開發(fā)環(huán)境CodeWarrior可以進(jìn)行程序的編譯、下載以及調(diào)試,提高了工作效率。由于μC/OS-II系統(tǒng)具有較強(qiáng)的可移植性,其移植工作主要是修改與處理器相關(guān)的代碼,包括OS_CPU.H、OS_CPU_C.C和OS_CPU_A.ASM[4],因?yàn)镃odeWarrior支持C語言與匯編語言的混合編程,所以可將后兩個文件合成一個OS_CPU_C.C文件,以下從與移植相關(guān)的聲明和函數(shù)兩方面進(jìn)行代碼的修改。

3.1.1 修改與移植相關(guān)的聲明

在OS_CPU.H中定義了與編譯器有關(guān)的數(shù)據(jù)類型、開關(guān)中斷宏、堆棧的生長方向以及任務(wù)切換宏。在MC9S12中堆棧是按字節(jié)進(jìn)行操作,因此定義堆棧數(shù)據(jù)類型OS_STK為8位[6]。MC9S12處理器的堆棧是由高地址向低地址增長的,所以常量OS_STK_GROWTH設(shè)置為1。任務(wù)切換宏OS_TASK_SW()是在μC/OS-II從低優(yōu)先級任務(wù)切換到最高優(yōu)先級任務(wù)時被調(diào)用的,OS_TASK_SW()通過模擬一次中斷過程,在中斷返回的時候進(jìn)行任務(wù)切換。MC9S12提供了軟中斷源和陷阱中斷源,這兩個中斷源都可以使得處理器的寄存器狀態(tài)保存到將被掛起任務(wù)的堆棧中。由于芯片中不存在監(jiān)控程序,所以利用MC9S12XF512提供的軟中斷指令SWI來定義OS_TASK_SW(),并將其中斷服務(wù)程序的入口點(diǎn)指向OSCtxSw()。

3.1.2 修改與處理器相關(guān)的函數(shù)

(1) 任務(wù)切換函數(shù)

任務(wù)級任務(wù)切換函數(shù)OSCtxSw()的任務(wù)是將當(dāng)前的CPU的狀態(tài)保存到正在運(yùn)行任務(wù)的堆棧中,然后將堆棧指針保存到任務(wù)控制塊中,之后運(yùn)行OSTaskSwHook()鉤子函數(shù),而后將任務(wù)控制變量OSTCBCur和OSPrioCur的值更改為即將要運(yùn)行的任務(wù)的屬性,從任務(wù)控制塊中得到將要運(yùn)行任務(wù)的堆棧指針賦給SP寄存器,最后運(yùn)行中斷返回指令。對于中斷級任務(wù)切換函數(shù),由于中斷服務(wù)函數(shù)已經(jīng)將CPU寄存器和中斷發(fā)生前正運(yùn)行的任務(wù)堆棧指針保存過,因此OSIntCtxSw()即是OSCtxSw()在調(diào)用鉤子函數(shù)的后半部分。在MC9S12中,當(dāng)中斷發(fā)生時芯片會將CPU寄存器推入堆棧,但是不會包括頁面管理寄存器,因此需要用匯編語言加入其入棧和出棧的操作:

ldaa PPAGE

psha //PPAGE入棧

pula

staa PPAGE //PPAGE出棧

(2) 任務(wù)堆棧初始化函數(shù)

任務(wù)堆棧初始化函數(shù)OSTaskStkInit()在創(chuàng)建任務(wù)的時候調(diào)用,用來在任務(wù)堆棧中按照一定順序初始化任務(wù)最初的數(shù)據(jù)。在MC9S12XF512芯片中,根據(jù)數(shù)據(jù)存放的順序,從高到低位對opt參數(shù)、PC寄存器、Y寄存器、X寄存器、D寄存器、CCR寄存器和PPAGE寄存器進(jìn)行初始化,并最后返回堆棧指針?biāo)赶虻牡刂贰F渲蠵C的值設(shè)置為任務(wù)的入口地址并存放兩次,第一個值是建立擴(kuò)展任務(wù)所需的; D的值初始化為參數(shù)pdata的值用來傳遞任務(wù)參數(shù);PPAGE則是用來存儲頁面寄存器的值。

(3) 時鐘節(jié)拍中斷服務(wù)函數(shù)

和其他中斷服務(wù)程序一樣,首先OSTickISR()在被中斷任務(wù)堆棧中保存CPU的值,然后調(diào)用OSIntEnter(),使得中斷嵌套層數(shù)全局變量OSIntNesting加1。隨后通過調(diào)用OSTimeTick(),遍歷任務(wù)控制鏈表中的所有任務(wù)控制塊,把各自用來存放延時時限的OSTCBDly變量減1,若其計(jì)數(shù)值為0,則表明該任務(wù)進(jìn)入就緒狀態(tài),最后調(diào)用OSIntExit()標(biāo)志著時鐘節(jié)拍中斷服務(wù)子程序的結(jié)束。本次移植中時鐘節(jié)拍由硬件產(chǎn)生,必須設(shè)置好實(shí)時時鐘的控制寄存器,使得MC9S12芯片在產(chǎn)生相應(yīng)中斷后,調(diào)用處理程序。實(shí)時時鐘控制寄存器設(shè)置如下:

RTICTL=0x49; //每秒產(chǎn)生100次中斷

CRGINT|=0x80; //使能中斷

μC/OS-II系統(tǒng)經(jīng)過上述修改后在MC9S12芯片中運(yùn)行起來。μC/OS-II的引入使得系統(tǒng)開發(fā)的效率得以提高,編寫程序時,只要將相關(guān)的功能封裝成任務(wù),并根據(jù)任務(wù)的輕重緩急設(shè)定優(yōu)先級,啟動多任務(wù)環(huán)境后,由μC/OS-II來管理這些任務(wù)。

3.2 μC/OS-II系統(tǒng)中嵌入CANopen

狀態(tài)機(jī)作為CANopen協(xié)議整個操作流程的核心,其從站狀態(tài)機(jī)定義了4個基本狀態(tài):初始化、預(yù)操作、操作和停止,如圖3所示。執(zhí)行過程中,從站上電復(fù)位后由初始化狀態(tài)跳轉(zhuǎn)到預(yù)操作狀態(tài),等待主站控制命令的到來;主站是狀態(tài)機(jī)的控制者,從站待命后,主站發(fā)送命令切換各個從站的狀態(tài),從而在各個狀態(tài)下完成操作。為將CANopen協(xié)議嵌入到μC/OS-II中,需要將狀態(tài)機(jī)封裝成一個任務(wù):

void CANopenTask(void *pdata){

e_nodeState lastState=unknown_state;

pdata=pdata;

while(1){

switch(getState()){

case Initialisation:

……

case Pre_operational:

……

case Operational:

……

case Stopped:

……

}

}

}

在主函數(shù)中,操作系統(tǒng)完成初始化、創(chuàng)建任務(wù)和啟動任務(wù)的過程,通過OSTaskCreate()函數(shù)創(chuàng)建封裝好的CANopen從站任務(wù),最后通過OSStart()函數(shù),啟動操作系統(tǒng),運(yùn)行任務(wù)。

4 CANopen從站通信測試

實(shí)驗(yàn)中將μC/OS-II上運(yùn)行的CANopen從站與主節(jié)點(diǎn)連接,按照以下流程進(jìn)行通信實(shí)驗(yàn)。在系統(tǒng)上電完成初始化后,從節(jié)點(diǎn)首先向主節(jié)點(diǎn)發(fā)送Boot-up報文,通知主節(jié)點(diǎn)已進(jìn)入Pre_operational狀態(tài)。從節(jié)點(diǎn)處于Pre_operational狀態(tài)時,接收來自主節(jié)點(diǎn)的SDO報文對其對象字典進(jìn)行配置。當(dāng)從節(jié)點(diǎn)接收到主節(jié)點(diǎn)的NMT報文后,從節(jié)點(diǎn)進(jìn)入operational狀態(tài),此時主節(jié)點(diǎn)和從節(jié)點(diǎn)通過PDO進(jìn)行實(shí)時數(shù)據(jù)的交互。在operational狀態(tài)下,將從節(jié)點(diǎn)的TPDO1~3映射到主節(jié)點(diǎn)的RPDO1~3,以時間觸發(fā)和事件觸發(fā)方式分別進(jìn)行PDO傳送。通信實(shí)驗(yàn)表明平臺能夠完成DS301通信規(guī)范所定義的網(wǎng)絡(luò)管理、PDO和SDO報文收發(fā)以及同步報文發(fā)送等功能。

[1] Francis Dupin CanFestival v2.03 Manual [OL]. [2013-07]. http:// www. canfestival.org.

[2] CiA Draft Standard 301 Version 4.02, CANopen Application Layer and Communication Profile,2002.

[3] Freescale Semiconductor Inc. MC9S12XF512 Reference Manual Rev.1.19,2010.

[4] Labrosse J J.嵌入式實(shí)時操作系統(tǒng)μC/OS-II[M].2版.邵貝貝,譯.北京:北京航空航天大學(xué)出版社,2003:278-283.

[5] Xu Zhe, Dong Shifeng. The Design and Implementation of a CANopen Slave Stack for Powertrain Controller in Hybrid Electric Vehicle [C]//International Conference on Intelligent Computation Technology and Automation,May 11-12, 2010:755-758.

[6] 孫同景,陳桂友. Freescale 9S12十六位單片機(jī)原理與嵌入式開發(fā)技術(shù)[M].北京:機(jī)械工業(yè)出版社,2008:389-391.

[7] 陶維青,劉寧,余淼,等.基于DSP與CAN總線技術(shù)的饋線監(jiān)控終端開發(fā)[J].合肥工業(yè)大學(xué)學(xué)報:自然科學(xué)版,2008,31(7):1016-1019.

[8] 孫樹文,楊建武,張慧慧,等.基于CANopen協(xié)議的分布式控制系統(tǒng)I/O從站設(shè)計(jì)[J].計(jì)算機(jī)測量與控制,2007,15(12):1705-1707.

Zhang Zheng,Cheng Hesheng,Lai Shixun

(Monitoring Technology Center, Anhui Province Coal Science Research Institute, Hefei 230001,China)

This paper presents a method for using MC9S12XF512 chip to construct a CANopen slave station based on μC/OS-II system and CanFestival open source stack, and illustrates the software design of CANopen protocol stack, the transplantation of μC/OS-II and the process of embedding CANopen slave stack to μC/OS-II. The communication test shows that the slave station realized the function of DS301 standard.

CANopen protocol;μC/OS-II;CanFestival

TP336

A

2013-07-15)

主站蜘蛛池模板: 亚洲人成成无码网WWW| 九九热精品在线视频| 日本欧美精品| 91福利一区二区三区| 成人av手机在线观看| 日本精品αv中文字幕| 欧美成人影院亚洲综合图| a级毛片毛片免费观看久潮| 欧洲av毛片| 啊嗯不日本网站| 精品久久香蕉国产线看观看gif| 亚洲第一国产综合| 成人午夜网址| m男亚洲一区中文字幕| 99热国产在线精品99| 国产成人永久免费视频| 91午夜福利在线观看| 亚洲久悠悠色悠在线播放| 园内精品自拍视频在线播放| 国产美女人喷水在线观看| 国产va在线观看免费| 亚洲三级网站| 五月激情婷婷综合| 九九线精品视频在线观看| 亚洲第一视频网| 精品少妇人妻av无码久久| 日韩欧美中文字幕在线韩免费| 大香伊人久久| 国产美女精品在线| 四虎国产永久在线观看| 亚洲欧美自拍中文| 91在线视频福利| 一级香蕉视频在线观看| 狠狠躁天天躁夜夜躁婷婷| 国产丝袜一区二区三区视频免下载| 中文国产成人精品久久| 久久精品国产一区二区小说| 亚洲天堂网在线观看视频| 国产精品自在自线免费观看| 在线国产91| a级毛片免费网站| 国内精自线i品一区202| 色综合久久久久8天国| 中文字幕首页系列人妻| 午夜国产在线观看| 91精品啪在线观看国产91| 91精品专区国产盗摄| 国产香蕉国产精品偷在线观看| 99在线国产| 欧美视频在线不卡| 亚洲无码37.| 免费人欧美成又黄又爽的视频| 99热这里只有精品免费国产| 久久精品中文字幕免费| 在线精品视频成人网| 婷婷午夜天| 午夜少妇精品视频小电影| 一级成人a做片免费| 日韩精品亚洲人旧成在线| 国产精品成人一区二区不卡| 亚洲午夜18| 亚洲无码在线午夜电影| 青青久在线视频免费观看| 国产91丝袜| 国产精品无码作爱| 爆操波多野结衣| 成人午夜网址| 亚洲AV无码久久精品色欲| 54pao国产成人免费视频| 在线国产欧美| 99精品在线看| 久久久久免费精品国产| 久久精品丝袜| 激情五月婷婷综合网| 九九热这里只有国产精品| 久久免费观看视频| 毛片网站观看| 美女潮喷出白浆在线观看视频| 在线欧美日韩国产| 四虎精品黑人视频| 综合天天色| 在线免费看黄的网站|