久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码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系列芯片、對異常處理機制還有點懵的新手這篇文章就是給你寫的。做嵌入式開發(fā)尤其是基于Cortex-M內(nèi)核的MCU開發(fā)幾乎沒人能繞開HardFault這個坎。它不像普通邏輯Bug那樣能靠肉眼掃代碼看出來往往是程序跑著跑著突然就掉進一個死循環(huán)調(diào)試器一停PC指針指到一個莫名其妙的地址看門狗又跟著湊熱鬧整個系統(tǒng)直接癱瘓。我最早被HardFault支配的時候項目工期緊板子還只有一塊只能靠復位大法續(xù)命后來踩的坑多了才慢慢摸清楚這套異常處理機制的脾性。其實Cortex-M的異常和中斷處理是一個非常精巧的系統(tǒng)你把它搞明白了HardFault定位就是一道送分題。這篇文章不聊虛的直接從內(nèi)核異常模型講起把HardFault的根因、Cortex-M異常處理流程、借助Keil MDK進行現(xiàn)場追蹤和調(diào)試的完整套路都掰開揉碎講清楚。無論你是用STM32、GD32還是其他Cortex-M內(nèi)核的國產(chǎn)MCU這套方法論全部通用保證你下次再遇到HardFault能少掉一大半頭發(fā)。1. 先吃透Cortex-M異常處理模型1.1 異常和中斷的底層關(guān)系很多初學者會把“異?!焙汀爸袛唷碑敵梢换厥缕鋵嵲贑ortex-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ù)刂?號是復位異常2號是NMI不可屏蔽中斷3號是硬故障HardFault4到10號分別是MemManage、BusFault、UsageFault以及幾個保留項11號是SVCall14號是PendSV15號是SysTick再往后就是外部中斷IRQ了也就是我們平時在STM32里配置的EXTI、UART、TIM等中斷。為什么要先講這張表因為HardFault在異常向量表里的位置是固定的3號它的優(yōu)先級默認是-1比除NMI和復位之外的所有異常都要高。這就意味著一旦觸發(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 異常處理的硬件自動壓棧機制Cortex-M在處理異常時有一個和傳統(tǒng)MCU內(nèi)核比如51、AVR完全不同的特點硬件自動壓棧。也就是說當異常發(fā)生時CPU會自動把xPSR、PC、LR、R12、R3-R0這8個寄存器壓入當前使用的棧空間這個過程不需要軟件干預(yù)是在異常入口處由硬件完成的一整套流水線操作。壓棧之后處理器會做什么它會從向量表中取出對應(yīng)異常的處理函數(shù)地址跳轉(zhuǎn)過去執(zhí)行。這個過程叫異常返回準備硬件會把LR設(shè)置成一個特殊的值叫做EXC_RETURN這個值不是一個真實的內(nèi)存地址而是一個帶有特殊含義的標記。比如0xFFFFFFF9表示從線程模式使用主棧指針MSP返回0xFFFFFFFD表示從線程模式使用進程棧指針PSP返回0xFFFFFFF1表示從處理模式返回。如果你用了FPU比如Cortex-M4F還會看到0xFFFFFFE9和0xFFFFFFED這類帶FPU擴展位標記的值。理解這個機制對HardFault調(diào)試至關(guān)重要。因為當你停在HardFault_Handler里時當前棧頂保存的就是觸發(fā)異常那一刻的“案發(fā)現(xiàn)場”——那8個寄存器的值。只要能正確解讀這些值就能還原出CPU在異常發(fā)生前到底在執(zhí)行什么代碼PC指針指到哪個函數(shù)LR是哪個調(diào)用者以及R0-R3傳了什么參數(shù)。這套方法在后面我會詳細演示。1.3 為什么要理解異常模型而不是背流程有人可能會說我知道了HardFault的向量號是3也知道了硬件壓棧但這些對我的實際調(diào)試有什么幫助有而且?guī)椭艽?。舉個實際例子。我曾經(jīng)調(diào)一個電機驅(qū)動板現(xiàn)象是運行幾十秒后系統(tǒng)死機復位后又能跑一會兒。一開始我以為是看門狗問題關(guān)了看門狗再跑還是會死。后來我把硬件壓棧的知識用上在HardFault_Handler里把當前棧指針的值讀出來然后按8個字32位系統(tǒng)一個字是4字節(jié)的偏移找到異常發(fā)生前的PC值再在反匯編窗口里定位到這個PC對應(yīng)的代碼位置結(jié)果發(fā)現(xiàn)是在一個電機電流采樣的DMA中斷里代碼試圖訪問一個已經(jīng)關(guān)閉了時鐘的外設(shè)寄存器。問題的根源是時鐘門控配置順序錯了導致中斷觸發(fā)時外設(shè)時鐘被關(guān)掉了總線訪問直接觸發(fā)BusFault又被HardFault吞掉。如果我不懂異常模型和壓棧機制單靠肉眼一行行看代碼這種隨機死機的問題可能要排查好幾天。但有了這套底層知識半小時不到就能鎖定肇事代碼。這就是我為什么堅持先講原理再講實戰(zhàn)的原因原理通了所有所謂的“疑難雜癥”都會變得有跡可循。2. HardFault根因大盤點到底是哪些場景最容易觸發(fā)2.1 存儲訪問類異常越界、未對齊、非法地址Cortex-M內(nèi)核的存儲系統(tǒng)有一個特點它把存儲訪問錯誤細分為好幾類在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)試里最常見的HardFault觸發(fā)原因匯總下來大概有這么幾類野指針訪問指針未初始化或者指向已經(jīng)釋放的內(nèi)存讀寫的時候直接踩到非法地址。數(shù)組越界尤其是寫入越界覆蓋了相鄰變量或者棧上的關(guān)鍵數(shù)據(jù)導致返回地址被破壞PC跳飛。棧溢出任務(wù)棧分配太小調(diào)用層級一深或者局部變量一多棧指針直接頂穿棧底寫到了不可訪問的區(qū)域。未對齊訪問Cortex-M3及以上內(nèi)核雖然支持部分非對齊訪問但對某些指令比如LDRD/STRD、LDM/STM以及訪問外設(shè)寄存器時非對齊會直接觸發(fā)UsageFault或者BusFault。訪問不存在的地址映射了外設(shè)的區(qū)域但外設(shè)時鐘沒開或者地址本身超出MCU的地址空間。前面兩類是新手最容易踩的也是面試官最愛問的因為它們能反映一個人對內(nèi)存布局的理解程度。我見過太多這樣的代碼定義一個全局數(shù)組存數(shù)據(jù)然后根據(jù)某個變量對數(shù)組進行寫入變量算出來是負數(shù)直接越界寫到了數(shù)組前面的內(nèi)存。在Cortex-M上這種越界寫有時候不會立刻觸發(fā)HardFault而是靜默地破壞了相鄰變量的值等程序邏輯表現(xiàn)出來的時候離真正的錯誤點已經(jīng)很遠了。2.2 異常嵌套與優(yōu)先級配置的經(jīng)典坑Cortex-M內(nèi)置了嵌套向量中斷控制器NVIC它允許高優(yōu)先級中斷搶占低優(yōu)先級中斷。這個機制本身是好的但如果你在中斷服務(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ù)的棧是獨立分配的但中斷棧在裸機環(huán)境下就是主棧大家共用。第二中斷里操作浮點寄存器。Cortex-M4F有FPUFPU的寄存器保存是惰性的默認情況下中斷不保存FPU上下文只有真正用到浮點指令時才觸發(fā)自動保存。如果你在主程序里用了FPU又在中斷里用了FPU而RTOS的任務(wù)切換沒處理好FPU上下文就會出現(xiàn)FPU狀態(tài)寄存器值錯亂導致計算結(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)化等級之后尤其難以復現(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默認情況下整數(shù)除零不觸發(fā)異常但如果軟件里開啟了DIV_0_TRP位除零就會觸發(fā)UsageFault進而被HardFault吞掉。未對齊的棧操作比如SP指針沒有保持8字節(jié)對齊在某些需要對齊訪問的LDRD/STRD指令上會直接觸發(fā)異常。這些場景有一個共同特點它們在正常代碼流程上是不會出現(xiàn)的往往是因為某個內(nèi)存被破壞導致PC跳到了錯誤的位置執(zhí)行了錯誤的指令。所以當你發(fā)現(xiàn)HardFault是因為取到了一個未定義指令不要急著去查這條指令在哪里而應(yīng)該去查是誰把PC弄過去的——大部分情況是函數(shù)返回地址被篡改少部分是函數(shù)指針被污染。3. 調(diào)試實戰(zhàn)一套可復制的HardFault定位方法論3.1 現(xiàn)場恢復從Keil5中提取異常前PC值很多人遇到HardFault的第一反應(yīng)是直接在HardFault_Handler里打斷點然后點Run讓它停在斷點處。這個思路有一半是對的但如果你只在HardFault_Handler里打斷點你會發(fā)現(xiàn)一個尷尬的問題程序每次復位跑進HardFault_Handler停下來的位置幾乎永遠是同一個地方那就是HardFault_Handler的第一行匯編指令。這個信息量太少了你根本不知道是誰觸發(fā)它的。正確的做法是當程序停在HardFault_Handler時先從寄存器窗口讀取當前的SP值。關(guān)鍵點來了怎么知道這個SP是MSP還是PSP看LR寄存器如果LR的值是0xFFFFFFF9說明當前在處理模式用的是MSP如果LR的值是0xFFFFFFED說明異常返回目標是線程模式且使用PSP那當前用的棧指針需要從進程棧指針寄存器里單獨讀取。拿到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的值回車就能看到一長串數(shù)據(jù)。把偏移24個字處即地址SP0x18的數(shù)值取出來這個就是我們要找的PC。然后在Disassembly窗口里輸入這個PC地址回車就能看到對應(yīng)的匯編指令再對照源代碼窗口基本就能定位到肇事代碼行。3.2 深入理解EXC_RETURN別被LR騙了在HardFault現(xiàn)場讀取寄存器時有一個細節(jié)容易讓人迷惑在壓棧數(shù)據(jù)偏移20處確實有一個LR但它不是異常發(fā)生前的調(diào)用者LR。這個LR是CPU在進入異常時自動壓棧的它保存的是觸發(fā)異常那一條指令的“返回地址”準確說是觸發(fā)異常的指令地址加上一定偏移可能指向BL指令的下一條指令地址也就是調(diào)用者真正要返回去執(zhí)行的地方。而CPU當前的LR寄存器里保存的是一個EXC_RETURN它根本不是一個真實地址。我見過很多人在HardFault調(diào)試時看到寄存器窗口里LR的值是0xFFFFFFF9然后把它當作調(diào)用鏈里的一個函數(shù)地址拿來查結(jié)果在反匯編窗口里輸入這個地址之后發(fā)現(xiàn)根本查不到有效代碼——因為0xFFFFFFF9就不是一個地址。所以一定要記住異常現(xiàn)場的調(diào)用關(guān)系要看壓棧數(shù)據(jù)里的舊LR而不是當前的LR寄存器。當前LR寄存器里那個0xFFFFFFF9/0xFFFFFFED是用來告訴硬件“異常返回時用什么模式、用哪個棧指針”的。如果你用的是帶FPU的Cortex-M4F或M7壓棧的數(shù)據(jù)結(jié)構(gòu)會不一樣。當異常發(fā)生時硬件檢測到當前上下文使用了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ù)的長度都能確認。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窗口手動添加寄存器表達式(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ù)學庫函數(shù)內(nèi)部光是看到PC還不夠——我們需要知道是誰調(diào)用了這個函數(shù)才能理解整個觸發(fā)鏈路。這個時候就要用到調(diào)用?;厮?。手動回溯的原理是棧指針SP指向的壓棧數(shù)據(jù)里偏移20處保存的是進入異常前的LR它指向調(diào)用者的下一條指令沿著這個“函數(shù)返回地址”的鏈條再往上追一級需要知道當前函數(shù)的棧幀是怎么建立的。Cortex-M的AAPCS過程調(diào)用標準規(guī)定函數(shù)入口處通常會有PUSH {r4, lr}這樣的指令也就是把被調(diào)用者保存寄存器R4-R11和鏈接寄存器LR都壓到棧上。如果我們在異常前的PC處往回看幾條指令能確認這個函數(shù)確實有PUSH {lr}操作那么當前SP加上壓棧偏移再往里找就能找到上一層函數(shù)的LR以此類推能還原出完整調(diào)用鏈。在Keil5里更簡單的方案是直接使用Call Stack窗口。當程序停在HardFault_Handler時打開View—Call Stack WindowKeil會根據(jù)當前棧內(nèi)容自動解析調(diào)用鏈。但注意自動解析有時候依賴調(diào)試信息如果你開啟了較高的優(yōu)化等級比如-O2/-O3很多棧幀信息被優(yōu)化掉了Keil解析出來的調(diào)用關(guān)系可能不準甚至會報錯。這種情況下手動從壓棧數(shù)據(jù)里讀PC和LR是唯一可靠的方法這也是我把手工回溯放在這里重點講的原因。3.5 Keil5中的高效輔助調(diào)試手段除了上面這些偏底層的分析方法Keil5本身還提供了一些非常實用的輔助功能用好了能大幅提升定位效率。第一個是硬件斷點和數(shù)據(jù)斷點。如果HardFault的觸發(fā)和某個特定變量的寫入相關(guān)可以在Keil里給這個變量打數(shù)據(jù)斷點Data Breakpoint這樣當代碼試圖修改這個變量時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)系。比如之前排查一個通信模塊隨機死機的問題我用GPIO在中斷入口和出口各翻轉(zhuǎn)一次然后用邏輯分析儀抓異常發(fā)生時刻附近的引腳電平很快發(fā)現(xiàn)是兩路中斷的優(yōu)先級配置反了導致高優(yōu)先級中斷在低優(yōu)先級中斷的臨界區(qū)里被觸發(fā)破壞了協(xié)議棧的狀態(tài)機。第三個是棧使用量檢測。在Options for Target—Target窗口里勾選“Use MicroLIB”并在Linker頁面勾選“Use Memory Layout from Target Dialog”然后在代碼里調(diào)用__get_MSP()和__get_PSP()讀取當前棧指針比對棧底地址就能計算出剩余棧空間。配合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)試強相關(guān)。最簡單的情形是程序跑飛后進入HardFault然后你點Keil的Debug按鈕結(jié)果彈出“no cortex-m sw device found”根本連不上調(diào)試器。這通常不是調(diào)試器壞了而是目標芯片在死機狀態(tài)下把SWJ調(diào)試端口占用了或者時鐘配置被改掉了調(diào)試器復位之后握不上手。解決辦法分兩種。如果目標芯片還在響應(yīng)復位可以在Keil的Debug—Settings里把Reset and Run選項打開或者在連接失敗時按住目標板上的復位鍵然后點擊Debug在松開的瞬間讓它握上SWD握手信號。更穩(wěn)妥的方案是用一個腳本文件在調(diào)試器初始化時先讓芯片保持在復位狀態(tài)配置好SWD速度后再釋放復位。對于STM32系列有些型號還支持通過BOOT0拉高進入系統(tǒng)Bootloader模式此時內(nèi)核運行在出廠固件上SWD端口必然是釋放的連接成功后把BOOT0拉回低電平就能正常刷固件和調(diào)試了。如果你用的是國產(chǎn)MCU比如GD32、AT32這些SWD連接失敗的原因還要多排查一個讀保護。很多國產(chǎn)芯片默認出廠時讀保護是使能的或者你在調(diào)試過程中不小心開啟了讀保護級別1這會導致調(diào)試器無法通過SWD訪問內(nèi)核。解決辦法是用對應(yīng)的燒錄工具執(zhí)行全片擦除解除讀保護。我在一次GD32的調(diào)試中就遇到過程序跑到某處觸發(fā)了HardFault但重置之后居然連不上調(diào)試器最后發(fā)現(xiàn)是代碼里某段錯誤的存儲區(qū)寫操作意外修改了選項字節(jié)把讀保護打開了。4.2 HardFault發(fā)生的時機隨機如何復現(xiàn)和抓取HardFault最折磨人的一點是它有時候不是100%復現(xiàn)的。你在調(diào)試器下跑幾十次都好好的一上電裸跑可能幾分鐘就死一次。這類“幽靈式”死機通常有幾種原因時序相關(guān)的資源競爭中斷和主循環(huán)同時訪問共享變量、堆棧踩踏發(fā)生在特定函數(shù)調(diào)用組合下、以及硬件外設(shè)的偶發(fā)錯誤狀態(tài)。我的經(jīng)驗是先開啟MPU內(nèi)存保護單元來構(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)試器的斷點能精準捕獲到越界寫入的第一現(xiàn)場。這個技巧對排查棧溢出簡直不要太爽不用靠猜直接讓硬件替你盯著。如果復現(xiàn)是隨機的還可以利用Cortex-M內(nèi)核的異常返回機制做“二次觸發(fā)”設(shè)計。簡單說在HardFault_Handler里不直接死循環(huán)而是把MSP的值修正為初始值然后重新跳轉(zhuǎn)到復位向量讓系統(tǒng)軟復位。這樣雖然程序重啟了但在重啟前把故障現(xiàn)場的關(guān)鍵寄存器PC、LR、CFSR、BFAR通過一個保留內(nèi)存區(qū)域保存下來系統(tǒng)恢復后可以通過串口打印或者調(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時先別慌通過寄存器窗口和棧信息定位當前SP二看壓是讀取壓棧的8個字拿到異常發(fā)生前的PC和LR三讀故障是看CFSR/HFSR的解析結(jié)果確認屬于哪類故障并抓住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完全不同因為編譯器可能會省去一些邊界檢查、重排表達式、把局部變量直接映射到寄存器。當你用-O0能跑通、用-O2就HardFault時先別懷疑芯片也別盲目加volatile——先看反匯編確認是不是優(yōu)化導致了某個變量在你預(yù)期的時間點還沒被寫回內(nèi)存或者某個中斷里讀取的共享標志被優(yōu)化成了寄存器緩存。實在不行對可疑模塊單獨關(guān)閉優(yōu)化這是最直接的止損手段。四是“多路檢查不迷信單點現(xiàn)象”。舉個例子有些HardFault彈窗時當前PC停在HardFault_Handler函數(shù)調(diào)用棧窗口里顯示的都是HardFault_Handler附近的信息僅憑這個現(xiàn)象你可能會以為是HardFault_Handler自己的代碼問題。其實不然因為編譯器把故障代碼編進了同一個文件調(diào)試器展示的調(diào)用棧信息是“物理上等價”的。正確做法是回到現(xiàn)場數(shù)據(jù)層面以壓棧PC和CFSR為準不要被調(diào)試器的可視化結(jié)果帶偏。4.4 從HardFault再往前一步寫一個故障記錄模塊追著HardFault打補丁是被動的我更推薦每個項目在開發(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)))標記到不掉電的SRAM段。這樣即使系統(tǒng)重啟了只要不掉電現(xiàn)場數(shù)據(jù)還能讀到。串口打印的時候建議用十六進制原始格式不要做太復雜的格式化因為故障模式下堆棧狀態(tài)可能不穩(wěn)定用太復雜的庫反而容易二次故障。我習慣的格式是FAULT_INFO PC0x08001234 LR0x08004567 SP0x20000ABC CFSR0x00008200 HFSR0x40000000 BFAR0x00000000 MMFAR0x20000000 R00x00000001 R10x00000000 ...打印完之后再根據(jù)PC地址去工程里定位具體代碼位置配合反匯編基本就能鎖定問題。這個模塊建議在項目初期就加上成本極低但收益巨大。順便說一句如果你的項目用了RTOS故障記錄模塊里最好也保存當前任務(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嵌套異常導致無法上報檢查異常返回和棧狀態(tài)減小中斷里復雜操作增加棧深度出現(xiàn)HardFault后連不上調(diào)試器SWD接口被占用或讀保護開啟按復位鍵連接檢查選項字節(jié)短接NRST或使用Bootloader模式優(yōu)化后才能復現(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問題。尤其是第一條“返回地址被篡改”我再單獨多說一句它在?;厮輹r表現(xiàn)特別迷惑因為PC壞得很徹底反匯編窗口跳到一片空白或保留區(qū)域。遇到這種情況不要死磕PC回到棧區(qū)往上找看棧里有沒有出現(xiàn)“很規(guī)律”的填充數(shù)據(jù)比如0xA5A5A5A5或全0這種填充數(shù)據(jù)往往是緩沖區(qū)沒有初始化或者棧保護魔數(shù)從它們被破壞的位置就能反推是哪一段越界寫導致的。5. 寫在最后的心得跟HardFault打了這么多年交道我最大的體會是它不是一個“玄學問題”而是有一套固定邏輯鏈路的工程問題。你越是靠運氣去復位、重試它就越折磨你你越是把異常模型、壓棧機制、故障狀態(tài)寄存器這些底層知識吃透它反而越聽話甚至能變成你定位內(nèi)存問題、時序問題的一把利器。最后再分享一個我每次都會檢查的細節(jié)在寫中斷服務(wù)函數(shù)時盡量讓代碼保持短小精悍不在中斷里做printf、malloc、延時這類操作每個中斷都加上對參數(shù)合法性的檢查對共享變量加上保護。這些老生常談的規(guī)則每一條背后其實都是HardFault的血淚教訓。認真去執(zhí)行你開發(fā)中遇到的HardFault概率至少能降一半。剩下的一半用前面講的那套方法也能快速定位、體面收場。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
能在线播放的国产三级| 四虎 精品 WWW| 欧美裸体美女日麻屄| 天天综合网1| 色婷五月| 激情久久av一区av二区av| 极品销魂美女一区二区 | 岛国A V在线免费看| 国产亚热在线久久| 99草精| 久久爱超碰网| 精品少妇一区二区三区| 精品久久久不卡一区二区| 亚洲欧洲偷拍一区| 色五月激情网| 我爱大香蕉| 伊人久久综合影院| 97人人操人人摸| 欧美在线播放| 99热销国产这里有精品| 亚洲交换| 伊人在线大香蕉视频久久| 国产久久视频| 天色综合网| 亚洲人妻AV| 天天干夜夜一操| 三男一女不戴套的A片| 精品在线78| 色眯眯av| 90后后入| 欧美肥臀在线| 97视频播放| 91天天综合在线观看| 中文久久96| 98超碰日本| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 91丝袜美女视频| 熟女高潮精品一区二区| 亚洲综人| 欧美激情内射| 人爽不卡视频| 入口操逼网站| 在线a v| www.婷婷| 2024黄色视频| 中文字幕国产在线天堂| 超碰色男人操熟女| 操迟操逼在巾线Fre看| 日韩激情毛片一级久久久| 超碰在线欧美性爱激情| av天堂5| 在线v中文字幕一区二区三区| 特级毛片特黄久久免费看| 中国一级特黄大片护士| 超碰在线国产| 超碰在线人妻不卡| 熟女人妻一区二区三区免费看 | 丰满少妇精品一区二区| 亚洲色电影在线| 国产色图乱伦| 日本操逼视频导航| 久久香蕉国产传媒一区剧情天美| 熟妇艹鸡八| 国产性爱欧美性爱在线| 中文字幕欧美日本乱码一线二线| 国内一区二区免费| 国产91乱伦| 久久久激情| 欧美精品另类人妖xxxx| 大香交| 日本操逼视频免费| 久久精品国产亚洲AV片多多| 台湾佬激情综合| 欧美天堂超碰97| 丝袜美腿91| 丁香五月婷婷啪啪| 亚洲欧美九九九| 男女香蕉一区二区| 亚洲国产欧美一区二区潘金莲| 日韩亚洲中文字幕在线| 蜜臀久久99精品久久久老,,| 天美传媒av在线| 久久免费9| 亚洲精品国产无码高清| 午夜精品久久久久久久男人的天堂 | 色色亚洲| 密臀在线视频| 欧美一级黄色18片免费看| 中文字幕在线播放2中文字幕在线观看2| 97网址www| 中文字幕av一区二区三区人妻少妇| 久草在线| 草伊人高潮喷水超碰| 国产又大又粗又长视频| 18啪啪手机免费性爱| 精品久久99| 操逼999| 国产精品白领在线观看 | 久久婷婷影院| 日韩欧美偷拍美女视频| 思思热在线视频免费| 精品人人插人人操| 动漫av中文| 国产在线播放成人免费| 四虎影库国产精品免费| 婷婷激情四射| 91操操| 超碰 国产熟女精品一区| 国产日韩在线播放av| 亚洲男人天堂2019| 人妻精品一区二区三区| 久久性爱大全| 伊人久久综合影院| 久草婷婷| 成人八戒网站| 丰满人妻一区二区中文| 久久99视频| 中文区中文字幕免费看| 久久久久久国产精品| 一区二区亚州激情久婷婷欧美| 国产精品第一区第一页| 麻豆精品A片免费观看| 高清有码一区二区| 九九久久久九九| 校园春色 亚洲| 综合色播| 日韩啪啪视频| 美女淫穴| 久久美女国产| 国产精品色约约| 日韩中文字幕二区| 色香天天| 夫妻四区五区六区| 无码乱人伦中文视频| 亚洲drav色图| 五月丁香色色网| 亚洲日韩97| 可以免费观看的av| 日韩三级在线观看网站| 动漫av中文| 国产无马av| 91熟女丨老女人| 97AV爱| a片偷拍视频| 麻花豆传媒剧国产MV出差| 成人欧美日超碰| 免费伦费视频在线观看| 亚洲男人的天堂va亚洲男人社| 欧美九九爱| 美女天天干| 97一区二区三区视频| 国产欧美一级在线观看| 国产精品美女| 午夜福利一区二区三区四区五区色婷婷| 蜜桃无码AV一区二区| 青青草大香蕉视频| 久久人人爽爽爽人久久久| 日韩欧美aⅴ综合网站发布| 后入福利| 熟女中出视频| 人妻激情偷乱视频一区二区三区 | 婷婷五月天补不补| 在线播放一级无码视频| 久久久一区二区三区麻豆| 性色一线| 欧美美女自慰一区二区三区| 婷婷91| 亚洲精品尤物yw在线影院| 欧美日韩亚洲国产中文永久天天看| 图片区小说区| PMv在线观看| 日本五区不卡| 亚洲青青草| 91丝袜在线观看视频在线观看| 亚洲欧洲精品视频发布| 91网九色蝌蚪操熟女| 91色综合色| 蜜桃精久三区| 欧美色偷拍 | 深爱伊人影院| 色综合久久夜色精品国产天堂| 99热自拍| 一区在线国产播放| 久久丁香| 久久婷婷色| 在线观看不卡一区二区三区| 欧美少妇色图| 亚洲中文字幕一区二区| 综合激情一一91| 蜜臀在线免费观看在线免费观看| 亚洲欧美精品91| 艹少妇网站| 国产又黄又爽又刺激久久久久久| 日韩一级性爱无码| 色欲天天综合久久久无码网中文| 91老司机精品| 欧美九九九| 99国产精品自在自在| 东北老女人的激情视频| 亚州中文字幕超碰97| 成人五月香网在线| 不卡视频一区蜜桃视频 | 韩国三级一线观看久| 97视频在线免费观看| 久久超碰天天| 欧洲亚洲人妻无码久久三区四区| 97超碰欧美手机| 亚春色色| 男女无套 免费网站| 黑人娇小av在线播放| 日韩小电影| 日本媚薬中文字幕在线| 69一区二区三区 | 一二三四免费视频| 男人的天堂2010| 嗯嗯嗯啊啊啊在线免费观看| 欧美情色男人的天堂| 成人久久无码www| 精品射1999| 亚洲美女色图| 欧美综合天堂| 免费av在线播放二区| 蜜乳AV免费观看| 国产精品99精品视频网站| 欧美性爱无码一区二区三区| 久久男女激情视频网站| 老色69| 啊啊啊好舒服好爽啊啊啊视频| 黄网站黄视频网站进入口| 亚洲少妇在线影音| 久久天堂网| 久久中文字幕在线观看| 亚洲伊人a线观看视频| 国产区91柔拿会所技师| 精品一区二区啪啪啪| 精品少妇一区二区三区免费观看| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 久久三区四区| 午夜视频黄| 国产精品探花视频| 亚洲日产专区| 国产地址二三| 超碰天天去日穴| 91免费看一区二区三区| 人妻81p| 五月丁香综合啪啪| 日本一片一区| 色九九久九九| 亚洲密乳AV| 97久久视频| 欧美天天综| 亚欧美色图| 一起草三级AV电影在线观看 | 三男一女不戴套的A片| 久草视频在线视频在线视频在线观看| 99热这里只有精品8| 96AV久久久| asc国产精品| 亚洲天堂欧美| 99re在线观看| 亚洲精品久久一区二区三区蜜桃臀| 搡老女人老91二区| 激情丁香婷婷| 老司机午夜福利视频一区二区| 国产视频第二页| 日韩成人在线性爱视频| 淫淫总合网| 影音资源男人日韩| 亚卅熟女乱色| 色www精品视频在线观看| 国产精品免费视频人成| 夜夜操av亚洲一区二区| AV有码在线| 成年女人黄网站| 亚洲一区二区三区麻豆传媒| 网友自拍第1页| 成人aⅴ一区二区三区| 日本一区二区三区欧美日韩中文字幕| 午夜传煤十二区精品| 人人看欧美性爱| 极品丝袜无码| 香蕉欧美| av婷婷色网| 欧美宗合色| 久久人妻视频网| 天天干人妻视频| 天天看天天在线精品| 亚洲棕合电彰| av在线播放国产一区| www老逼91| 久久久97| 旡码电影特区| 亚洲啪AⅤ永久无码| 男人的天堂在线2| av影片在线观看不卡| 91精品综合久久久久久五月丁香| 亚洲色性| 九九视品黄色| 三级特黄60分钟播放| 又黄又粗又硬又长又大| 飘花国产午夜精品不卡| 一区二区视频你懂的| 91丨九色丨国产丨人妻在线| 亚洲日韩乱码中文无码蜜桃臀网站| 精品国产无码中文| 粉嫩久久久极品| 欧美精品自慰系列寂寞少妇| 爱丝福利| 色五月av| 激情图片伦理国产一区二区日韩| 国产高清视频无码在线| 黄色片G G G| 操逼逼无码| 超碰 欧美| 99热色精品| 亚洲欧美高清无码| 乱码人妻一区二区三区| 五月丁香综合激情| 国产粉嫩蜜臀av一区二区三区| 亚91亚洲网| 青娱乐欧美激情一区二区| 欧美韩日精品资源| 欧美有码激情视频一区二区三区| 成人五月天丁香激情综合| 日夜干射色啊| 五月丁香六月婷综合成人综合| 91热| 91天天爱| 婷婷丁香六月| 国产一区二区精品久久99| 久久成人精品| 夜夜国产一区| www.色五月| 欧美A片中文字幕| 肉丝中文无码高清| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 91亚洲欧美| 美性中文综合网| 99热网站| 亚洲精品亚洲人成在线麻豆| www.男人的天堂| 欧美精品偷拍| 啊啊啊好爽快点啊啊啊嗯嗯| 黄色免费网页无码| 九九在线精品| 国产aⅴ无码片毛片一级网站| 欧美在线电影| 午夜毛片高清免费不卡| 97中文天堂| 乱伦av.com| 一起草三级AV电影在线观看| 99re在线视频这里只有精品| 91亚洲不卡一区| www.超碰在线| 国产精品探花在线| av日韩国产一区二区| 综合欧美亚洲| 密臀在线视频| 老熟女天天操| 久9综合在线| 青青草色插素人| 国产蜜臀精品一区免费尤物| 日本在线一二| 长长久久免费视频| 日本污ww视频网站| 天天弄天天操| 天天色综合图片| 无码少妇精品一区二区60岁老人| 亚洲小电影免费涩涩成人在线高清| 久久一区二区三区四区五区| 人妻少妇精品久久久久久| 欧美少妇性乱| 大香网伊人久久综合网eew| 亚洲色五月| 五月天色图| 操婷婷逼| 翔田千里av一区二区三区| 在线人人人人人人精品超| 搞中出久久| 日本性感人妻91| 伊人天天久久动态图| 一本久道久久综合狠狠爱一密臀精| 超碰一区二区| 国产97在线播放| 亚洲天堂少妇| 天天综合网在线观看| 97超级久久| 欧美91网| 人人性爱视频免费| 3028国产精品| 欧美一区二区亚洲天堂| 大香网伊人久久综合| av资源在线观看少妇| 大香蕉色欲AV| 情色图区| 另类图片天天影视| 亚洲无无码αⅴ每日更新| 亚洲欧洲自拍图片专区满春格| 麻豆视频国产一区二区| 国产精品女生av| 国产区性爱在线视频秋霞豆| 午夜男女爽爽爽在线视频| 日韩午夜啪啪视频| 久久久艹艹艹| 人妻丝袜肏逼| 欧美色九九| 国产内射爽爽大片| 精品少妇人妻av久久免费| 美國A片| 十八禁啪啦拍视频无遮挡| 天天日夜夜爽| 国产女同性恋视频| 人妻精品一区二区三区| 日韩欧美性爱电影在线观看| 色在线亚洲视频www| 天天精品| 欧美亚男人的天堂| 后入人妻无码| 美女91网| 偷拍亚洲视频一区二区三区四区| 伊人久久蜜月| 青娱乐手机日韩在线视频| 国产性爱欧美性爱在线| 91欧美经典| 8x福利精品第一福利视频导航| 成人性爱美曰韩| 97超碰碰碰| 日本黄色天堂| 无码人妻一区二区三区色欲aⅴ| 99热99在线播放激情| 丁香六月婷婷久久综合| 亚洲视频二区| 日韩性爱一级片| 91色综合激情| 欧美色老汉| 天天夜躁日日躁狠狠2002| 欧美精品自慰系列寂寞少妇| 国产精品视频电影| AV有码在线| 欧美成人四级在线播放| 97超级久久强资源| 素人伊尹大香蕉免费下载视频| 亚洲中文字幕在现观看| 五月婷丁香| 九九九九精品一区| AV在线性爱| 色蜜AV| 超碰精品人妻狠狠干| 人人操 欧美| 色噜噜狠狠色综无码久久合欧美| 999熟女精品| 中文字幕一区二区三区四区在线视频| 在线只有精品| 日日不卡av| 囯产操逼片| 天美一二三在线观看Av| www国产无码| 97干在线| 国产精品一区二区三区在线| 成人福利视频网| 九九九九九九九九九五码| 操屄日韩| 亚洲男人的天堂一区二区| 久这精品中文在线观看视频| 99热伊人| 激情小说亚洲色图| 国产11页| 亚洲国产精品成人久久蜜臀| 美女超碰978| 久久久人妻| 人妻久久久| 黄色成年| 9 9精品一区二区三区| 女生看匆91网站| 婷婷激情五月| 91w欧美| 亚码激情| 色黄污美女啪啪啪免费网站| 国产精品国产| 激情专区综合| 天久久久噜噜噜久久国产精品爽爽| 中文字幕高清20页视频| 国语人妻精彩刺激| 女性喷水高潮在线观看| 60秒免费小视频| 八人操人人摸人人看| 加勒比久久av| 天天流夜夜操| 伊人丁香五月婷婷| 亚洲蜜臀精品视频久久| 男人天堂2019亚洲| 欧美一区二区三区互相| 久久久久久少妇| www.zbzhongsen.com| 日韩无码一区二区三区| 99蜜桃臀亚洲成人在线观看| 亚洲av淫乱| 天堂综合网| 香蕉婷婷| 无码外流操逼视频| 久久风骚城市| 草伊人高潮喷水超碰| 综合久久六月久久婷婷| 大香蕉中文在线| 久久久中文版| 激情小说五月天| 操操操五月天婷婷丁香影院| 超碰偷拍| 欧美狠狠操| 国产福利精品最新在线| jizz啪啪| 午夜美女诱惑电源网| 欧美第38页| 国产亚洲综合欧美一区| 素人一区二区三区日韩| 亚洲色图欧洲| 污电影在线观看| 国产不卡片| 丰满人妻大屁一区二区| 亚洲精品白浆高清久久久久久| 日韩精品三级| 综合久久99亚洲人妻中文在线| 五月花婷婷| 最新日产中文在线麻豆| 夜夜操美女| 超碰2017| 黄色工厂这里只有精品| 超碰欧美在线欧美| 97人人爱人人做人人乐| 美女啊啊啊啊啊啊啊| 亚洲欧美999| caorenqi shipin| 国产精品亚洲一级av第二区| 久热这里| 日韩BBN| 国产偷仑| 97中文字幕色| 日韩精品一区二区三区四虎影视| 深夜国产一区二区三区在线看| 国产欧美美女免费观看视频| 日韩黄色成人性爱| 亚洲精品日韩国产欧美| 操逼操网| 91小视频| 乱伦3P视频| 先锋色眉乱伦资源| 久久性爱视频99| 人妻丝袜美腿中文字幕| 精品免费囯产一区二区三区| 99精品久久久久久| 欧美97视频| 欧美黑人与女人91~| 夜夜嗨AV蜜臀av| 久久99综合| 国产亚州高清国产拍精| 99精品成人免费看| 亚洲一曲日韩精品| 神马久久午夜| 亚洲综合第一页| 日韩三级av片| 91青青草| 久久久97| 国产精品视频内谢女人| 干超碰碰熟女| 92久久| 亚洲天堂欧美| 免费观看一区| 啪啪综合网| 老外又粗又长一晚做五次| 蜜臀视频网站| 飘花国产午夜精品不卡| 激情抓乳插进去啪啪啪日韩 | 亚欧色图在线激情| 精品无吗m| 人妻天天爽天天爽三区| 亚洲天堂久久久久久粉红视频| 中文字幕精品久久久久人妻红杏ⅰ| 久久大陆| 久久久久久裸体| 97伦乱| 午夜福利合集| 国产又黄又粗又猛大片| 国产亚洲精品无码三区| 久久性爱精品一区| 青久久| 亚洲乱熟女一区二区| 久久久一区二区三区四区五区| 亚洲欧美洲综合| 色激情综合网站| 天天色,天天干,天天干| 狠狠激情综合狠狠操中文字幕| 男人的天堂亚洲| 大香蕉十区| 夜精品久无码| 精品人妻一区二区三区在线视频不卡| 亚洲天堂一区| 久久免费精品视频免一| 好淫网一二三视区| 蜜桃臀一区二区三区久久| 久久区| 色成人Www精品永久观看| 天天爽夜夜操| 男人的天堂日本东京热| 亚州综合在线| 色色香蕉| 熟妇亚洲一区二区三区| 国产AV天美传媒一区二区三区| 天堂无码| 国产熟女免费观看久久| 久久综合激情| 国产情色第一第二页在线观看| 欧美丝袜亚洲| 人人人人插| 国产不卡片| 国产97av| 国产绿奴视频在线观看| 亚洲色婷婷| 搡老女人老91妇女熟女| 亚洲国产成人综合碰碰三级经典| 成人三级片无码| 国产精品国产自产拍高清AV| 后入式五六区| 国产精品美女在线一区| 极品色社| 91狠狠综合久久| 少妇3P性爱自拍| 人人喜人人妻| 亚码人妻| 性爱网站一区二区| 混色激情av| 少妇精品久久久| 亚洲在线网站| 黄色AV影视| 97超碰大| 狠狠 91| 亚洲欧美小说| 久久大香蕉手机高清视频| 91综合网在线| 99综合免费视频| 少妇久久久免费| 啪一啪免费视频| 青春草A| 欧美午夜视频免费观看| 国产极品999| 亚洲无码精品AV久久久| 国产丝袜视频| 91精品人妻一品二品三品| av一区二区三区 中文| 91丝袜美腿片| 特级丰满少妇一级AAAA爱毛片| 欧美 传媒 麻豆 日韩 偷拍| 性饥渴少妇av无码毛片| 粘花网06av视频| 激情综合网激情综合| 极品粉嫩一区二区| 国产午夜在线观看| 91精品丝袜久久久久久无码人妻| 成人性爱免费播放| 超碰夫妻97| 欧 美 自 拍 偷 拍| 欧美熟妇亚洲版| 97在线精品观看视频| 新视频sss国产| 日韩精品中文字幕一| 99999无码| 在线岛| 色综合20p| 色五月激情综合网| 麻豆视频一区二区| 99999精品成人| 中文字幕一区二区日韩网| 成人在线午夜视频一区| 午夜理论片在线观看免费| 日韩色图 一区二区| 天天做天天爽| 精品免费一区| 蜜臀无码一区二区| 婷婷丁香五月激情啪啪| 大香蕉欧美| 日日干夜夜操视频h| 日本性爱不卡视频| 亚洲日韩精品一区二区| 亚洲熟妇图片| 91精品国产高清久久久久久,亚洲成人| 国产高清在线自在拍69| 亚洲色图超碰在线| 中文字幕一区二区日韩网| 99超碰网| 91亚洲不卡一区| 亚洲黄色网址视频| 97色香蕉| 青青青青草av在线观看| 亚洲黄色网址视频| 一区二区影视| 97爱b| 99少妇精品视频| 欧美一二三级精品在线| 欧美色蜜桃97| 色爱欲亚洲| 精品一区二区成人动漫| 欧洲色综合| 精品一区二区啪啪啪| 精品久久久久久AV无码| 2017天天插| 日韩精品操少妇| 欧美 亚洲 制服 精品| 中文字幕国产| 欧美999| 大香交| 欧美天天综合站| 好吊妞转入那个网| 2020国产精品| 成人a级高清视频在线观看| 日韩av色图| 9999伦理视频| 婷婷五月天色色| 无码精品人妻一区二区三区妖精| 99re在线| 亚洲色人阁| 亚洲性猛| 久久久久元码视频| 久久精品亚洲东京热色播| 情色AV电影| 久久精品国产72国产精品福利| 中文字幕日韩专区精品系列| 人妻久久| 久午视频| 日韩射图| 高清无码91| 97久久久久久久久久| 久草婷婷| 九一精品牛牛一区二区| 精品人妻一区二区三区-国产| 蜜臀少妇一区二区| 亚洲欧美精品福利在线| 果冻国产精品麻豆成人av| 国产又黄又爽又刺激久久久久久| 99人妻碰碰碰久久久久禁片| 揉揉日日日日| 97干色| 26uuu最新| 26uuu成人影片| 1级午夜影院费免区| 搞中出久久| 日韩探花精品在线视频| 日韩去日本高清在| 国产激情视频在线观看| 国产999精品久久久久久| 丰满人妻一区二区三区四| 欧美自拍偷拍综合图片| 亚洲综合另类小说色区亚洲成av人片在www | 粉嫩国产精品久久粉嫩| 亚洲精品视频在线| 夜夜肏2021| 九月婷婷| 一牛影视久久久一区二区三区| 亚洲高潮少妇| 欧美性后入| 欧亚不卡| 超碰综合97在线| 久久↗↗| 超碰97护士| 国产无码成人无码| 国产欧美日韩一区二区三区| 色天使亚洲综合在线观看| 日本高清一区二区在线| 久久精品美女一区| 91丝袜美女| 久久綜合很很很| 在线电影亚洲色图| 亚洲欧洲日韩中文字幕一区| 国产精品免费久久久久久久久久| 精品视频在线观看精品| 欧美人妻久久精品二区三区 | 欧美色图自拍| 伊人超碰97| 另类TS人妖一区二区三区| 日韩卡一卡二卡三在线| 91chinese在线| 久久久久密| 久久9精品网站| 精品国产乱码久久久久久蜜臀| 免费看黄片现成| 无码在线亚洲| 亚洲色图20p| 超碰69| 91色综合| 欧美黄片欧美黄片xxx| 麻豆天美国美国产| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 乱伦AVxx| 老女人日韩美91| 老熟妇一区二区三区啪啪| 91色香| 国产精品无码av在线| 麻豆视频test| 久男人久久| 日韩无码精品综合久久| 欧美一级A片在线看视频性色| 中文字幕视频2区| 操死我了啊啊啊| 五月丁香六月综合缴清无码| 亚洲一区中文字幕一区| 超碰久久草| 亚洲精品人体| 中文字幕一区日韩精| 亚洲熟妇无码一区二区三区| 東南亚性呦成人伦理资源在线视频| 精品美女久久久久| 偷拍伦理视频| 精品久操| 一级久久久久久久久久久| 欧美熟爽综合| 亚洲高清欧美总合| 亚洲一区二区三区播放在线| 欧美人妻二区三区| 久久97视频| 99日精品欧美国产| 任我爽在线视频免费观看| 亚洲高清视频在线免费观看| 99无码精品| 欧美日韩亚洲天堂网| 91综合站| 欧美日韩丝袜| 天天久久久久久| 天美麻花大全视频| 99re在线精品78| 午夜电影在线观看无码专区| 有码免费观看| 强奸乱伦 亚洲一区| 天美传媒av 在线| 999久久久国产精品| 色成人Www精品永久观看| 国产精品久久久久久久免牛肉蒲团| 尤物av网站免费在线播放| 97精品国产97久久久久久| 精品视频一区二区| 色五月综合网| 日本97久久| 激情综合婷婷| 蜜臀久久99精品久久久久电影| 色成人Www精品永久观看| 欧美日本不卡| 成人午夜小视频手机在线看| 国产精品毛片| 天天色综亚洲91污| 一区二区三区男人的天堂| 国产精品一级毛片不卡视| 欧美综合传媒| 日韩AV一起草| 在线欧美亚洲| 亚洲男人天堂Av| 老熟女乱伦片| 少妇69中文| 色伊人91| 国产AB视频| 天天流夜夜操| 成人九九| 射丝袜高跟鞋99| 欧美黑人精品在线播放| 日本免费一区二区不卡 | 伦在线97| 国产一级αv免费看片| 风间由美日韩欧美久久| 私色综合网| 日本αv| 欧美精品,四区。五区| 日产狠狠干| 97综合网| 蜜臀th| 久久九九99| 久久久一区二区三区三州| 91爱看| 美女刺激久久国产欧美| 精品福利| 一级黄碟| 无码国产Av| 亚洲国产天堂| 老鸭窝黄色视频网站| 成年人性爱日韩| 色汉综合| 色五月婷婷麻豆在| 无码天天操| 91熟女视频| 亚欧美综合网。| 亚洲五月天激情| 色综合V| 好涩综合| 中文字幕人妻色偷偷久久皮 | 日本一二区不卡| 精品亚洲俞拍视频一区| 思思热在线视频精品| 国产福利电影| 少妇淫妇久久久久久久| 国产一级久久久| 狠狠爱综合网| 国产精品高潮呻吟av久久4虎| 欧美精品亚洲精品日韩传电影| 亚洲一二三精品久久网 | 久久婷婷一区二| 成人午夜小视频手机在线看| 五月丁香黄色网| 福利五区| 久偷拍欧美日韩三区| 开心五月婷婷| 国产91久久九九免费精品无码| 九九热九九| 欧美亚洲特P| av一区二区三区四区五区久草臀| 丁香五月天视频| 岛园激情| 亚洲国产欧美另类自拍| 亚洲日韩精品久久久久一区壹牛 | 91在线视频观看国产| 78久久| 亚洲性高潮| 一二三四视频在线社区中文字幕| 日韩一级二级在线| 亚洲丝袜二区| 婷婷香蕉| 中文字幕一区二区免费在线| 偷拍 欧美 日韩| 97综合久久| 精品国产乱码久久久久久久| 久久色AV线| 青青草啪啪网| 四季AV一区二区凹凸精品小说| 欧美日韩超碰在线| 偷拍 精品另类 凸凹了四区| 国产亚洲色婷婷久久99精品91| 无码逼| 精品v日韩欧美国产| 熟女这里只有精品6| 东京热视频网| 亚洲成人激情小说视频| 国产色产精品在线观看| 伊人影院日本| 另类天堂| 人人操av| 色婷婷激情| 91N欧美| 亚洲色图超碰在线| 婷婷五月天基地| 国产原创自拍| 亚洲日韩AV视色| 欧美 中文字幕 一区| 东京热男人的天堂网| 91欧美高清| 英伦大奶子熟妇吊带| av在线人气| 伊人久久久日韩一区| 嗯嗯,好大,好爽,好骚| 青女在线| 大乔未久88一区| 九九九九欧美| 97射欧美| 麻豆熟妇乱妇熟色A片在线看 | 99热精品在线| 殴美性色a级欧美| 91天堂视频| 日韩丝袜高跟制服在线观看| 日韩大香蕉精品在线视频| av久日| 超碰97综合在线| 色天天野狼综合社区| 国产精品操| 国产特级毛片AAAAAA高潮流水| 国产极品精品美女视频| 国产AV久久久蜜爱影集| 日本欧美国内在线| 国产树林里野战在线看| 亚洲日本韩国在线| 日本一本一区二区三区四区五区欧美日韩中文字幕| 九九99久久| 天天影视色香色欲| 欧洲乱码视频| AV天堂因数| 激情婷婷综合久久| 亚洲精品第一| 四虎影库国产精品免费| 刺激性视频黄页| 久久久久久无码人妻中文字幕| 黄色工厂这里只有精品| 国内精品久久人妻性色av| 中文字幕 国产区| 久久久久成人蜜桃精品| 国产日韩欧美| 在线天堂资源亚洲| 免费一级黄色录像影片| av天天在线观看| 亚洲成人精品久久久| 成片免费播放| 亚洲。日韩。欧美| 67914在线兔费成人视频| 狠狠色伊人亚洲综合网站色| 无码操逼网| 精品福利视频| 欧美猛交黑寡妇中文字幕| 91成人无码| 精品毛片久久久精品毛片| 女优免费一区二区永久| 久久久内射良家| 免费看黄片现成| 色五月综合网| 后入式五六区| 日韩av性爱在线播放| 欧美亚洲一级在线观看| 在线另类| 激情文学亚洲| 午夜福利免费福利视频| 天堂蜜桃无码视频一区二区| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 欧美,日韩,中文,另类| 精品无码久久久久久久久果冻糖心 | 成人资源中文字幕在线观看天天| 亚洲性猛| 深夜福利黄片| 日本 成 人 小说 电影 一区二区| 欧美综合色综合| 国产探花日韩援交| 色九区| 青青草原狼av| 男人的天堂2018.| 91综合天天| 热久久国产| 久久伊人网视频一区二区三区 | 欧美日韩精品久久久久东北老熟妇| 日韩三级伊人| 精品夜夜澡人妻无码| 97超碰超| 久操不卡视频| 久久久免费高清中文视频| 成人免费福利网站国产| 久草婷婷| 波多野结衣一级视频| 91丝袜美女| 国产主播福利| 精品久久久久黄少妇| 超碰免费人妻在线| 91九九九馒头| 国产精品白丝在线播放 | 夜夜草我| 久久精品欧美一区蜜桃| JuliaAnnXXX888| 五月婷婷六月丁香| 国产在线激情| 嗯嗯啊中文字幕| 新亚洲无码| 国产欧美美女免费观看视频| 九九九色| 日日夜夜国产综合| 秋霞操逼片| 超碰午夜| 久久98| 蜜区区视频79| 大稥蕉免费视频这里只有精品| 超碰97久久| 日本少妇va7777| 人人操肉肉| 99只有精品| 伊人久久婷婷| 大香蕉欧美| 影音综合网| 黄片com.| 亚洲欧美碰碰| 校园春色制服丝袜中文字亚洲| 精品免费视频国产一区| 久久久久ab| 日韩A优精品在线观看| 人妻激情视频| 视频在线观看一二三区| 麻豆国产精品午夜视频| 国产成人精品午夜福利| 天天拍天天操| 男人的天堂 在线一区| 美女久久久久久久| 日韩欧美aⅴ综合网站发布| 自拍亚洲综合| 天综合网| 99在线无码精品秘 入口黑人 | 女人高潮大叫一级毛片| 97综合久久| 999综合色| 992这里有精品| 日本不卡高清视频| 青青草大香蕉视频| 欧美日韩一干二干| 综合婷婷| 人人干黄色| 91 综合网| 试看60秒| 亚洲一区二区麻豆影院| 欧美天天干| 91久久久亚洲| 在线情色电影 91大| 97人肏| 91GD.COM| 豆花视频操逼网址| 欧美天天干| 呻吟 欧美 日本 中出| 五月色综合| 日韩少妇一区二区三区| 精品无码欧美三级| 怡红院亚洲怡春院av| 黑人中出21连凳花野真衣| AV九九| 91香蕉视频在线观看免费| 久久国产乱子伦精品免费女,网站| 91少妇香蕉久久精品| 98色网| 丁香五月久久| 国产又大又硬又长又粗| 91操操操操| 久久精品熟妇丰满人妻99| 国产精品97超碰| 亚洲男人的天堂AV| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 老女人91| 久久久久久波多野吉衣高潮| 久久人妻视频网| 中国一区二区亚洲人妻| 秋霞久久亚洲精品成人| 国产精品4p在线观看| 中文字幕青青草| 国产成人啪一区二区| 亚洲自拍欧美色综合| 久久9精品视频| 极品五月天噜噜| 亚洲色图激情小说| 国产一级αv免费看片| 丁香五月综合| 欧美人妻一区| 日韩无码a片| 日本精品无码三级网站| 操日韩第| 久久九九视频九九视频| 日韩黄片影院| 无码一区二区精品视频久久久春药 | 成人性爱视频在线看| 99国产精品视频尤物| 一起草高清无码| 欧美日韩在线视频网站| 日韩综合无码一区久久92| 亚洲欧美日韩中文播放| 国产白丝AV| 玖草在线视频| 亚洲熟伦熟妇AV无码春色| 超碰97中文| 日韩啊V| 亚洲无码太久| 乱伦一二三区| 做爱A级亚欧| 日韩激情中文字幕有码| av片在线观看免费播放| 久热香蕉精品在线视频| 中文字幕狠狠玩| 亚洲综合五月天| 日韩成人网址| 岛国小电影| 欧美夜夜骑视频|