在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

KW36 MCU HardFault問題查找和破解方法

jf_pJlTbmA9 ? 來源:大寧筆記不重名 ? 作者:大寧筆記不重名 ? 2023-10-31 16:57 ? 次閱讀

一、HardFault產(chǎn)生原因和常規(guī)分析方法

嵌入式開發(fā)中,偶爾會(huì)遇到Hard Fault死機(jī)的異常,常見產(chǎn)生Hard Fault的原因大致有以下幾類:

數(shù)組越界和內(nèi)存溢出,譬如訪問數(shù)組時(shí),動(dòng)態(tài)訪問的數(shù)組標(biāo)號(hào)超過數(shù)組長(zhǎng)度或者動(dòng)態(tài)分配內(nèi)存太小等;

堆棧溢出,例如在使用中,局部變量分配過大,超過棧大小,也會(huì)導(dǎo)致程序跑飛;

在外設(shè)時(shí)鐘開啟前,訪問對(duì)應(yīng)外設(shè)寄存器,例如Kinetis中未打開外設(shè)時(shí)鐘去配置外設(shè)的寄存器;

不當(dāng)?shù)挠梅ú僮鳎绶菍?duì)齊的數(shù)據(jù)訪問、除0操作(默認(rèn)情況下M3/M4/M7,除0默認(rèn)都不會(huì)觸發(fā)Fault,因?yàn)?a target="_blank">ARM內(nèi)核CCR寄存器DIV_0_TRP位復(fù)位值為0,而對(duì)M0來說DIV_0_TRP位是reserved的,也不會(huì)產(chǎn)生Fault錯(cuò)誤)、強(qiáng)行訪問受保護(hù)的內(nèi)存區(qū)域等;

出現(xiàn)Hardfault錯(cuò)誤時(shí),問題比較難定位的原因在于此時(shí)代碼無法像正常運(yùn)行時(shí)一樣,在debug IDE的stack callback窗口能直接找到出錯(cuò)時(shí)上一級(jí)的調(diào)用函數(shù),所以顯得無從下手。通常情況下我們都是通過在某個(gè)區(qū)間打斷點(diǎn),然后通過單步執(zhí)行去逐步縮小“包圍圈”去找到產(chǎn)生Hard Fault的代碼位置,接著再去推敲、猜測(cè)問題的原因。對(duì)于不是很復(fù)雜的程序,這種方法是有效的,但是當(dāng)用戶代碼量進(jìn)一步增大,再用這種單步+斷點(diǎn)去逐步縮小包圍圈的方式就很難查到問題點(diǎn),效率也很低。尤其是在有操作系統(tǒng)的應(yīng)用中,很多代碼的跳轉(zhuǎn)是由操作系統(tǒng)調(diào)度的,不是嚴(yán)格的順序執(zhí)行,所以很難依靠縮小包圍圈的方式去有效找到問題產(chǎn)生的點(diǎn),進(jìn)一步增加了定位到Hard Fault觸發(fā)原因的難度。

盡管本測(cè)試是針對(duì)NXP KW36芯片的,但該步驟和方法也適用于其他的Arm Cortex-M內(nèi)核MCU

二、HardFault解決方法分析

筆者在實(shí)際支持客戶過程中也遇到這種困惑,網(wǎng)上的介紹資料比較零散,理論很多,很少詳細(xì)描述實(shí)戰(zhàn)操作的步驟,借助同事的點(diǎn)撥,摸索出兩種定位Hard Fault問題的方法,在實(shí)際使用中操作性也很強(qiáng),此處分別做一介紹。

第一種:心里明白徒手分析法,就是在了解Hard Fault出錯(cuò)原理以及程序調(diào)用壓棧出棧原理的基礎(chǔ)上(當(dāng)然按照本文的練就心法,心里不明白也可以),在Debug仿真模式下徒手去回溯分析CPU通用寄存器(LR/MSP/PSP/PC),然后結(jié)合調(diào)試IDE去定位到產(chǎn)生Hard Fault的代碼位置;

第二種:CmBacktrace 天龍大法,該方法是朱天龍大神針對(duì) ARM Cortex-M系列MCU開發(fā)的一套錯(cuò)誤代碼自動(dòng)追蹤、定位、錯(cuò)誤原因自動(dòng)分析的開源庫,已開源在Github上,該方法支持在非Debug模式下,自動(dòng)分析定位到出錯(cuò)的行號(hào),無需了解復(fù)雜的壓棧出棧過程。

兩者的區(qū)別在于:前者不需要額外添加代碼,缺點(diǎn)是只能在仿真狀態(tài)下調(diào)試,需要用戶對(duì)程序調(diào)用壓棧/出棧原理有清晰的理解,后者的唯一的缺點(diǎn)是需要適當(dāng)添加代碼,并稍微配置工程和打印輸出,優(yōu)點(diǎn)就太多了。首先,產(chǎn)品真機(jī)調(diào)試時(shí)可以斷開仿真器,并將錯(cuò)誤信息輸出到控制臺(tái)上,甚至可以將錯(cuò)誤信息使用 Easy Flash 的 Log 功能保存至 Flash 中,待設(shè)備死機(jī)后重啟依然能夠讀取上次的錯(cuò)誤信息。這個(gè)功能真的是very very重要了,尤其在有些Hard Fault問題偶發(fā)的情況下,很多時(shí)候一天可能也復(fù)現(xiàn)不了一次問題,但借助CmBacktrace 天龍大法便可以輕松脫離仿真器get每一次錯(cuò)誤,最后再配合 addr2line 工具進(jìn)行精確定位出錯(cuò)代碼的行號(hào),方便用戶進(jìn)行后續(xù)的精確分析。

三、HardFault回溯的原理

為了找到Hard Fault 的原因和觸發(fā)的代碼段,就需要深刻理解當(dāng)系統(tǒng)產(chǎn)生異常時(shí) MCU 的處理過程: 當(dāng)處理器接收一個(gè)異常后,芯片硬件會(huì)自動(dòng)將8個(gè)通用寄存器組中壓入當(dāng)前棧空間里(依次為 xPSR、PC、LR、R12以及 R3~R0),如果異常發(fā)生時(shí),當(dāng)前的代碼正在使用PSP,則上面8個(gè)寄存器壓入PSP,否則就壓入MSP。那問題來了,如何找到這個(gè)棧空間的地址呢?答案是SP, 但是前面提到壓棧時(shí)會(huì)有MSP和PSP,如何判斷觸發(fā)異常時(shí)使用的MSP還是PSP呢?答案是LR。到此確定完SP后,用戶便可以通過堆棧找到觸發(fā)異常的PC 值,并與反匯編的代碼對(duì)比就能得到哪條指令產(chǎn)生了異常。

總結(jié)下來,總體思路就是:首先通過LR判斷出異常產(chǎn)生時(shí)當(dāng)前使用的SP是MSP還是PSP,接著通過SP去得到產(chǎn)生異常時(shí)保存的PC值,最后與反匯編的代碼對(duì)比就能得到哪條指令產(chǎn)生了異常。

回到前面的第二個(gè)問題,如何通過LR判斷當(dāng)前使用的MSP還是PSP呢?參見如下圖,當(dāng)異常產(chǎn)生時(shí),LR 會(huì)被更新為異常返回時(shí)需要使用的特殊值(EXC_RETURN),其定義如下,其高 28 位置 1,第 0 位到第3位則提供了異常返回機(jī)制所需的信息,可見其中第 2 位標(biāo)示著進(jìn)入異常前使用的棧是 MSP還是PSP。

wKgaomUD9ZeAcxjEAAD8GfJAy9I222.png

四、操作分析流程:

理解了以上的Hard Fault回溯的原理,下面按以上提到的兩種思路來實(shí)操一下。

1、心里明白徒手分析法

前面提到,為了清晰的展現(xiàn)這個(gè)過程以及每個(gè)參數(shù)之間的關(guān)系,盡量把整個(gè)流程按照順序整理到一張圖中,如下圖1。示例中使用的是KW36 temp_sensor_freeRTOS例子(什么例子不重要,該方法也適用于其他的MCU系列),在main函數(shù)中通過非對(duì)齊地址訪問故意制造Hard Fault錯(cuò)誤,代碼如圖中序號(hào)1,當(dāng)程序試圖訪問讀取非對(duì)齊地址0xCCCC CCCC位置時(shí)程序就會(huì)跳入到Hard Fault Handler中,那具體是如何通過堆棧分析定位到出錯(cuò)代碼是在n=*p這一行呢?具體步驟如下:

wKgZomUD9ZmAdY5yAAczVrYHhOs226.png

Step1:判斷SP是MSP還是PSP,找出SP地址。在產(chǎn)生Hard Fault異常后,首先在序號(hào)2中選擇“ CPU register”,不要使用默認(rèn)的 “CPU register ”,否則默認(rèn)只會(huì)顯示MSP,不會(huì)顯示PSP。然后查看序號(hào)3中LR寄存器的值表示判斷當(dāng)前程序使用堆棧為MSP主進(jìn)程或PSP子進(jìn)程堆棧,顯然LR=0xFFFFFFF9 的bit2=0,表示使用的是主棧,于是得到SP=序號(hào)4中的SP_main=0x20005620;

Step2:找出PC地址。如序號(hào)5演示,打開memory串口,輸入SP的地址可以找到異常產(chǎn)生前壓棧的8個(gè)寄存器,依次為 xPSR、PC、LR、R12以及 R3~R0,序號(hào)6中便可以找到出錯(cuò)前PC的地址位0x00008a06;

Step3:找出代碼行數(shù)。如序號(hào)7演示,打開匯編窗口,在“go to”串口輸入PC地址,便可以找到具體出錯(cuò)時(shí)代碼的位置,如序號(hào)8演示,可以發(fā)現(xiàn),輕松愉快的找到了導(dǎo)致Hard Fault的非對(duì)齊訪問的代碼行;

2、CmBacktrace 天龍大法

Step1: 從天龍大神的Github下載CmBacktrace的源代碼包,拷貝cm_backtrace目錄下的4個(gè)文件以及cmb_fault.s文件到KW36 IAR工程中,如下圖序號(hào)2標(biāo)識(shí),并添加相應(yīng)的搜索路徑;

Step2: 根據(jù)應(yīng)用修改cmb_cfg.h的配置,需要配置的選項(xiàng)包括print打印信息的重定義,是否需要支持OS,OS的類型(RTT、uCOS以及FreeRTOS),ARM內(nèi)核的類型,打印輸出語言類型等;本實(shí)例中使用了錯(cuò)誤信息中文打印以及FreeRTOS,所以配置如下圖序號(hào)2標(biāo)識(shí)。

wKgaomUD9ZuAXauPAANfcqRHxoM214.png

Step3: 修改FreeRTOS的task.c文件增加以下3個(gè)函數(shù),否則在編譯時(shí)會(huì)報(bào)錯(cuò)提示這3個(gè)函數(shù)無定義。最簡(jiǎn)單的做法就是直接使用CmBacktrace源代碼包的task.c替代KW36 SDK中的task.c文件。

wKgZomUD9ZyAPfsJAAF5sm8Wma4282.png

Step4: 在啟動(dòng)FreeRTOS啟動(dòng)任務(wù)調(diào)度前初始化CmBacktrace庫以及配置信息,并在startup子任務(wù)中編寫故意制造錯(cuò)誤的代碼,代碼如下。

wKgaomUD9Z2AfyYaAAD0uPsPHmk776.png

Step5: 配置打印信息的輸出位置,建議的做法是輸出到物理串口,可以方便的離線分析記錄log, 但實(shí)驗(yàn)中為了簡(jiǎn)化以及通用(有些時(shí)候硬件設(shè)計(jì)上可能沒有留硬件串口),直接把打印信息輸出到IAR的Terminal IO進(jìn)行顯示(Kinetis SDK如何修改代碼,使能打印信息輸出到IAR的Terminal IO的做法詳見另外一篇文檔)。

Step6: 運(yùn)行代碼,觀察打印結(jié)果,可以看到打印信息中包含出錯(cuò)的任務(wù)名稱、出錯(cuò)前的任務(wù)壓棧的8個(gè)通用寄存器名稱和內(nèi)容,從圖中可以一目了然的找出出錯(cuò)的PC指針,如果進(jìn)一步去結(jié)合匯編代碼可以清晰的看到其能夠準(zhǔn)確定位到代碼出錯(cuò)的位置。

wKgZomUD9Z-AIMA3AABSrEZdGTw330.png

Step7: 盡管在Step6中結(jié)合匯編找到了出錯(cuò)的代碼行,但是前面吹過的一個(gè)牛逼還未實(shí)現(xiàn),就是使用CmBacktrace 可以支持不掛仿真器debug狀態(tài)下找到出錯(cuò)的代碼行,那具體如何操作呢?答案其實(shí)在Step 5的打印信息中已經(jīng)揭曉“查看更多函數(shù)調(diào)用棧信息,請(qǐng)運(yùn)行:addr2line -e CmBacktrace.out -a -f 00005f12 0000dda4 ”。

于是拷貝工程的.out文件到toolsaddr2linewin64目錄下,在cmd命令行中執(zhí)行以上命令,結(jié)果如下圖的上半部分,可以看到出錯(cuò)的任務(wù)是startup_task,出錯(cuò)的文件是fsl_os_abstraction_free_rtos.c,出錯(cuò)行號(hào)是135。結(jié)合截圖的下半部分的代碼去看,完全驗(yàn)證了這三個(gè)點(diǎn)。

wKgaomUD9aKAEZZHAAKoXtauSnM218.png

到此,使用CmBacktrace大法不輕松但很愉悅的定位到問題點(diǎn)了。

五、總結(jié):

對(duì)于Hard Fault問題,通過以上兩種辦方法可以有效的找到問題點(diǎn),為后續(xù)進(jìn)一步分析定位問題指明方向。徒手分析法比較簡(jiǎn)單,不需要額外添加代碼,缺點(diǎn)是只能在仿真狀態(tài)下調(diào)試,需要用戶對(duì)程序調(diào)用壓棧/出棧原理有清晰的理解。CmBacktrace 天龍大法則支持離線調(diào)試分析,但繁瑣點(diǎn)在于需要移植代碼,并配置工程和打印輸出,尤其在Hard Fault問題偶發(fā)(很多時(shí)候一天可能也復(fù)現(xiàn)不了一次問題)以及只有離線狀態(tài)下才能復(fù)現(xiàn)問題的情況下,使用CmBacktrace 的方法去定位問題是非常高效的。至于如何將錯(cuò)誤信息使用 Easy Flash 的 Log 功能保存至 Flash 中,待設(shè)備死機(jī)后重啟依然能夠讀取上次的錯(cuò)誤信息部分,時(shí)間關(guān)系筆者沒有深入研究,有興趣的可以嘗試實(shí)現(xiàn)。

來源:大寧筆記不重名(作者:Const Yu)

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17718

    瀏覽量

    358199
  • NXP
    NXP
    +關(guān)注

    關(guān)注

    61

    文章

    1318

    瀏覽量

    186797
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1403

    瀏覽量

    40953
  • 嵌入式開發(fā)
    +關(guān)注

    關(guān)注

    18

    文章

    1065

    瀏覽量

    48351
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    轉(zhuǎn):淺談MCU破解技術(shù)

    破解目標(biāo)單片機(jī)的方法,利用這種方法,不會(huì)對(duì)目標(biāo)MCU元器件造成物理損傷。主要是對(duì)WINBONGD,SYNCMOS單片機(jī)和GAL門陣列, 這種利用軟件解密設(shè)備,按照一定的步驟操作,執(zhí)行片
    發(fā)表于 08-23 10:14

    【轉(zhuǎn)載】快速追蹤和定位產(chǎn)生HardFault原因的方法

    AN0028—快速追蹤和定位產(chǎn)生HardFault原因的方法概述在使用ARM Cortex-M 系列 MCU時(shí)(如AT32 MCU),有時(shí)會(huì)出現(xiàn)程序運(yùn)行異常。當(dāng)通過編譯器在debug模
    發(fā)表于 08-17 09:44

    使用kw36作為外圍連接另一個(gè)設(shè)備時(shí),F(xiàn)RDM kw36的BLE自動(dòng)斷開如何解決?

    當(dāng)我使用kw36作為外圍連接另一個(gè)設(shè)備時(shí),大約十分鐘后兩塊BLE板自動(dòng)斷開連接,并且“ BleApp_Start();” 在“static void BleApp_ConnectionCallback”中無法重新啟動(dòng)廣告。那么我該如何解決這個(gè)問題呢?感謝您的任何建議。
    發(fā)表于 03-14 09:35

    KW36如何在Vref范圍內(nèi)降低adc輸入電壓?

    我正在使用 kw36。我將 PTB1 配置為 ADC(通道 DAD1)的單端輸入。并使用 12 位分辨率和內(nèi)部參考電壓。當(dāng)我將 3.3v 源連接到 adc 輸入時(shí),我得到 4095 作為輸出。所以
    發(fā)表于 03-28 07:07

    KW36 BLE身份地址無法設(shè)置的原因?怎么處理?

    你好:KW36 BLE工作在central mode時(shí)不能設(shè)置身份地址為random(static)類型。我使用 FRDM-KW36 板并導(dǎo)入 SDK(2.2.11) example Inc 并啟用綁定能力,啟用配對(duì) 程序,啟用 隱私, 但我無法將 自己的身份地址類型設(shè)置
    發(fā)表于 04-03 08:42

    KW36 jlink調(diào)試報(bào)錯(cuò)怎么解決?

    我正在使用 jlink 來調(diào)試 kw36 ble。該板由我們公司布局。它不是演示板, 我從測(cè)試點(diǎn)擴(kuò)展了jlink pin并連接了一個(gè)從網(wǎng)上購買的ARM模擬器,版本是arm11。詳細(xì)信息請(qǐng)參閱所附
    發(fā)表于 04-17 06:17

    請(qǐng)問KW34/KW35/KW36KW37/38/39是否有客戶杠桿QDID?

    先生,KW34/KW35/KW36KW37/38/39是否有客戶杠桿QDID?如果 KW37/38/39 沒有,有什么客戶杠桿計(jì)劃?
    發(fā)表于 04-20 08:16

    MRS_關(guān)于HardFault問題查找思路

    引起的異常。5.進(jìn)入中斷時(shí),硬件將mtval的值設(shè)為0。綜上所述,我們可以通過MEPC的值確定代碼進(jìn)HardFault_Handler中斷的位置,在某些情況下可以方便我們確定報(bào)錯(cuò)原因。本文提供兩種方法
    發(fā)表于 08-24 10:57

    簡(jiǎn)單的MCU加密方法,防破解、防抄襲、防山寨

    前言目前MCU程序破解非常容易,最簡(jiǎn)單粗暴的方法就是直接將MCU內(nèi)部flash整塊copy走,再copy下你的硬件和結(jié)構(gòu),這樣很快就能山寨出你的產(chǎn)品。這樣很不尊重你的勞動(dòng)成果,為了保護(hù)
    發(fā)表于 11-05 19:21 ?16次下載
    簡(jiǎn)單的<b class='flag-5'>MCU</b>加密<b class='flag-5'>方法</b>,防<b class='flag-5'>破解</b>、防抄襲、防山寨

    手把手教你查找stm32 HardFault_Handler調(diào)試及問題方法

    手把手教你查找stm32 HardFault_Handler調(diào)試及問題方法
    發(fā)表于 12-03 09:36 ?22次下載
    手把手教你<b class='flag-5'>查找</b>stm32 <b class='flag-5'>HardFault</b>_Handler調(diào)試及問題<b class='flag-5'>方法</b>

    S32K1XX調(diào)試--快速定位HardFault

    ,程序上一條執(zhí)行的是那條命令。根據(jù)匯編指令可以定位上條指令,但如果對(duì)匯編指令不是很了解的話,那就很頭疼了根據(jù)單步運(yùn)行也能實(shí)現(xiàn)定位,但如果程序量很大,又很雜,可能花費(fèi)的時(shí)間就比較久些。3、問題查找提供一種不需要懂匯編指令的查找方法
    發(fā)表于 12-03 15:21 ?5次下載
    S32K1XX調(diào)試--快速定位<b class='flag-5'>HardFault</b>

    嵌入式軟件程序HardFault異常的查找方法

    在嵌入式軟件開發(fā)中,因?yàn)榇a質(zhì)量不佳、線程沖突、棧溢出等問題,會(huì)造成Arm的HardFault。這種異常通常存在偶發(fā)性、不確定性、復(fù)現(xiàn)困難的特點(diǎn),同時(shí)復(fù)現(xiàn)后軟件已經(jīng)跑飛,程序在何處異常、異常時(shí)的臨時(shí)
    發(fā)表于 12-09 09:06 ?9次下載
    嵌入式軟件程序<b class='flag-5'>HardFault</b>異常的<b class='flag-5'>查找</b><b class='flag-5'>方法</b>

    怎么查找STM32的硬件錯(cuò)誤HardFault_Handler?

    在用Keil對(duì)STM32進(jìn)行仿真時(shí),可能會(huì)遇到程序停在HardFault_Handler中斷函數(shù)中。這說明STM32出現(xiàn)了硬件錯(cuò)誤。
    發(fā)表于 02-08 16:14 ?10次下載
    怎么<b class='flag-5'>查找</b>STM32的硬件錯(cuò)誤<b class='flag-5'>HardFault</b>_Handler?

    AT32講堂009 | 基于CmBacktrace庫,如何快速追蹤和定位產(chǎn)生HardFault的原因

    概述在使用ARMCortex-M系列MCU時(shí)(如AT32MCU),有時(shí)會(huì)出現(xiàn)程序運(yùn)行異常。當(dāng)通過編譯器在debug模式查原因時(shí),會(huì)發(fā)現(xiàn)程序跑到HardFault_Handler函數(shù)中,產(chǎn)生
    的頭像 發(fā)表于 06-15 10:44 ?4273次閱讀
    AT32講堂009 | 基于CmBacktrace庫,如何快速追蹤和定位產(chǎn)生<b class='flag-5'>HardFault</b>的原因

    ES32F36xx芯片發(fā)生HardFault異常時(shí)的函數(shù)調(diào)用關(guān)系及問題定位

    ES32F36xx芯片發(fā)生HardFault異常時(shí)的函數(shù)調(diào)用關(guān)系及問題定位
    的頭像 發(fā)表于 11-06 17:13 ?1037次閱讀
    ES32F<b class='flag-5'>36</b>xx芯片發(fā)生<b class='flag-5'>HardFault</b>異常時(shí)的函數(shù)調(diào)用關(guān)系及問題定位
    主站蜘蛛池模板: 亚洲卡5卡6卡7国色天香 | 91网视频在线观看 | 78m-78模成视频在线 | 久久精品乱子伦免费 | 乱轮黄色小说 | 年下系列高h文 | 久久精品五月天 | 老色网站 | 国产亚洲人成网站观看 | 色综合视频在线观看 | 日韩免费在线视频 | 人人揉揉香蕉大青草 | 亚洲电影天堂网 | 婷婷99精品国产97久久综合 | 啪啪色视频 | 日本肥妇 | 国产一级做a爰片久久毛片男 | 一区二区三区精品视频 | 国产亚洲精品aaa大片 | 日本成人a视频 | 韩彩英三级无删版甜性涩爱 | 免费成人黄色网址 | aaaa级日本片免费视频 | 亚洲欧洲精品成人久久曰影片 | 亚洲综合国产一区二区三区 | 一二三区视频 | 午夜两性色视频免费网站 | 五月欧美 | 久久婷婷国产精品香蕉 | 国产亚洲精品成人a在线 | 午夜在线观看免费高清在线播放 | 老色歌uuu26 老湿成人影院 | 一区二区三区无码高清视频 | 四虎国产在线观看 | 失禁h啪肉尿出来高h男男 | 丁香婷婷网 | 欧美亚洲视频一区 | 人成xxxwww免费视频 | 高颜值大长腿美女啪啪 | 中文字幕在线观看日剧网 | 能可以直接看的av网址 |