日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Cortex-M HardFault定位實戰(zhàn):從異常模型到現(xiàn)場追蹤

Cortex-M HardFault定位實戰(zhàn):從異常模型到現(xiàn)場追蹤 最近一直被HardFault折騰得頭皮發(fā)麻的兄弟或者剛接觸Cortex-M系列芯片、對異常處理機(jī)制還有點懵的新手這篇文章就是給你寫的。做嵌入式開發(fā)尤其是基于Cortex-M內(nèi)核的MCU開發(fā)幾乎沒人能繞開HardFault這個坎。它不像普通邏輯Bug那樣能靠肉眼掃代碼看出來往往是程序跑著跑著突然就掉進(jìn)一個死循環(huán)調(diào)試器一停PC指針指到一個莫名其妙的地址看門狗又跟著湊熱鬧整個系統(tǒng)直接癱瘓。我最早被HardFault支配的時候項目工期緊板子還只有一塊只能靠復(fù)位大法續(xù)命后來踩的坑多了才慢慢摸清楚這套異常處理機(jī)制的脾性。其實Cortex-M的異常和中斷處理是一個非常精巧的系統(tǒng)你把它搞明白了HardFault定位就是一道送分題。這篇文章不聊虛的直接從內(nèi)核異常模型講起把HardFault的根因、Cortex-M異常處理流程、借助Keil MDK進(jìn)行現(xiàn)場追蹤和調(diào)試的完整套路都掰開揉碎講清楚。無論你是用STM32、GD32還是其他Cortex-M內(nèi)核的國產(chǎn)MCU這套方法論全部通用保證你下次再遇到HardFault能少掉一大半頭發(fā)。1. 先吃透Cortex-M異常處理模型1.1 異常和中斷的底層關(guān)系很多初學(xué)者會把“異?!焙汀爸袛唷碑?dāng)成一回事其實在Cortex-M內(nèi)核里這兩個概念有明確的層級關(guān)系。從ARM官方手冊的定義來看異常Exception是所有打斷CPU正常執(zhí)行流程事件的統(tǒng)稱而中斷Interrupt只是異常的一個子集專指由外部引腳或內(nèi)部外設(shè)觸發(fā)的那一類。Cortex-M3/M4內(nèi)核把異常源按編號排了一張表編號越小優(yōu)先級越高這里說的優(yōu)先級是數(shù)字大小和實際優(yōu)先級高低相反。0號是棧頂?shù)刂?號是復(fù)位異常2號是NMI不可屏蔽中斷3號是硬故障HardFault4到10號分別是MemManage、BusFault、UsageFault以及幾個保留項11號是SVCall14號是PendSV15號是SysTick再往后就是外部中斷IRQ了也就是我們平時在STM32里配置的EXTI、UART、TIM等中斷。為什么要先講這張表因為HardFault在異常向量表里的位置是固定的3號它的優(yōu)先級默認(rèn)是-1比除NMI和復(fù)位之外的所有異常都要高。這就意味著一旦觸發(fā)HardFault除了NMI能插一腳其他任何中斷都沒法搶占它處理器會立刻跳轉(zhuǎn)到HardFault_Handler。反過來如果某個異常的處理程序在執(zhí)行過程中出了問題而它的優(yōu)先級又比HardFault低那么就會被HardFault吞掉不會再報原來的錯誤。這里有個非常容易踩的坑很多人在寫中斷服務(wù)函數(shù)的時候發(fā)現(xiàn)程序跑飛了但調(diào)試器彈出來的窗口指向的是HardFault_Handler于是就開始在HardFault里找原因。其實真正的錯誤源頭很可能是你的某個外設(shè)中斷里干了不合法的事HardFault只是被拉來“背鍋”的。所以定位HardFault的第一步是搞清楚它是主動觸發(fā)還是被動吞掉。1.2 異常處理的硬件自動壓棧機(jī)制Cortex-M在處理異常時有一個和傳統(tǒng)MCU內(nèi)核比如51、AVR完全不同的特點硬件自動壓棧。也就是說當(dāng)異常發(fā)生時CPU會自動把xPSR、PC、LR、R12、R3-R0這8個寄存器壓入當(dāng)前使用的??臻g這個過程不需要軟件干預(yù)是在異常入口處由硬件完成的一整套流水線操作。壓棧之后處理器會做什么它會從向量表中取出對應(yīng)異常的處理函數(shù)地址跳轉(zhuǎn)過去執(zhí)行。這個過程叫異常返回準(zhǔn)備硬件會把LR設(shè)置成一個特殊的值叫做EXC_RETURN這個值不是一個真實的內(nèi)存地址而是一個帶有特殊含義的標(biāo)記。比如0xFFFFFFF9表示從線程模式使用主棧指針MSP返回0xFFFFFFFD表示從線程模式使用進(jìn)程棧指針PSP返回0xFFFFFFF1表示從處理模式返回。如果你用了FPU比如Cortex-M4F還會看到0xFFFFFFE9和0xFFFFFFED這類帶FPU擴(kuò)展位標(biāo)記的值。理解這個機(jī)制對HardFault調(diào)試至關(guān)重要。因為當(dāng)你停在HardFault_Handler里時當(dāng)前棧頂保存的就是觸發(fā)異常那一刻的“案發(fā)現(xiàn)場”——那8個寄存器的值。只要能正確解讀這些值就能還原出CPU在異常發(fā)生前到底在執(zhí)行什么代碼PC指針指到哪個函數(shù)LR是哪個調(diào)用者以及R0-R3傳了什么參數(shù)。這套方法在后面我會詳細(xì)演示。1.3 為什么要理解異常模型而不是背流程有人可能會說我知道了HardFault的向量號是3也知道了硬件壓棧但這些對我的實際調(diào)試有什么幫助有而且?guī)椭艽?。舉個實際例子。我曾經(jīng)調(diào)一個電機(jī)驅(qū)動板現(xiàn)象是運行幾十秒后系統(tǒng)死機(jī)復(fù)位后又能跑一會兒。一開始我以為是看門狗問題關(guān)了看門狗再跑還是會死。后來我把硬件壓棧的知識用上在HardFault_Handler里把當(dāng)前棧指針的值讀出來然后按8個字32位系統(tǒng)一個字是4字節(jié)的偏移找到異常發(fā)生前的PC值再在反匯編窗口里定位到這個PC對應(yīng)的代碼位置結(jié)果發(fā)現(xiàn)是在一個電機(jī)電流采樣的DMA中斷里代碼試圖訪問一個已經(jīng)關(guān)閉了時鐘的外設(shè)寄存器。問題的根源是時鐘門控配置順序錯了導(dǎo)致中斷觸發(fā)時外設(shè)時鐘被關(guān)掉了總線訪問直接觸發(fā)BusFault又被HardFault吞掉。如果我不懂異常模型和壓棧機(jī)制單靠肉眼一行行看代碼這種隨機(jī)死機(jī)的問題可能要排查好幾天。但有了這套底層知識半小時不到就能鎖定肇事代碼。這就是我為什么堅持先講原理再講實戰(zhàn)的原因原理通了所有所謂的“疑難雜癥”都會變得有跡可循。2. HardFault根因大盤點到底是哪些場景最容易觸發(fā)2.1 存儲訪問類異常越界、未對齊、非法地址Cortex-M內(nèi)核的存儲系統(tǒng)有一個特點它把存儲訪問錯誤細(xì)分為好幾類在System Control BlockSCB里有三個非常關(guān)鍵的故障狀態(tài)寄存器分別是可配置故障狀態(tài)寄存器CFSR、硬故障狀態(tài)寄存器HFSR和故障地址寄存器MMFAR/BFAR。CFSR又拆成三個子區(qū)域內(nèi)存管理故障狀態(tài)寄存器MMFSR、總線故障狀態(tài)寄存器BFSR、用法故障狀態(tài)寄存器UFSR。實際調(diào)試?yán)镒畛R姷腍ardFault觸發(fā)原因匯總下來大概有這么幾類野指針訪問指針未初始化或者指向已經(jīng)釋放的內(nèi)存讀寫的時候直接踩到非法地址。數(shù)組越界尤其是寫入越界覆蓋了相鄰變量或者棧上的關(guān)鍵數(shù)據(jù)導(dǎo)致返回地址被破壞PC跳飛。棧溢出任務(wù)棧分配太小調(diào)用層級一深或者局部變量一多棧指針直接頂穿棧底寫到了不可訪問的區(qū)域。未對齊訪問Cortex-M3及以上內(nèi)核雖然支持部分非對齊訪問但對某些指令比如LDRD/STRD、LDM/STM以及訪問外設(shè)寄存器時非對齊會直接觸發(fā)UsageFault或者BusFault。訪問不存在的地址映射了外設(shè)的區(qū)域但外設(shè)時鐘沒開或者地址本身超出MCU的地址空間。前面兩類是新手最容易踩的也是面試官最愛問的因為它們能反映一個人對內(nèi)存布局的理解程度。我見過太多這樣的代碼定義一個全局?jǐn)?shù)組存數(shù)據(jù)然后根據(jù)某個變量對數(shù)組進(jìn)行寫入變量算出來是負(fù)數(shù)直接越界寫到了數(shù)組前面的內(nèi)存。在Cortex-M上這種越界寫有時候不會立刻觸發(fā)HardFault而是靜默地破壞了相鄰變量的值等程序邏輯表現(xiàn)出來的時候離真正的錯誤點已經(jīng)很遠(yuǎn)了。2.2 異常嵌套與優(yōu)先級配置的經(jīng)典坑Cortex-M內(nèi)置了嵌套向量中斷控制器NVIC它允許高優(yōu)先級中斷搶占低優(yōu)先級中斷。這個機(jī)制本身是好的但如果你在中斷服務(wù)函數(shù)里做了不該做的事就會引發(fā)連鎖反應(yīng)。最常見的幾個坑第一中斷服務(wù)函數(shù)里調(diào)用printf。printf內(nèi)部涉及文件系統(tǒng)級別的緩沖操作有些庫實現(xiàn)里不是可重入的。低優(yōu)先級中斷正在執(zhí)行printf的過程中被打斷高優(yōu)先級中斷里又調(diào)用了printf兩個printf的上下文互相踩踏棧上的返回地址被破壞程序直接HardFault。這個問題在帶RTOS的環(huán)境里更明顯因為每個任務(wù)的棧是獨立分配的但中斷棧在裸機(jī)環(huán)境下就是主棧大家共用。第二中斷里操作浮點寄存器。Cortex-M4F有FPUFPU的寄存器保存是惰性的默認(rèn)情況下中斷不保存FPU上下文只有真正用到浮點指令時才觸發(fā)自動保存。如果你在主程序里用了FPU又在中斷里用了FPU而RTOS的任務(wù)切換沒處理好FPU上下文就會出現(xiàn)FPU狀態(tài)寄存器值錯亂導(dǎo)致計算結(jié)果完全不對甚至觸發(fā)UsageFault。第三優(yōu)先級分組不一致。NVIC優(yōu)先級分組寄存器AIRCR可以配置優(yōu)先級的分組方式比如是“搶占優(yōu)先級4位子優(yōu)先級0位”還是“搶占優(yōu)先級3位子優(yōu)先級1位”。如果代碼里不同模塊分別在初始化時往AIRCR里寫分組配置后寫的會覆蓋先寫的整個系統(tǒng)的優(yōu)先級設(shè)定就會被攪亂某些原本應(yīng)該被屏蔽的低優(yōu)先級中斷突然搶占了高優(yōu)先級中斷時序錯亂最終可能引發(fā)HardFault。2.3 指令執(zhí)行類異常未定義指令、除零、狀態(tài)切換失誤還有一類HardFault是從指令執(zhí)行層面觸發(fā)的這類問題在啟用優(yōu)化等級之后尤其難以復(fù)現(xiàn)。典型場景包括函數(shù)指針調(diào)用錯誤函數(shù)指針被寫入了一個非法地址跳轉(zhuǎn)過去之后取到的指令全是不合法編碼觸發(fā)UsageFault。跳轉(zhuǎn)到Thumb/ARM狀態(tài)混亂Cortex-M只支持Thumb指令集如果某個函數(shù)指針的最低位置0了表示ARM狀態(tài)處理器在取指時就會出錯。這個在C代碼里很難遇到但在匯編或者從應(yīng)用里跳轉(zhuǎn)到Bootloader的時候容易出問題。除零操作Cortex-M默認(rèn)情況下整數(shù)除零不觸發(fā)異常但如果軟件里開啟了DIV_0_TRP位除零就會觸發(fā)UsageFault進(jìn)而被HardFault吞掉。未對齊的棧操作比如SP指針沒有保持8字節(jié)對齊在某些需要對齊訪問的LDRD/STRD指令上會直接觸發(fā)異常。這些場景有一個共同特點它們在正常代碼流程上是不會出現(xiàn)的往往是因為某個內(nèi)存被破壞導(dǎo)致PC跳到了錯誤的位置執(zhí)行了錯誤的指令。所以當(dāng)你發(fā)現(xiàn)HardFault是因為取到了一個未定義指令不要急著去查這條指令在哪里而應(yīng)該去查是誰把PC弄過去的——大部分情況是函數(shù)返回地址被篡改少部分是函數(shù)指針被污染。3. 調(diào)試實戰(zhàn)一套可復(fù)制的HardFault定位方法論3.1 現(xiàn)場恢復(fù)從Keil5中提取異常前PC值很多人遇到HardFault的第一反應(yīng)是直接在HardFault_Handler里打斷點然后點Run讓它停在斷點處。這個思路有一半是對的但如果你只在HardFault_Handler里打斷點你會發(fā)現(xiàn)一個尷尬的問題程序每次復(fù)位跑進(jìn)HardFault_Handler停下來的位置幾乎永遠(yuǎn)是同一個地方那就是HardFault_Handler的第一行匯編指令。這個信息量太少了你根本不知道是誰觸發(fā)它的。正確的做法是當(dāng)程序停在HardFault_Handler時先從寄存器窗口讀取當(dāng)前的SP值。關(guān)鍵點來了怎么知道這個SP是MSP還是PSP看LR寄存器如果LR的值是0xFFFFFFF9說明當(dāng)前在處理模式用的是MSP如果LR的值是0xFFFFFFED說明異常返回目標(biāo)是線程模式且使用PSP那當(dāng)前用的棧指針需要從進(jìn)程棧指針寄存器里單獨讀取。拿到SP之后從SP指向的地址開始向上讀取內(nèi)存前8個字就是異常發(fā)生前硬件自動壓棧的現(xiàn)場偏移0是R0偏移4是R1偏移8是R2偏移12是R3偏移16是R12偏移20是LR偏移24是PC偏移28是xPSR。在Keil的Memory窗口里輸入SP地址直接就能把這8個值讀出來。其中最重要的是偏移24處的PC它就是異常發(fā)生那一刻CPU正在執(zhí)行的指令地址。這個步驟在Keil5里操作非常簡單程序停在HardFault_Handler后打開View菜單里的Registers窗口找到SP再打開Memory窗口輸入SP的值回車就能看到一長串?dāng)?shù)據(jù)。把偏移24個字處即地址SP0x18的數(shù)值取出來這個就是我們要找的PC。然后在Disassembly窗口里輸入這個PC地址回車就能看到對應(yīng)的匯編指令再對照源代碼窗口基本就能定位到肇事代碼行。3.2 深入理解EXC_RETURN別被LR騙了在HardFault現(xiàn)場讀取寄存器時有一個細(xì)節(jié)容易讓人迷惑在壓棧數(shù)據(jù)偏移20處確實有一個LR但它不是異常發(fā)生前的調(diào)用者LR。這個LR是CPU在進(jìn)入異常時自動壓棧的它保存的是觸發(fā)異常那一條指令的“返回地址”準(zhǔn)確說是觸發(fā)異常的指令地址加上一定偏移可能指向BL指令的下一條指令地址也就是調(diào)用者真正要返回去執(zhí)行的地方。而CPU當(dāng)前的LR寄存器里保存的是一個EXC_RETURN它根本不是一個真實地址。我見過很多人在HardFault調(diào)試時看到寄存器窗口里L(fēng)R的值是0xFFFFFFF9然后把它當(dāng)作調(diào)用鏈里的一個函數(shù)地址拿來查結(jié)果在反匯編窗口里輸入這個地址之后發(fā)現(xiàn)根本查不到有效代碼——因為0xFFFFFFF9就不是一個地址。所以一定要記住異?,F(xiàn)場的調(diào)用關(guān)系要看壓棧數(shù)據(jù)里的舊LR而不是當(dāng)前的LR寄存器。當(dāng)前LR寄存器里那個0xFFFFFFF9/0xFFFFFFED是用來告訴硬件“異常返回時用什么模式、用哪個棧指針”的。如果你用的是帶FPU的Cortex-M4F或M7壓棧的數(shù)據(jù)結(jié)構(gòu)會不一樣。當(dāng)異常發(fā)生時硬件檢測到當(dāng)前上下文使用了FPU會自動多壓18個字16個FPU寄存器S0-S15加FPSCR加一個保留字。這種情況下SP指向的第一組8個字仍然是R0-R3、R12、LR、PC、xPSR但在這組數(shù)據(jù)之后緊接著的是FPU寄存器區(qū)。判斷是否發(fā)生了FPU壓??碋XC_RETURN的最后一位如果是1表示有FPU壓棧。比如0xFFFFFFED這個值最后一位已經(jīng)無法直接區(qū)分但對照寄存器窗口的EXC_RETURN位或者直接看壓棧數(shù)據(jù)的長度都能確認(rèn)。3.3 借助CFSR、HFSR和BFAR/MMFAR縮小故障范圍光拿到PC還不夠我們需要知道HardFault為什么被觸發(fā)。前文提到過的故障狀態(tài)寄存器此刻就是最重要的證據(jù)來源。在Keil5里通過Peripherals菜單下的Core Peripherals、Fault Reports窗口能看到一份易讀的故障信息匯總。這個窗口會把CFSR里的每一位解析成人話比如“Instruction Bus Error”“Data Bus Error”“Unaligned Access”等還會顯示HFSR里的FORCED位是否置1以及保存了觸發(fā)總線故障或內(nèi)存管理故障的具體地址的BFAR、MMFAR。如果你不想開圖形窗口也可以在Watch窗口手動添加寄存器表達(dá)式(volatile unsigned long)0xE000ED28就是CFSR的地址0xE000ED2C是HFSR0xE000ED38是BFAR0xE000ED34是MMFAR。我自己調(diào)試時有一套固定流程先讀HFSR看FORCED位是不是1。如果是說明下面肯定有一個具體的可配置異常被觸發(fā)過繼續(xù)讀CFSR對應(yīng)子區(qū)域。如果CFSR里的MMFSR有置位說明是內(nèi)存管理故障結(jié)合MMFAR的值看是訪問了哪個地址。如果BFSR有置位說明是總線故障結(jié)合BFAR看地址。如果UFSR有置位比如UNALIGNED位為1說明是未對齊訪問結(jié)合PC反匯編看具體是哪條指令。這里有一個值得注意的點如果BFAR/MMFAR的值是0并不意味著沒有訪問故障而是意味著CPU沒有捕獲到有效的故障地址。這種情況經(jīng)常發(fā)生在指令預(yù)取階段也就是CPU去取一條非法指令時發(fā)生了總線錯誤這時候不會更新BFAR。所以要結(jié)合PC一起判斷不能只看地址寄存器。3.4 基于LR的調(diào)用?;厮菁记赡玫疆惓G暗腜C和舊LR之后我們其實已經(jīng)能確定是哪個函數(shù)里出的問題。但如果PC落在一個比較靠后的工具函數(shù)里比如memcpy或一個數(shù)學(xué)庫函數(shù)內(nèi)部光是看到PC還不夠——我們需要知道是誰調(diào)用了這個函數(shù)才能理解整個觸發(fā)鏈路。這個時候就要用到調(diào)用?;厮?。手動回溯的原理是棧指針SP指向的壓棧數(shù)據(jù)里偏移20處保存的是進(jìn)入異常前的LR它指向調(diào)用者的下一條指令沿著這個“函數(shù)返回地址”的鏈條再往上追一級需要知道當(dāng)前函數(shù)的棧幀是怎么建立的。Cortex-M的AAPCS過程調(diào)用標(biāo)準(zhǔn)規(guī)定函數(shù)入口處通常會有PUSH {r4, lr}這樣的指令也就是把被調(diào)用者保存寄存器R4-R11和鏈接寄存器LR都壓到棧上。如果我們在異常前的PC處往回看幾條指令能確認(rèn)這個函數(shù)確實有PUSH {lr}操作那么當(dāng)前SP加上壓棧偏移再往里找就能找到上一層函數(shù)的LR以此類推能還原出完整調(diào)用鏈。在Keil5里更簡單的方案是直接使用Call Stack窗口。當(dāng)程序停在HardFault_Handler時打開View—Call Stack WindowKeil會根據(jù)當(dāng)前棧內(nèi)容自動解析調(diào)用鏈。但注意自動解析有時候依賴調(diào)試信息如果你開啟了較高的優(yōu)化等級比如-O2/-O3很多棧幀信息被優(yōu)化掉了Keil解析出來的調(diào)用關(guān)系可能不準(zhǔn)甚至?xí)箦e。這種情況下手動從壓棧數(shù)據(jù)里讀PC和LR是唯一可靠的方法這也是我把手工回溯放在這里重點講的原因。3.5 Keil5中的高效輔助調(diào)試手段除了上面這些偏底層的分析方法Keil5本身還提供了一些非常實用的輔助功能用好了能大幅提升定位效率。第一個是硬件斷點和數(shù)據(jù)斷點。如果HardFault的觸發(fā)和某個特定變量的寫入相關(guān)可以在Keil里給這個變量打數(shù)據(jù)斷點Data Breakpoint這樣當(dāng)代碼試圖修改這個變量時CPU會立刻停下來調(diào)用棧就是完整的調(diào)用者信息。這在排查棧溢出和數(shù)組越界寫時特別有效。數(shù)據(jù)斷點數(shù)量有限Cortex-M3/M4一般支持4個但用來盯一兩個關(guān)鍵變量足夠了。第二個是異常窗口Fault Reports結(jié)合邏輯分析儀。Keil5的Fault Reports不僅能顯示CFSR/HFSR的解析結(jié)果還能顯示是哪個異常號觸發(fā)的。配合邏輯分析儀窗口觀察若干GPIO電平可以判斷異常發(fā)生的時間和外部事件的時序關(guān)系。比如之前排查一個通信模塊隨機(jī)死機(jī)的問題我用GPIO在中斷入口和出口各翻轉(zhuǎn)一次然后用邏輯分析儀抓異常發(fā)生時刻附近的引腳電平很快發(fā)現(xiàn)是兩路中斷的優(yōu)先級配置反了導(dǎo)致高優(yōu)先級中斷在低優(yōu)先級中斷的臨界區(qū)里被觸發(fā)破壞了協(xié)議棧的狀態(tài)機(jī)。第三個是棧使用量檢測。在Options for Target—Target窗口里勾選“Use MicroLIB”并在Linker頁面勾選“Use Memory Layout from Target Dialog”然后在代碼里調(diào)用__get_MSP()和__get_PSP()讀取當(dāng)前棧指針比對棧底地址就能計算出剩余棧空間。配合Keil的“Stack Usage”分析編譯后從View—Analysis Window—Stack Usage看可以評估每個函數(shù)的棧消耗。這個功能在排查棧溢出HardFault時非常直觀基本能把問題縮小到具體任務(wù)。4. 常見問題與排查技巧實錄4.1 一個典型問題no cortex-m sw device found結(jié)合熱搜詞里出現(xiàn)頻率很高的一個問題“no cortex-m sw device found”這類問題雖然不算HardFault本身但和HardFault調(diào)試強(qiáng)相關(guān)。最簡單的情形是程序跑飛后進(jìn)入HardFault然后你點Keil的Debug按鈕結(jié)果彈出“no cortex-m sw device found”根本連不上調(diào)試器。這通常不是調(diào)試器壞了而是目標(biāo)芯片在死機(jī)狀態(tài)下把SWJ調(diào)試端口占用了或者時鐘配置被改掉了調(diào)試器復(fù)位之后握不上手。解決辦法分兩種。如果目標(biāo)芯片還在響應(yīng)復(fù)位可以在Keil的Debug—Settings里把Reset and Run選項打開或者在連接失敗時按住目標(biāo)板上的復(fù)位鍵然后點擊Debug在松開的瞬間讓它握上SWD握手信號。更穩(wěn)妥的方案是用一個腳本文件在調(diào)試器初始化時先讓芯片保持在復(fù)位狀態(tài)配置好SWD速度后再釋放復(fù)位。對于STM32系列有些型號還支持通過BOOT0拉高進(jìn)入系統(tǒng)Bootloader模式此時內(nèi)核運行在出廠固件上SWD端口必然是釋放的連接成功后把BOOT0拉回低電平就能正常刷固件和調(diào)試了。如果你用的是國產(chǎn)MCU比如GD32、AT32這些SWD連接失敗的原因還要多排查一個讀保護(hù)。很多國產(chǎn)芯片默認(rèn)出廠時讀保護(hù)是使能的或者你在調(diào)試過程中不小心開啟了讀保護(hù)級別1這會導(dǎo)致調(diào)試器無法通過SWD訪問內(nèi)核。解決辦法是用對應(yīng)的燒錄工具執(zhí)行全片擦除解除讀保護(hù)。我在一次GD32的調(diào)試中就遇到過程序跑到某處觸發(fā)了HardFault但重置之后居然連不上調(diào)試器最后發(fā)現(xiàn)是代碼里某段錯誤的存儲區(qū)寫操作意外修改了選項字節(jié)把讀保護(hù)打開了。4.2 HardFault發(fā)生的時機(jī)隨機(jī)如何復(fù)現(xiàn)和抓取HardFault最折磨人的一點是它有時候不是100%復(fù)現(xiàn)的。你在調(diào)試器下跑幾十次都好好的一上電裸跑可能幾分鐘就死一次。這類“幽靈式”死機(jī)通常有幾種原因時序相關(guān)的資源競爭中斷和主循環(huán)同時訪問共享變量、堆棧踩踏發(fā)生在特定函數(shù)調(diào)用組合下、以及硬件外設(shè)的偶發(fā)錯誤狀態(tài)。我的經(jīng)驗是先開啟MPU內(nèi)存保護(hù)單元來構(gòu)造一個隔離環(huán)境。Cortex-M3及以上內(nèi)核幾乎都帶MPU配置它可以給不同內(nèi)存區(qū)域設(shè)置訪問權(quán)限。比如把棧區(qū)所在的內(nèi)存塊設(shè)置為只讀的一旦發(fā)生棧越界寫入MemeManage異常會立刻觸發(fā)——這個異??梢酝ㄟ^中斷向量直接跳轉(zhuǎn)配合調(diào)試器的斷點能精準(zhǔn)捕獲到越界寫入的第一現(xiàn)場。這個技巧對排查棧溢出簡直不要太爽不用靠猜直接讓硬件替你盯著。如果復(fù)現(xiàn)是隨機(jī)的還可以利用Cortex-M內(nèi)核的異常返回機(jī)制做“二次觸發(fā)”設(shè)計。簡單說在HardFault_Handler里不直接死循環(huán)而是把MSP的值修正為初始值然后重新跳轉(zhuǎn)到復(fù)位向量讓系統(tǒng)軟復(fù)位。這樣雖然程序重啟了但在重啟前把故障現(xiàn)場的關(guān)鍵寄存器PC、LR、CFSR、BFAR通過一個保留內(nèi)存區(qū)域保存下來系統(tǒng)恢復(fù)后可以通過串口打印或者調(diào)試器查看。這種方式在生產(chǎn)環(huán)境下是終端產(chǎn)品的一個保底方案正常運行時不打斷業(yè)務(wù)故障出現(xiàn)時能把現(xiàn)場留給工程師。4.3 Keil5里遇HardFault的幾條高效操作口訣我把自己多年Debug開發(fā)過程里驗證過的操作整理成了幾條口訣式清單配合上面講的方法論使用定位HardFault基本能控制在幾分鐘內(nèi)一是“一定位、二看壓、三讀故障”。所謂一定位是讓程序停在HardFault_Handler時先別慌通過寄存器窗口和棧信息定位當(dāng)前SP二看壓是讀取壓棧的8個字拿到異常發(fā)生前的PC和LR三讀故障是看CFSR/HFSR的解析結(jié)果確認(rèn)屬于哪類故障并抓住BFAR/MMFAR。二是“先棧后碼”。排查HardFault時優(yōu)先檢查棧的完整性看SP地址是否落在合法區(qū)間內(nèi)壓棧內(nèi)容里PC是否指向一個合理代碼地址比如ROM范圍內(nèi)LR是否指向一個有效的調(diào)用者。很多時候棧已經(jīng)被踩得面目全非PC指向的是一個類似于0x0800xxxx的保留地址說明返回地址被覆蓋了這時候與其去分析那條非法PC不如順著棧底往上找看哪個區(qū)域被寫入了不該寫的數(shù)據(jù)往往能揪出越界寫和緩沖區(qū)溢出。三是“優(yōu)化等級降一降”。HardFault和編譯器優(yōu)化等級的關(guān)系非常密切。很多代碼在高優(yōu)化等級-O2以上下行為和-O0完全不同因為編譯器可能會省去一些邊界檢查、重排表達(dá)式、把局部變量直接映射到寄存器。當(dāng)你用-O0能跑通、用-O2就HardFault時先別懷疑芯片也別盲目加volatile——先看反匯編確認(rèn)是不是優(yōu)化導(dǎo)致了某個變量在你預(yù)期的時間點還沒被寫回內(nèi)存或者某個中斷里讀取的共享標(biāo)志被優(yōu)化成了寄存器緩存。實在不行對可疑模塊單獨關(guān)閉優(yōu)化這是最直接的止損手段。四是“多路檢查不迷信單點現(xiàn)象”。舉個例子有些HardFault彈窗時當(dāng)前PC停在HardFault_Handler函數(shù)調(diào)用棧窗口里顯示的都是HardFault_Handler附近的信息僅憑這個現(xiàn)象你可能會以為是HardFault_Handler自己的代碼問題。其實不然因為編譯器把故障代碼編進(jìn)了同一個文件調(diào)試器展示的調(diào)用棧信息是“物理上等價”的。正確做法是回到現(xiàn)場數(shù)據(jù)層面以壓棧PC和CFSR為準(zhǔn)不要被調(diào)試器的可視化結(jié)果帶偏。4.4 從HardFault再往前一步寫一個故障記錄模塊追著HardFault打補(bǔ)丁是被動的我更推薦每個項目在開發(fā)階段就內(nèi)置一個故障記錄模塊代碼量不大但能在后續(xù)所有調(diào)試中節(jié)省大量時間。這個模塊的核心就兩件事第一在HardFault_Handler里把現(xiàn)場數(shù)據(jù)PC、LR、SP、CFSR、HFSR、BFAR/MMFAR、R0-R3、R12、xPSR保存到一個固定的內(nèi)存區(qū)域第二把保存的現(xiàn)場數(shù)據(jù)在系統(tǒng)重啟后通過串口或者調(diào)試信息輸出出來。存儲區(qū)域的位置需要動一點腦筋。如果直接定義一個全局結(jié)構(gòu)體變量那么它會被編譯器分配到RAM的某個位置如果RAM的初始化過程出問題現(xiàn)場數(shù)據(jù)可能被覆蓋掉。更穩(wěn)妥的方案是用鏈接腳本手動指定一個保留區(qū)域放在棧頂?shù)刂分盎蛘咄ㄟ^__attribute__((section(.noinit)))標(biāo)記到不掉電的SRAM段。這樣即使系統(tǒng)重啟了只要不掉電現(xiàn)場數(shù)據(jù)還能讀到。串口打印的時候建議用十六進(jìn)制原始格式不要做太復(fù)雜的格式化因為故障模式下堆棧狀態(tài)可能不穩(wěn)定用太復(fù)雜的庫反而容易二次故障。我習(xí)慣的格式是FAULT_INFO PC0x08001234 LR0x08004567 SP0x20000ABC CFSR0x00008200 HFSR0x40000000 BFAR0x00000000 MMFAR0x20000000 R00x00000001 R10x00000000 ...打印完之后再根據(jù)PC地址去工程里定位具體代碼位置配合反匯編基本就能鎖定問題。這個模塊建議在項目初期就加上成本極低但收益巨大。順便說一句如果你的項目用了RTOS故障記錄模塊里最好也保存當(dāng)前任務(wù)句柄或任務(wù)名信息因為很多HardFault和任務(wù)切換相關(guān)知道是哪個任務(wù)出事的排查范圍能縮小很多。4.5 常見問題速查表現(xiàn)象可能原因排查要點解決建議HardFault_Handler里PC指向非法地址棧溢出或返回地址被篡改檢查棧頂和SP差值、壓棧區(qū)的PC值增大??臻g檢查緩沖區(qū)越界CFSR的BFSR位置位BFAR不為0數(shù)據(jù)訪問觸發(fā)了總線故障看BFAR訪問的是哪個地址檢查外設(shè)時鐘、地址空間合法性CFSR的UNALIGNED位置位開啟了對未對齊訪問的陷阱定位到具體訪問指令檢查數(shù)據(jù)結(jié)構(gòu)對齊或關(guān)閉該陷阱HFSR的FORCED位置位CFSR全0嵌套異常導(dǎo)致無法上報檢查異常返回和棧狀態(tài)減小中斷里復(fù)雜操作增加棧深度出現(xiàn)HardFault后連不上調(diào)試器SWD接口被占用或讀保護(hù)開啟按復(fù)位鍵連接檢查選項字節(jié)短接NRST或使用Bootloader模式優(yōu)化后才能復(fù)現(xiàn)HardFault編譯優(yōu)化引入了時序/內(nèi)存差異反匯編關(guān)鍵函數(shù)對比-O0和-O2局部關(guān)優(yōu)化或重寫臨界區(qū)邏輯HardFault伴隨FPU相關(guān)異常FPU上下文保存不完整檢查RTOS任務(wù)切換對FPU的處理開啟FPU惰性壓棧或啟用任務(wù)級FPU保存表格里列出的這幾種情況基本覆蓋了我日常開發(fā)中九成的HardFault問題。尤其是第一條“返回地址被篡改”我再單獨多說一句它在棧回溯時表現(xiàn)特別迷惑因為PC壞得很徹底反匯編窗口跳到一片空白或保留區(qū)域。遇到這種情況不要死磕PC回到棧區(qū)往上找看棧里有沒有出現(xiàn)“很規(guī)律”的填充數(shù)據(jù)比如0xA5A5A5A5或全0這種填充數(shù)據(jù)往往是緩沖區(qū)沒有初始化或者棧保護(hù)魔數(shù)從它們被破壞的位置就能反推是哪一段越界寫導(dǎo)致的。5. 寫在最后的心得跟HardFault打了這么多年交道我最大的體會是它不是一個“玄學(xué)問題”而是有一套固定邏輯鏈路的工程問題。你越是靠運氣去復(fù)位、重試它就越折磨你你越是把異常模型、壓棧機(jī)制、故障狀態(tài)寄存器這些底層知識吃透它反而越聽話甚至能變成你定位內(nèi)存問題、時序問題的一把利器。最后再分享一個我每次都會檢查的細(xì)節(jié)在寫中斷服務(wù)函數(shù)時盡量讓代碼保持短小精悍不在中斷里做printf、malloc、延時這類操作每個中斷都加上對參數(shù)合法性的檢查對共享變量加上保護(hù)。這些老生常談的規(guī)則每一條背后其實都是HardFault的血淚教訓(xùn)。認(rèn)真去執(zhí)行你開發(fā)中遇到的HardFault概率至少能降一半。剩下的一半用前面講的那套方法也能快速定位、體面收場。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
天美传媒精品一区二区三区| 亚洲天堂人妻熟妇视频| 日韩99神马视频片| 久久精品店| 国产精品一区在线播放| 欧美亚洲成人在线一区二区三区| 高清不卡一二三区视频......| 中文字幕乱妇免费视频| 中文字幕乱码人妻一区二区三区,99精品| AAAA欧美日韩| 中文字幕丰满人妻日本| 夜夜夜夜久久久久| 1000午夜黄色| 日韩国产十八禁| 狠狠穞A片一區二區三區| AV一区观看| 啊啊啊骚| 久久久精品久久| 这里只有精品视频在线| 五月天激情婷婷| 无码高清专| 手机午夜电影神马久久| 久9re热视频这里只有精品| 青青草字幕AV| 久草男人天堂| 综合日韩激情另类图片| 天天欧美色| 中文久久爆乳| 亚洲一区二区三区四区视频| 亚欧毛片基地国产毛片基地| 日本视频一区二区三区| 国产区性爱在线视频秋霞豆| 91影库| 快灬快灬 一下爽蜜桃在线观看| 蜜臀在线免费观看在线免费观看| 精品四五区| 一区在线观看中文字幕| 第一高清av中文字幕| 95自拍视频在线观看| 青青草在线成人视频| 另类老少妇| 美女国产一区二区久久| 女人爽到高潮潮喷18禁网站| 先锋精品av色鲁| 久久久久久99999国产精品| 久久久久久久9最新免费视频观看| 国产啊v在线免费播放| 呦呦一区| 另类小说欧美激情校园春色| 91黑人狂躁丰满熟妇| 日本97久久| 啊啊啊啊好大好硬啊啊啊啊啊| 久久AV无码1区2区3区| 日产狠狠干| 久99热| 人、人、摸,人、人、草| 日本精品无码三级网站| 亚洲欧美日韩精品久久久一区二区| 操逼视频国产无套| 大学生美女口爆| 一个色导综合| 91一起操| 亚洲中文字幕有码视频一区二区三区| 操逼999| 欧美 日韩 另类 亚洲| 久久亚洲熟妇在线视频| 97国产精品久久久久| 欧美成97爱| 男人亚洲天堂| 欧亚乱色熟女一区二区| 91人妻Pr| 国产乱码久久| 香港日本韩国人妇99www.wccm20| 国产性爱欧美性爱在线| 极品人妻少妇综合| 欧美一区二区三区不卡高清视频| 精品成人无码| 综合色啪| 色性综合| 欧美精品久久| 国产精品精品系列在线观看| 丰满岳乱妇一区二区三区| 手机在线观看不卡无码av| 色综合色欲色综合色综合色综合| 中文字幕版| 婷婷三区| 中文字幕第95页| 搡老女人老91妇女老熟女| 亚洲欧洲自拍图片专区满春格| 精品一区二区成人| 青青草色情网站视频| 欧美亚州综合网图片| 欧美18老人禁| 妺妺跟我一起洗澡没忍住| 日韩情色视频| 欧美激情亚洲情色| 国产辣妈在线视频福利| 久久性爱城| 磁力99AV| 欧美亚洲国产91在线| 秋霞一级视频在线观看免费| 加勒比日本在线| 亚洲成人日韩小说| 夜夜爽爽爽| 亚洲国产青青| TS人妖另类精品视频系列| 性影在线视频| 天天干人妻| 日日夜夜精品视频| 国产熟女免费观看久久| 欧美制服另类丝袜| 亚洲久9| 97在线精品观看视频| 亚洲,欧美,春色,另类| 69久久久久久久久久久久久| 亚洲春色欧美激情自拍| 亚洲激情网一二三四区| 日日骚网站| 333kkkk·亚洲com久久| 黄呦呦在线| 久久久久97| 欧美日韩第一页| 亚州欧美总和| 97国产高清视频在线观看| 好看的91视频| 岛国艾薇凹凸视频天堂| 乱欲性色| 99热在线播放| 一本久道在线综合视频| 国产精品久久久久999| 日韩性爱视频免费在线| 国产精品黄色三级av| 中亚精品极乱| 亚洲欧美精品福利在线| 97超碰免费生活| 无码人妻精品一区二区三区九九| 日韩国产欧美伦理在线| 亚洲少妇喷视频看| 亚洲无码电影久久久| 亚洲婷婷五月天| 久久精品99| 懂色天天爱天天日天天射天天澡| 久久99草| AA特级绝黄| 男女性扦B| 91亚洲黑人| 中文字幕人妻丝袜乱一区三区| 九九aV| 亚洲日本大香蕉1| 亚洲九月丁香| 东京热91| 欧美日韩黄色片一区二区三区四区人与兽做爱 | 成人97人人超碰人人| 欧美激情综合色综合啪啪五月| 亚洲天堂久| 99综合视频| 天天干人人乐| 欧美亚洲高清晰| 99热这里都是精品| 亚洲一区制服诱惑| 无码9区| 久久久久9999妇女| 久久九九精品一区二区 | 992大香蕉| 成人电影一区| 鸡巴插逼视频| 亚洲欧美小说| 日韩欧美被操黄免费观看| 国产精品亚洲一级av第二区| av天堂电影网| 牛牛久久国产精品视频一二三| 免费在线黄片视频| 三级色影综合网| 久久日本熟妇熟色高清| 在线性黄高清免费视频| 免费福利视频中文字幕| 四季av一区二区凹凸精品小说| 99九九久久| 亚洲精品无码久久AV| 精品丰满熟妇人妻一区| 日韩成人无码| 91精品国产乱码| www.91色| 丝袜剧情| 国产无码精品高清| 国产精品乱码久久| 成人一区二区三区四区| 天天色悠悠激情| 美女午夜福利免费视频| 一区二区影视| 凌辱美少妇久久aV| 亚洲色图 综合| 超碰99热中文字幕| 色精品极品| 亚洲一本色道中文无码aV天美| 亚洲开心网| 久久久久78| 欧美日韩国产中文精品字幕自在自线,| 国产真乱mangent| 91色亚洲| 精品视频一区二区| 久久久久国产| 久操网在线| 天天操女人| 中国女人内射6XXXXX| 亚洲97| 日曰骚久久精品| 97在线无精品| 欧美高清性猛交| 91精品久久久久久综合五月天| 18禁美女裸体无遮挡啪啪| 国产午夜在线观看| 日日摸天天爽夜夜欢| 久久精品91| 日韩精品系列| 大香蕉日亚洲日本亚大| 制服诱惑亚洲一区二区三区在线观看| 一区,二区,三区视频| 18一区二区三区| 九九AV| 97操操| av婷婷色婷婷色六月| 狼狼色丁香久久婷婷综合五月| 国产精品乱码久久| 91精品人妻偷情| 国产毛片片精品天天看视频| 好爽视频在线观看| 男同专区一区二区三区在线| 春色91| 欧美丰满少妇交换91欧美精品| 9ⅰ久久久天天| 欧美线天码中字| 亚洲成人一区二区精品| 91成人无码| 亚洲婷婷丁香在线| 日韩欧美加勒比| 国产日韩精品suv| 成人五月天丁香激情综合| 欧美日韩一二三| 啊啊啊啊啊啊啊啊在线观看| 欧美碰碰综合色| 九九热精品视频六| 男人的天堂视频精品乱在线| 九九九九九九九九九国产精品| 一区超碰一区| JuliaAnn丝袜熟女系列| 91青青草| 91社操逼| 美女尤物福利视频| 欧美国产有色电影| 欧美人妖内射| 久久久久人妻二区精品叶可怜| 国产成人精品必看| 嫖老熟女A片一二三区| 国产毛片精品一区二区色欲黄A片| 中日高清无码操逼视频| 精品久久久久黄少妇| 欧美日韩一干二干| 91痴汉| 久操97| 秋霞无码av鲁丝片一区| 丁香色五月 97干| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 中亚黄色三级大片| 人人操人人肉久久精品| 天天摸夜夜添无码小视频| 国产 丝袜 欧美中文 另类| 夜夜爽77777| 伦在线97| 久久老女人| 国产精品熟女九色九色蜜臀| 麻豆60秒| 91日韩网站| 亚洲AV成人无码一二三久久| 嗯嗯嗯啊啊啊在线免费观看| 欧美第五页| 日韩av免费一级电影| 91婷婷| 久久久久久久久久久久九| 久久无码精品| 涩五月婷婷| 91网18| 久久久久久久久久久久色网| 日韩无码a片| 无码99| 白嫩91在线亚洲| 午夜男女爽爽大片免费观看| 亚洲色图大香| 超清中文乱码字幕| 蜜桃精品一区二区三区ww| 破处bbq| 人妻一二三区| 91夜色chaopeng| 亚洲丝袜诱惑| 91成人在线免费视频| 人妻一区久久二区三区色播| 亚洲av成人精品一区| 国产成人+综合亚洲+天堂| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 国产v亚洲v日韩v欧美v片另类| 综合色99| 黄久久| 久久久久亚洲三级电影| 97视频在| 国产AAAAAABBBBB| 很黄很污的免费网站| 一区二区三区四区理论片| 欧美黄片视频在线观看免费 | 东北夫妻性偷拍| 天天欧美| 激情自拍 校园春色| 9久久精品| 色色热| 黄页av| 麻豆久久视频在线地址| 偷拍 亚洲 欧美| 91精品电影18| 人人操我人人干| 美腿丝袜高跟网免费视频免费视频| 东北女人性交| 2011国产精品| 精品久久久av无码免费| 国产专区路线| 91香蕉视频在线观看免费| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 婷婷激情一区二区三区俺也去| 香蕉人欧美综合| 九九视品黄色| 操逼天美3区| 人人操人人精品影片| 日韩av乱伦| 777超碰| 不卡人妻少妇精品毛片一区23区视频| 久久性爱精品一区| 学生妹天天看| 综合久久婷婷| 无码直播久久久| 亚洲综合九| 日本中文字幕在线视频| 超碰地址久久| 999综合色| 色色色色网站| 91在线视频国产网站| www.99热在线只有精品| 美女黄色一级A视频| 国产色产精品在线观看| 久久r精品| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 激情五月天网站| 免费人成毛片乱码| 国产97在线播放| 99青草| 高清成年美女黄网站免费大全| 91天天综合在线观看| 青草青青久久久久久国产| 日韩在线一区高清在线| 亚洲毛片基地专区| 亚洲极品| 中出789在线视频| 99色热国产视频精品| 精精品人妻一区二区三区| 欧美熟妇操操视频| 嗯~啊~快点 死我视频| 约操熟妇| 日韩无码一级黄色av片| 麻豆亚洲AV成人无码久久精品| 狠狠搞 亚洲91| 五月婷婷综合激情| 国产又黄又粗的视频| 九久精品| 秋霞鲁丝午夜无码一区二区三| 曰韩精品九九无码| 免费综合亚洲中文| av在线免费一区二区| 日本不卡一区二区| 四虎影视欧美| 天堂av最新电影网| 97久久精品国产| 欧美色偷拍 | 色眯眯射| 偷窥自拍亚洲天堂网爆| 亚州高清av| 一区二区三区男女操逼黄色小电影| 五月丁香六月婷综合成人综合| 亚洲无码国产探花在线观看| julia ann久久| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 天堂亚洲精品| 啊啊啊啊在线播放| 国产99999久久精品| 精品人妻一区二区三区-国产精品 一个人在线看的黄色电影网站 | av在线免费一区二区| 欧美成人一级麻豆| 日本孕妇一区二区视频操逼免费看| 亚洲欧洲日韩中文字幕一区| 精品1区2区3区| 一区二区不卡免费| 天天综合,91入口| 国产女人9999| 久久人体一区二区| 色狠狠一区二区三区香蕉| 超碰在97| 中文字幕色AV| 97视频免费播放| 91在线观看,天天综合| 蜜臀Av一区二区三区| 97资源站国产精品| 精品78| 黄色工厂这里只有精品| 麻豆国产精品午夜视频| 一区二区三区黄色片a| 一区二区三区视频| 日韩国产精品人妻无码久久久| 97免费在线观看| 日本色色色网站免费看不卡| 欧美v日韩v亚洲v最新在线| 国产高清亚洲日韩一区| 日本精品网站在线中文| 欧美系列在线一区二区| 丝袜大香蕉| 欧美啪啪天堂| 欧美97色| 国产精品女生av| 性做久久久久久久| 亚洲国产激情国产av| 天天做天天爽| 国产久久一区二区三区野外在线| 色综合99999| 欧美,日韩,中文,另类| 99re久久| 风流老熟女一区二区三区l| 精品婷婷| 啊嗯好大视频在线观看| 黄站在线免费观看| 精品视频一区二区| 久久一区二区三区入口| 蜜臀久久99精品久久久久久久久| 韩国三级三级BD在线| 91色堂| 猛猛干| 性爱Av免费| www.夜夜操| 超碰综合色| 欧美精品系列| 日本 色 导航| 亚洲精品欧美专业| 日本Suv精品一区二区| 成人线上超碰| 欧美一区二区日韩三区| 淮穴色AV| 少妇蹲下买菜露大唇0| 亚洲欧美日韩中文播放| 麻豆这里只有精品| 强奸少妇AV导航网| 亚洲图片欧美色| 欧美v亚洲v日韩v最新在线二区| 亚洲日韩肥臀视频在线观看| 国产日韩中文字幕欧美| 日韩亚洲中文有码视频| 国产欧美精品日韩区二区麻豆天美| 不卡一区视频| 人人操我人人干| 能看的AV| 亚洲第一视频 欧美风情 日韩| 老熟女乱伦一区| 亚州少妇| 九久9精品| 亚洲古典另类欧美在线| 欧洲欧美视频一区二区| 91精品电影18| 视频国产成人精品日本亚洲18| 国产美女高潮叫床视频| 五月开心久久AV官网| 91色欧美| 欧美在线视频99| 国产精品色哟哟| 国产午夜精品理论片一二三区区| 精品少妇后入一区二区三区四区人妻巨乳| 精品国产乱码久久久久久久久久毛片| 色综合一本| 蜜桃色色网站视频三区| 九月伊人中文字幕| 91色情黑丝搞鸡在线观看一区二区三区三州 | 午夜.DJ高清在线观看免费7 | 久久精品国产72国产精品福利| 欧洲一区二区三区免费| 黄片国产精品一区二区| 国产盗摄美女如厕大神作品在线观看| 欧美爱三级日韩久久| 神马久久久久久久久久久久| 一级黄色性爱A级片| 97在线资源| 成年女人18级毛片毛片免费观看| 亚洲精品电影| 口爆综合网| 天天综合网日韩| 暖暖精品二区三区观看| 91骚熟女| 欧美色图天堂网m| 97Ai亚洲| 97 亚洲 日韩 欧美 在线| 啪啪综合网| 密臀在线免费观看| 欧美成人一级麻豆| 亚州熟妇精品| 国产激情久久久| 亚洲97资源| 大奶啊啊好爽| 亚洲无码超碰免费| 91网站18+| 国产欧美一区激情交| 酒色综合网| 漂亮人妻被强中文字幕hd| 日本3级一区二区免费| 91狠狠综合网| 国产白丝在线| 国产一区二区a毛片| 午夜性| 欧美经典一区二区三区| www.久久超碰| 九九热免费国产视频婷婷伊人五月| 久久精品熟女亚洲AV麻豆软件| 久久超碰、| 亚洲欧洲无码bt精品合集| 亚州男人的天堂| 丁香五月婷婷基地| 国产精品蜜臀久久久久无码AV| 操B久久| 中文字幕日韩精品久久| 国语精品对白| 日韩美女,国产传媒,视频一区| 很黄很色的视频在线观看| 中文字幕免费在线观看| 香一区二区三区| 亚洲国产成人精品无码专区| 啪啪视频免费在线观看| 激情小说亚洲视频| 爱干爱射网啊啊啊| 欧美网站免费| 强奸乱伦AV网站| 国产熟女二区| 亚洲国产第一页综合视频| 日本黄色大片一级视频免费麻豆| 狠狠躁伊人中文字幕| 国产又大又粗又长视频在线| 丁香五月性| 大黄片做爱的大的| 黄色视频高清无码网站| 日逼97| 九九九九免费高| 少妇 综合| 免费观看国产不卡av| 97亚洲在线| 91超碰在线观看| 天美传媒Av在线| 欧美不卡在线美女| 色色热| 日韩一级片在线看| 老司机福利青青草| 久久粉色| 久久鲁干| 夜夜天天噜狠狠爱2021| 亚洲国产91精品一区二区久久| 哈哈操电影| 蜜桃臀av一区二区| 国产精品久久久999| 日韩二三区| 伊人天堂在线| 久久亚洲不卡| 日韩中文欧美| julia高潮后不停追击中出| 手机看片1025| 日本九九九九| 色婷婷亚洲婷婷| 欧美性爱伊人| 色婷五月| www.丁香五月| 玖玖综合.com| 欧美日韩人人精品| 97色爱| 99啪啪| 1024亚洲中文字幕久在线看片你懂的 | 国产精品爆乳懂色蜜乳| 96精品久久久久久久久| 在线观看中文字幕| 2024黄色视频| 亚洲精品久久久久毛片A片拉屎 | av天堂天堂av日韩| 欧美日韩精品一区二区三区高清| 色色福利| 中文字幕精品区先锋资源| 日韩,欧美,中文在线| 日韩人妻一区二区精品| 五月婷婷激情网| 婷婷五月天av| 少妇六月天| 97在线无精品| 欧美日韩小说| 97中文综合| 国产97av| 亚洲欧美日韩制服另类| 国产小炒后入式| 东北操逼| 亚洲黄色AV电影| 国产精品不卡高清在线观看| 做爱A级亚欧| 国产精品自产拍在线观看社区| 欧美国产日韩高清在线| 有码人妻系列| 在线小说视频一区| 91久久久久久久久18| 少妇啪啪自拍| 色区久久| 热久日综合| 97操b| 热无码中文亚洲H一道本一区二区| 久操com| 屌色在线97视频| 日本丝袜美腿人妻九九| 国产中午字一暮区| 校园春色综合网| 国产精品亚洲天堂网址| 中亚精品极乱| 欧洲大香蕉| 操屄日韩| 91久久婷婷| 99只有精品| 1240青青草一区二区三区视频天爱| 日韩一级性爱无码| www.99在线| 久久伦理视频久久大香蕉视频| 啊啊啊啊免费视频| 久久亚洲AV成人精品无码| 超碰97欧美在线| 国产自产22区| 啪啪性爱免费视频| 污啪啪啪视频| 粉嫩久久久极品| 手机在线中文字幕国产| 91视频成人福利网站在线一区| 91九色丨风韵犹存| 日本欧美成人片AAAA| 超碰综合97在线| 日韩欧美中文| 亚洲在钱| 亚洲欧美一区二区三区一猛片| 97精品综合久久网| 大香蕉乱级| 亚洲天堂人妻一区二区| 有码专区最新中文字幕有码| 一级性爱视频免费在线| 欧美一级三级| 久久久久99精品成人片蜜臀| 人人天天干干| 91精品少妇搡搡搡| 日欧美色| 天美传媒婬乱| www四虎| 欧美性暴力| 久久人妻视频| 999久久久| 大色综合网| 日韩伦理视频| 欧美性爱精品七区| 白丝AV网站| 午夜啪| 五月婷婷hd| 国产精品久久久久久久AV大片| 久久精品99| 久久内射| 久久国色天香香蕉| 国产v亚洲v日韩v欧美v片另类| 国模限制级电影| 久久久久幕乱码| 国产高清成人传媒影视| 9 1超碰九色| 99在线精品观看99| 超碰在线免费一区二区三区| 色噜噜综合网| 激情小说在线视频| 欧美在线色| 九九热超碰| 69XX一中文字幕人妻91| 99热国产| 超碰97精品在线| 免费1级a做爰片观看| 92大香蕉| 97欧美精品综合| 国产一区二区啪啪视频| 免费试看60秒| 亚州国产成人精品女人久久| renqi久久久久久久久久久久| 国产探花日韩援交| 日韩本不卡视频在线观看 | 乱码人妻一区二区三区| 99热在线播放| 国产精品亚洲一级av第二区| 欧美色图20P| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 欧美色图人妻| 偷拍 精品另类 凸凹了四区| 日本成人A片免费看| 成人青青草原伊人| 日韩久草| 男女激情中文字幕| 嗯嗯嗯好爽| 激情啪啪拍91| 中文字幕视频在线观看一区二区| 女人 A一级| 久久精品国产亚洲AV先锋| AV色五月| 亚洲精品国产av天美传媒| 久久极品一区二区| 黄色毛片A片| 一起草欧美| 操b在线观看| 九九热re99re6在线精品| 亚洲青色欧美| AV天堂男人的天堂| 色婷婷激情| 成人免费福利在线观看| se01国产在线视频| 91欧洲国产成人久久精品网站| 男人的天堂三级| 秋霞一区二区三区四区五区六区七区| 翘臀vidoes| 69人妻精品一区二区绯色| 女人双腿搬开让男人桶| 日韩欧美aⅴ综合网站发布| 国产在线观看一区二区三区| 亚洲欧美999| 久久精品超碰| 少妇激情一区二区三区视频| 日本久久久久久久久久| 精品无码产区一区二| 亚洲天堂日本| 久久啊啊啊视频| 欧美A√综合网| 亚洲视频,小说| 精品国产一区二区三区久久久蜜臀| 99色视频| 日韩乱码Av| 看看小穴| 日韩AV色图| 日本伦理一区二区| 中文字幕av久久爽Av| 黄总AV色图| 久久綜合很很很| 91精品丝袜久久久久久无码人妻| 久久九七| 久久综合av| 亚洲91综合| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 91精品人| 蜜乳AV免费观看| 99久久精品无码一区二区毛片免费| 欧洲特黄毛片免费看欧洲毛片| 亚洲 暴爽 AV人人爽日日碰| 农村妇女一级二级三级视频| 久久女人一区二区三区| 色噜噜人妻av 中文字幕| 91欧美偷拍| 1204av韩国| 欧美综合色综合| 亚洲操操操无码| 亚洲男人天堂AV| 亚洲国产成人精品999| 欧美日韩黄片精品在线| 91小视频| 日日夜夜天天| 中出789在线视频| 天天性射网| 91久久久久久久久18| 无码久久国产| 91精品无码人妻系列| 婷婷综合网| 欧美亚洲一区二区久久久婷精品大包诱| 蜜臀AV成人精品蜜臀| 啊啊啊啊在线播放| 久久超碰网| 国产一在线观看| 丁香六月综合激情| 色天堂综合| 精品无人区麻豆乱码1区2区图片| 久久久蜜桃臀无码视频| 亚洲囯产精品女人久久久| 亚洲九区| 极品粉嫩少妇视频| 色九久| 色婷婷视频| 熟妇熟女亚洲天堂网| 狠狠2050在线观看| 精品对白久久不卡| 亚洲毛片一级带毛片基地| 国产一区96在线| 国产精品乱码久久久久久| 亚洲有码视频二区| 熟女色综合久久| 欧美成不卡网| 岛国天天午夜影院传媒网| 日本操逼aaaaa| 99热自拍| 超碰97欧美日韩| 91精品人妻偷情| 国产精品老师| 日韩欧亚中文在线| 最新日本中文字幕| 婷婷亚洲综合| 四虎影视 亚洲无码| 自拍偷拍第26| 日韩AV电影网站| 丝袜视频网国产90| 亚洲国产尤物yw在线观看| 吻戏激情性巴克| 一本色道久久综合狠狠操| 色屁屁影院www国产| 蜜臀久久一区二区| 亚洲乱熟女一区二区| 人妻干天天| 伊人大香蕉在线| 97超碰超| 密桃99999| 欧美美逼| 3p国产色噜噜一区| 四虎精品一区| 日韩性爱免费视频在线网站| 欧美成人色| 日韩精品中文字幕人妻| 亚洲情色婷婷五月天| 久草新在线| 久久大香蕉| 国产农村妇女毛片精品久久| 久久久国产成人一区二区三区在线| 加勒比AV天堂| 秋霞一区二区三区四区五区六区七区| 久久九色| 久久9亚洲| 97超碰人人操人人操| 6080yy午夜理论三级一区二区三区无码| 精品国产99999| 五月婷婷基地| 玖玖久久久| 日韩另类色图| 精品综合久久久久久五月天| 久久久久久久久久久久久9999| 综合色好色| 九九九综合精品| 亚洲国产美女久久久久| 亚洲熟妇无码一区二区三区| 在线αⅴ| 神马午夜久久久| 顶级丝袜熟女一区二区三区| 黑人干亚洲| 去干网最新版| 人人妻人人澡人人爽久久av| 久操黄色视频| 国产高清吃奶免费视频网站| 69人妻精品丰满熟女区| 国产A v无码专区| 久久久三区二区一区| 婷婷亚洲综合| 国产美女在线精品免费看| 亚洲综合影片| 天天视频综合在线观看视频| 久久是精品| 久久精品一区二区三区不卡| 无码不卡八戒| 91N综合网在线| 久久久一级| 翔田千里爆乳巨臀无码| 91国产美女丝袜足交精品视频| 偷拍自拍在线视频观看| 91n处女在线观看| 玖玖爱综合| 国产男人又猛又粗又爽| 亚洲美女精品九九视频| 午夜精品久久久99| 在线观看综合精品亚洲| 久久久久九九九| 亚洲欧洲第二视频在线观看色图| 色色色色综合网| J?P?NESEHD熟女熟妇伦| 97久久国产亚洲精品超碰热| 精品超碰中文在线| av无线看| 97超碰欧美手机| 欧美大片天天看| 五月婷婷六月色| 日韩av电影成人在线| 成人开心网在线视频| 江都AV在线| 7777欧美成是人在线观看| 高清有码一区二区| 欧美成人精品一区二区男人蜜臀| 男人的天堂在线2| 蜜桃av综合网发布| 国产又猛又粗又爽又黄| 91美| 青青草中日韩在线| 欧美熟妇人体| 亚洲国产精品久久久久久久久久| 99热99在线播放激情| 精品亚洲| 亚洲影视高清三级-草1024榴社区入口-品爱AV| 色女综合| 久久麻豆一区二区| 天美麻花大全视频| 亚洲国产尤物yw在线观看| 99色网| 日比av无码| 亚洲高清在线se| 欧美在线55555| 欧美亚洲激情小说| 激情综合五| 精品毛片久久久精品毛片| 国产av激情无码久久天堂| 日逼97| 国产美女91| 中日亚韩免费视频| 精品国模无码| 日韩9区| 本道综合精品| 亚洲影视第一页| 我爱搞逼综合网| 欧美成人综合| 亚洲天堂自拍| 精品久久久久瑟瑟| 爱射综合| 婷婷国产精品九区| AV天天在线观看| 久久黄黄| 婷婷五月成人| 亚州少妇| 天综合网| 女同在线视频一区| 亚洲一区二区AV| 亚洲性高潮| 日日躁狠狠躁天天躁精品| 操死我了啊啊啊| 粉嫩AV输入| 色妇91| 97视频www| 天综合网欧美| 欧美极品少妇| 青青草五月份天| 青青操日韩| 啪啪啪综合| 男人的天堂2018| 日本欧美中文字幕| 家庭乱伦麻豆| 国产v片在线免费观看| 激情黄色片在线观看| 久久久精品电影| 一起草日韩| 人妻中文字幕日韩电影| 强奸a片网| 久久久一区二区三区四曲免费听| 综合网欧美在线| 99热精品青草在线 | 91亚洲网站| 综合网亚洲| 精品成人亚洲午夜电影| 久久精品中文字幕无码l| 久久9视频| 四虎 精品 WWW| 国产精品视频| 加勒比无码毛片| 超碰色综合| 99老司机精品视频在线观看| 92午夜免费福利视频| 丁香激情网| 亚洲色欲一区二区三区| 亚洲色图综合网| 久久精品电影在线| 欧美日韩黄片精品在线| 久久久久亚洲Aⅴ无码| 欧日韩不卡视.频| 91九九九小逼| 1024精品在线| 伊人五月天婷婷| 乱伦熟女区| 亚洲情色一区三区| 超碰 欧美| 91人妻人人澡人人爽人人精品| 日本无码1| 欧美1727免费观看视频| 韩国国产欧美情侣视频在线| 老熟乱一区二区三区四区| 国产91av在线播放| 青娱乐日韩无码| 好吊色一区| 91热| 51一区二区三区| 神马久久久久眼| 2019亚洲男人天堂| 中日韩免费看男女操逼大全| 亚洲性爱无码乱伦av| 久久手机视直播| 91热色| 日韩激情毛片一级久久久| 99精品在线观看| 欧美 亚洲 另类 综合| 国产女人视频三四五区| 欧美黄片欧美黄片xxx| 日本日日色视频| 春色91| 黄片免费看黄片免费看| 国产色产精品在线观看| 色色色天美视频| 大香蕉伊在线久草麻豆天堂故事| 超碰人人干天天射| 欧美成人一级免费电影| 久久做97| 在线日韩精品一区二区三区| www久久久| 国产精品电| 欧美一级黄片视频在线| 台湾佬中文娱乐自偷自拍| 中文字幕乱码在线观看| 日本熟妇人妻中出视频| 日本九九久久99| 日本性交操一区二区不卡系列| AV 少妇 人妻 偷拍| 亚州,欧美在线| 美國A片| 学生妹天天看| 国产 日韩 欧美高清| 九九成人精品| 中文字幕在线免费观看2| 天天综合网国产| 三级色影综合网| 人妻少妇一区二区| 夜夜性| 无码99| 78精品| 久久黄色网址| 啊啊啊啊啊在线| 精品久久久久久亚洲| 久久精品国产亚洲av水密被窝| 精品一区二区亚洲国产| 久久久少妇诱惑精品视频| 久久精品国产亚洲AV嘿嘿| 无码操逼天堂| 国产精品一区二区三区,亚洲综合| 伊人久久亚洲中文字幕不卡| 三级激情网站| 亚洲熟久久| 99久久精品无码一区二区| 超碰69| 国产精品视频精品一二| 日韩三级av片| 一本道综合色图| 在线97视频| 人妻在线臀日韩| 黄片视频观看| 97精品第3页| 久久精品毛片免费不卡| 色天使AV天堂| 啪啪综合网| 精品一级毛片在线观看| 国产精品午夜成人福利| 中文字幕奈奈美被公侵犯| 亚洲图片在线| 超碰人人在线| 超碰97色| 欧美午夜视频| 日韩无码专区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 图片区小说区| 啊啊啊啊免费视频| 99999精品视频| 国产高清无码一区三区二区| 欧美高清在线| 91蜜臀在线久久久久| 精品高清一区二区三区三州| 欧美最大综合网| 激激五月| 国产精品人妻熟女aⅴ| 久久伊人东京热| 日韩紧密久久| 国产色呦呦| 欧美中文字幕精品人妻| 亚洲精品1区| 麻豆人妻精品一区二区| 亚洲一区操| 青青草依人大香蕉| 精品美女在线视频| 99精品久久久久久久婷婷蜜桃| 欧美91精品国产自产| 尤物视频网 刘玥| 日韩精品99999| 伊人久久大香线蕉无码| 国产免费小视频| 欧美人妻色| 男人天堂一区二区| 老熟妇一区二区三区…| 青青草好吊色| 97超碰中文| 国产精品经典一卡久久久 | 操老熟女AV| 国产极品999| 人人透人人操| 人妻一区二区三区视频| 国产精品另类| 久久99草| 蜜臀AV一区二区三区激情综合| 精品国产一区探花在线观看| 日本熟女不卡视频| 欧美性第1页| 91黑丝美女| 婷婷色一区| 久久美女福利是上海美女| 99亚洲精品| 久久黄人人爽视频| 亚洲综合色在线| 神马久久久久久久久久| 你操综合| 五月天婷婷综合网| 国产三级中文有码在线视频| {男男暴菊gay无套网站| 欧美九九九九九| 激情内射| 久久视频,这里只有精品 | 九99久久| 秋霞一区二区三区四区五区六区七区| 很很干很很操| 五月香婷婷| 99热只有这里有精品| 亚洲欧综合另类无码一区| 国产精品久久久久久久AV大片| 蜜臀久久99精品久久久久| 熟女少妇一区二区三区| yazhouzaixian| 国产精品乱码久久久、久久| 日本999精品| 亚洲色资源| 欧美青青视频| 国产精品密臀网在线观看| 97色视频在线| 东京热一区二区三区四区五区六区| 嗯嗯嗯啊啊啊在线免费观看| 久久五月份| 亚洲色吧网| 超碰亚洲欧美日韩无| 日本特黄f c2| 青青青操| 亚洲综合影片| 成人在线视频一区| 久久啊啊啊视频| 欧美大干日韩| 久久网亚洲| 亚洲高潮影院| 日韩99999| 亚洲天天综合| 高清在线不卡一区二区 视频| 无码久久亚洲高清,| 大香蕉www.超碰| 韩国成人精品久久久免费看| 国产黄色 A 片免费看| 秋霞一级视频在线观看免费|