99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(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內核的MCU開發(fā)幾乎沒人能繞開HardFault這個坎。它不像普通邏輯Bug那樣能靠肉眼掃代碼看出來往往是程序跑著跑著突然就掉進一個死循環(huán)調試器一停PC指針指到一個莫名其妙的地址看門狗又跟著湊熱鬧整個系統(tǒng)直接癱瘓。我最早被HardFault支配的時候項目工期緊板子還只有一塊只能靠復位大法續(xù)命后來踩的坑多了才慢慢摸清楚這套異常處理機制的脾性。其實Cortex-M的異常和中斷處理是一個非常精巧的系統(tǒng)你把它搞明白了HardFault定位就是一道送分題。這篇文章不聊虛的直接從內核異常模型講起把HardFault的根因、Cortex-M異常處理流程、借助Keil MDK進行現(xiàn)場追蹤和調試的完整套路都掰開揉碎講清楚。無論你是用STM32、GD32還是其他Cortex-M內核的國產MCU這套方法論全部通用保證你下次再遇到HardFault能少掉一大半頭發(fā)。1. 先吃透Cortex-M異常處理模型1.1 異常和中斷的底層關系很多初學者會把“異常”和“中斷”當成一回事其實在Cortex-M內核里這兩個概念有明確的層級關系。從ARM官方手冊的定義來看異常Exception是所有打斷CPU正常執(zhí)行流程事件的統(tǒng)稱而中斷Interrupt只是異常的一個子集專指由外部引腳或內部外設觸發(fā)的那一類。Cortex-M3/M4內核把異常源按編號排了一張表編號越小優(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能插一腳其他任何中斷都沒法搶占它處理器會立刻跳轉到HardFault_Handler。反過來如果某個異常的處理程序在執(zhí)行過程中出了問題而它的優(yōu)先級又比HardFault低那么就會被HardFault吞掉不會再報原來的錯誤。這里有個非常容易踩的坑很多人在寫中斷服務函數(shù)的時候發(fā)現(xiàn)程序跑飛了但調試器彈出來的窗口指向的是HardFault_Handler于是就開始在HardFault里找原因。其實真正的錯誤源頭很可能是你的某個外設中斷里干了不合法的事HardFault只是被拉來“背鍋”的。所以定位HardFault的第一步是搞清楚它是主動觸發(fā)還是被動吞掉。1.2 異常處理的硬件自動壓棧機制Cortex-M在處理異常時有一個和傳統(tǒng)MCU內核比如51、AVR完全不同的特點硬件自動壓棧。也就是說當異常發(fā)生時CPU會自動把xPSR、PC、LR、R12、R3-R0這8個寄存器壓入當前使用的??臻g這個過程不需要軟件干預是在異常入口處由硬件完成的一整套流水線操作。壓棧之后處理器會做什么它會從向量表中取出對應異常的處理函數(shù)地址跳轉過去執(zhí)行。這個過程叫異常返回準備硬件會把LR設置成一個特殊的值叫做EXC_RETURN這個值不是一個真實的內存地址而是一個帶有特殊含義的標記。比如0xFFFFFFF9表示從線程模式使用主棧指針MSP返回0xFFFFFFFD表示從線程模式使用進程棧指針PSP返回0xFFFFFFF1表示從處理模式返回。如果你用了FPU比如Cortex-M4F還會看到0xFFFFFFE9和0xFFFFFFED這類帶FPU擴展位標記的值。理解這個機制對HardFault調試至關重要。因為當你停在HardFault_Handler里時當前棧頂保存的就是觸發(fā)異常那一刻的“案發(fā)現(xiàn)場”——那8個寄存器的值。只要能正確解讀這些值就能還原出CPU在異常發(fā)生前到底在執(zhí)行什么代碼PC指針指到哪個函數(shù)LR是哪個調用者以及R0-R3傳了什么參數(shù)。這套方法在后面我會詳細演示。1.3 為什么要理解異常模型而不是背流程有人可能會說我知道了HardFault的向量號是3也知道了硬件壓棧但這些對我的實際調試有什么幫助有而且?guī)椭艽?。舉個實際例子。我曾經調一個電機驅動板現(xiàn)象是運行幾十秒后系統(tǒng)死機復位后又能跑一會兒。一開始我以為是看門狗問題關了看門狗再跑還是會死。后來我把硬件壓棧的知識用上在HardFault_Handler里把當前棧指針的值讀出來然后按8個字32位系統(tǒng)一個字是4字節(jié)的偏移找到異常發(fā)生前的PC值再在反匯編窗口里定位到這個PC對應的代碼位置結果發(fā)現(xiàn)是在一個電機電流采樣的DMA中斷里代碼試圖訪問一個已經關閉了時鐘的外設寄存器。問題的根源是時鐘門控配置順序錯了導致中斷觸發(fā)時外設時鐘被關掉了總線訪問直接觸發(fā)BusFault又被HardFault吞掉。如果我不懂異常模型和壓棧機制單靠肉眼一行行看代碼這種隨機死機的問題可能要排查好幾天。但有了這套底層知識半小時不到就能鎖定肇事代碼。這就是我為什么堅持先講原理再講實戰(zhàn)的原因原理通了所有所謂的“疑難雜癥”都會變得有跡可循。2. HardFault根因大盤點到底是哪些場景最容易觸發(fā)2.1 存儲訪問類異常越界、未對齊、非法地址Cortex-M內核的存儲系統(tǒng)有一個特點它把存儲訪問錯誤細分為好幾類在System Control BlockSCB里有三個非常關鍵的故障狀態(tài)寄存器分別是可配置故障狀態(tài)寄存器CFSR、硬故障狀態(tài)寄存器HFSR和故障地址寄存器MMFAR/BFAR。CFSR又拆成三個子區(qū)域內存管理故障狀態(tài)寄存器MMFSR、總線故障狀態(tài)寄存器BFSR、用法故障狀態(tài)寄存器UFSR。實際調試里最常見的HardFault觸發(fā)原因匯總下來大概有這么幾類野指針訪問指針未初始化或者指向已經釋放的內存讀寫的時候直接踩到非法地址。數(shù)組越界尤其是寫入越界覆蓋了相鄰變量或者棧上的關鍵數(shù)據(jù)導致返回地址被破壞PC跳飛。棧溢出任務棧分配太小調用層級一深或者局部變量一多棧指針直接頂穿棧底寫到了不可訪問的區(qū)域。未對齊訪問Cortex-M3及以上內核雖然支持部分非對齊訪問但對某些指令比如LDRD/STRD、LDM/STM以及訪問外設寄存器時非對齊會直接觸發(fā)UsageFault或者BusFault。訪問不存在的地址映射了外設的區(qū)域但外設時鐘沒開或者地址本身超出MCU的地址空間。前面兩類是新手最容易踩的也是面試官最愛問的因為它們能反映一個人對內存布局的理解程度。我見過太多這樣的代碼定義一個全局數(shù)組存數(shù)據(jù)然后根據(jù)某個變量對數(shù)組進行寫入變量算出來是負數(shù)直接越界寫到了數(shù)組前面的內存。在Cortex-M上這種越界寫有時候不會立刻觸發(fā)HardFault而是靜默地破壞了相鄰變量的值等程序邏輯表現(xiàn)出來的時候離真正的錯誤點已經很遠了。2.2 異常嵌套與優(yōu)先級配置的經典坑Cortex-M內置了嵌套向量中斷控制器NVIC它允許高優(yōu)先級中斷搶占低優(yōu)先級中斷。這個機制本身是好的但如果你在中斷服務函數(shù)里做了不該做的事就會引發(fā)連鎖反應。最常見的幾個坑第一中斷服務函數(shù)里調用printf。printf內部涉及文件系統(tǒng)級別的緩沖操作有些庫實現(xiàn)里不是可重入的。低優(yōu)先級中斷正在執(zhí)行printf的過程中被打斷高優(yōu)先級中斷里又調用了printf兩個printf的上下文互相踩踏棧上的返回地址被破壞程序直接HardFault。這個問題在帶RTOS的環(huán)境里更明顯因為每個任務的棧是獨立分配的但中斷棧在裸機環(huán)境下就是主棧大家共用。第二中斷里操作浮點寄存器。Cortex-M4F有FPUFPU的寄存器保存是惰性的默認情況下中斷不保存FPU上下文只有真正用到浮點指令時才觸發(fā)自動保存。如果你在主程序里用了FPU又在中斷里用了FPU而RTOS的任務切換沒處理好FPU上下文就會出現(xiàn)FPU狀態(tài)寄存器值錯亂導致計算結果完全不對甚至觸發(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)先級設定就會被攪亂某些原本應該被屏蔽的低優(yōu)先級中斷突然搶占了高優(yōu)先級中斷時序錯亂最終可能引發(fā)HardFault。2.3 指令執(zhí)行類異常未定義指令、除零、狀態(tài)切換失誤還有一類HardFault是從指令執(zhí)行層面觸發(fā)的這類問題在啟用優(yōu)化等級之后尤其難以復現(xiàn)。典型場景包括函數(shù)指針調用錯誤函數(shù)指針被寫入了一個非法地址跳轉過去之后取到的指令全是不合法編碼觸發(fā)UsageFault。跳轉到Thumb/ARM狀態(tài)混亂Cortex-M只支持Thumb指令集如果某個函數(shù)指針的最低位置0了表示ARM狀態(tài)處理器在取指時就會出錯。這個在C代碼里很難遇到但在匯編或者從應用里跳轉到Bootloader的時候容易出問題。除零操作Cortex-M默認情況下整數(shù)除零不觸發(fā)異常但如果軟件里開啟了DIV_0_TRP位除零就會觸發(fā)UsageFault進而被HardFault吞掉。未對齊的棧操作比如SP指針沒有保持8字節(jié)對齊在某些需要對齊訪問的LDRD/STRD指令上會直接觸發(fā)異常。這些場景有一個共同特點它們在正常代碼流程上是不會出現(xiàn)的往往是因為某個內存被破壞導致PC跳到了錯誤的位置執(zhí)行了錯誤的指令。所以當你發(fā)現(xiàn)HardFault是因為取到了一個未定義指令不要急著去查這條指令在哪里而應該去查是誰把PC弄過去的——大部分情況是函數(shù)返回地址被篡改少部分是函數(shù)指針被污染。3. 調試實戰(zhàn)一套可復制的HardFault定位方法論3.1 現(xiàn)場恢復從Keil5中提取異常前PC值很多人遇到HardFault的第一反應是直接在HardFault_Handler里打斷點然后點Run讓它停在斷點處。這個思路有一半是對的但如果你只在HardFault_Handler里打斷點你會發(fā)現(xiàn)一個尷尬的問題程序每次復位跑進HardFault_Handler停下來的位置幾乎永遠是同一個地方那就是HardFault_Handler的第一行匯編指令。這個信息量太少了你根本不知道是誰觸發(fā)它的。正確的做法是當程序停在HardFault_Handler時先從寄存器窗口讀取當前的SP值。關鍵點來了怎么知道這個SP是MSP還是PSP看LR寄存器如果LR的值是0xFFFFFFF9說明當前在處理模式用的是MSP如果LR的值是0xFFFFFFED說明異常返回目標是線程模式且使用PSP那當前用的棧指針需要從進程棧指針寄存器里單獨讀取。拿到SP之后從SP指向的地址開始向上讀取內存前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地址回車就能看到對應的匯編指令再對照源代碼窗口基本就能定位到肇事代碼行。3.2 深入理解EXC_RETURN別被LR騙了在HardFault現(xiàn)場讀取寄存器時有一個細節(jié)容易讓人迷惑在壓棧數(shù)據(jù)偏移20處確實有一個LR但它不是異常發(fā)生前的調用者LR。這個LR是CPU在進入異常時自動壓棧的它保存的是觸發(fā)異常那一條指令的“返回地址”準確說是觸發(fā)異常的指令地址加上一定偏移可能指向BL指令的下一條指令地址也就是調用者真正要返回去執(zhí)行的地方。而CPU當前的LR寄存器里保存的是一個EXC_RETURN它根本不是一個真實地址。我見過很多人在HardFault調試時看到寄存器窗口里LR的值是0xFFFFFFF9然后把它當作調用鏈里的一個函數(shù)地址拿來查結果在反匯編窗口里輸入這個地址之后發(fā)現(xiàn)根本查不到有效代碼——因為0xFFFFFFF9就不是一個地址。所以一定要記住異常現(xiàn)場的調用關系要看壓棧數(shù)據(jù)里的舊LR而不是當前的LR寄存器。當前LR寄存器里那個0xFFFFFFF9/0xFFFFFFED是用來告訴硬件“異常返回時用什么模式、用哪個棧指針”的。如果你用的是帶FPU的Cortex-M4F或M7壓棧的數(shù)據(jù)結構會不一樣。當異常發(fā)生時硬件檢測到當前上下文使用了FPU會自動多壓18個字16個FPU寄存器S0-S15加FPSCR加一個保留字。這種情況下SP指向的第一組8個字仍然是R0-R3、R12、LR、PC、xPSR但在這組數(shù)據(jù)之后緊接著的是FPU寄存器區(qū)。判斷是否發(fā)生了FPU壓棧看EXC_RETURN的最后一位如果是1表示有FPU壓棧。比如0xFFFFFFED這個值最后一位已經無法直接區(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ā)總線故障或內存管理故障的具體地址的BFAR、MMFAR。如果你不想開圖形窗口也可以在Watch窗口手動添加寄存器表達式(volatile unsigned long)0xE000ED28就是CFSR的地址0xE000ED2C是HFSR0xE000ED38是BFAR0xE000ED34是MMFAR。我自己調試時有一套固定流程先讀HFSR看FORCED位是不是1。如果是說明下面肯定有一個具體的可配置異常被觸發(fā)過繼續(xù)讀CFSR對應子區(qū)域。如果CFSR里的MMFSR有置位說明是內存管理故障結合MMFAR的值看是訪問了哪個地址。如果BFSR有置位說明是總線故障結合BFAR看地址。如果UFSR有置位比如UNALIGNED位為1說明是未對齊訪問結合PC反匯編看具體是哪條指令。這里有一個值得注意的點如果BFAR/MMFAR的值是0并不意味著沒有訪問故障而是意味著CPU沒有捕獲到有效的故障地址。這種情況經常發(fā)生在指令預取階段也就是CPU去取一條非法指令時發(fā)生了總線錯誤這時候不會更新BFAR。所以要結合PC一起判斷不能只看地址寄存器。3.4 基于LR的調用?;厮菁记赡玫疆惓G暗腜C和舊LR之后我們其實已經能確定是哪個函數(shù)里出的問題。但如果PC落在一個比較靠后的工具函數(shù)里比如memcpy或一個數(shù)學庫函數(shù)內部光是看到PC還不夠——我們需要知道是誰調用了這個函數(shù)才能理解整個觸發(fā)鏈路。這個時候就要用到調用?;厮?。手動回溯的原理是棧指針SP指向的壓棧數(shù)據(jù)里偏移20處保存的是進入異常前的LR它指向調用者的下一條指令沿著這個“函數(shù)返回地址”的鏈條再往上追一級需要知道當前函數(shù)的棧幀是怎么建立的。Cortex-M的AAPCS過程調用標準規(guī)定函數(shù)入口處通常會有PUSH {r4, lr}這樣的指令也就是把被調用者保存寄存器R4-R11和鏈接寄存器LR都壓到棧上。如果我們在異常前的PC處往回看幾條指令能確認這個函數(shù)確實有PUSH {lr}操作那么當前SP加上壓棧偏移再往里找就能找到上一層函數(shù)的LR以此類推能還原出完整調用鏈。在Keil5里更簡單的方案是直接使用Call Stack窗口。當程序停在HardFault_Handler時打開View—Call Stack WindowKeil會根據(jù)當前棧內容自動解析調用鏈。但注意自動解析有時候依賴調試信息如果你開啟了較高的優(yōu)化等級比如-O2/-O3很多棧幀信息被優(yōu)化掉了Keil解析出來的調用關系可能不準甚至會報錯。這種情況下手動從壓棧數(shù)據(jù)里讀PC和LR是唯一可靠的方法這也是我把手工回溯放在這里重點講的原因。3.5 Keil5中的高效輔助調試手段除了上面這些偏底層的分析方法Keil5本身還提供了一些非常實用的輔助功能用好了能大幅提升定位效率。第一個是硬件斷點和數(shù)據(jù)斷點。如果HardFault的觸發(fā)和某個特定變量的寫入相關可以在Keil里給這個變量打數(shù)據(jù)斷點Data Breakpoint這樣當代碼試圖修改這個變量時CPU會立刻停下來調用棧就是完整的調用者信息。這在排查棧溢出和數(shù)組越界寫時特別有效。數(shù)據(jù)斷點數(shù)量有限Cortex-M3/M4一般支持4個但用來盯一兩個關鍵變量足夠了。第二個是異常窗口Fault Reports結合邏輯分析儀。Keil5的Fault Reports不僅能顯示CFSR/HFSR的解析結果還能顯示是哪個異常號觸發(fā)的。配合邏輯分析儀窗口觀察若干GPIO電平可以判斷異常發(fā)生的時間和外部事件的時序關系。比如之前排查一個通信模塊隨機死機的問題我用GPIO在中斷入口和出口各翻轉一次然后用邏輯分析儀抓異常發(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”然后在代碼里調用__get_MSP()和__get_PSP()讀取當前棧指針比對棧底地址就能計算出剩余??臻g。配合Keil的“Stack Usage”分析編譯后從View—Analysis Window—Stack Usage看可以評估每個函數(shù)的棧消耗。這個功能在排查棧溢出HardFault時非常直觀基本能把問題縮小到具體任務。4. 常見問題與排查技巧實錄4.1 一個典型問題no cortex-m sw device found結合熱搜詞里出現(xiàn)頻率很高的一個問題“no cortex-m sw device found”這類問題雖然不算HardFault本身但和HardFault調試強相關。最簡單的情形是程序跑飛后進入HardFault然后你點Keil的Debug按鈕結果彈出“no cortex-m sw device found”根本連不上調試器。這通常不是調試器壞了而是目標芯片在死機狀態(tài)下把SWJ調試端口占用了或者時鐘配置被改掉了調試器復位之后握不上手。解決辦法分兩種。如果目標芯片還在響應復位可以在Keil的Debug—Settings里把Reset and Run選項打開或者在連接失敗時按住目標板上的復位鍵然后點擊Debug在松開的瞬間讓它握上SWD握手信號。更穩(wěn)妥的方案是用一個腳本文件在調試器初始化時先讓芯片保持在復位狀態(tài)配置好SWD速度后再釋放復位。對于STM32系列有些型號還支持通過BOOT0拉高進入系統(tǒng)Bootloader模式此時內核運行在出廠固件上SWD端口必然是釋放的連接成功后把BOOT0拉回低電平就能正常刷固件和調試了。如果你用的是國產MCU比如GD32、AT32這些SWD連接失敗的原因還要多排查一個讀保護。很多國產芯片默認出廠時讀保護是使能的或者你在調試過程中不小心開啟了讀保護級別1這會導致調試器無法通過SWD訪問內核。解決辦法是用對應的燒錄工具執(zhí)行全片擦除解除讀保護。我在一次GD32的調試中就遇到過程序跑到某處觸發(fā)了HardFault但重置之后居然連不上調試器最后發(fā)現(xiàn)是代碼里某段錯誤的存儲區(qū)寫操作意外修改了選項字節(jié)把讀保護打開了。4.2 HardFault發(fā)生的時機隨機如何復現(xiàn)和抓取HardFault最折磨人的一點是它有時候不是100%復現(xiàn)的。你在調試器下跑幾十次都好好的一上電裸跑可能幾分鐘就死一次。這類“幽靈式”死機通常有幾種原因時序相關的資源競爭中斷和主循環(huán)同時訪問共享變量、堆棧踩踏發(fā)生在特定函數(shù)調用組合下、以及硬件外設的偶發(fā)錯誤狀態(tài)。我的經驗是先開啟MPU內存保護單元來構造一個隔離環(huán)境。Cortex-M3及以上內核幾乎都帶MPU配置它可以給不同內存區(qū)域設置訪問權限。比如把棧區(qū)所在的內存塊設置為只讀的一旦發(fā)生棧越界寫入MemeManage異常會立刻觸發(fā)——這個異??梢酝ㄟ^中斷向量直接跳轉配合調試器的斷點能精準捕獲到越界寫入的第一現(xiàn)場。這個技巧對排查棧溢出簡直不要太爽不用靠猜直接讓硬件替你盯著。如果復現(xiàn)是隨機的還可以利用Cortex-M內核的異常返回機制做“二次觸發(fā)”設計。簡單說在HardFault_Handler里不直接死循環(huán)而是把MSP的值修正為初始值然后重新跳轉到復位向量讓系統(tǒng)軟復位。這樣雖然程序重啟了但在重啟前把故障現(xiàn)場的關鍵寄存器PC、LR、CFSR、BFAR通過一個保留內存區(qū)域保存下來系統(tǒng)恢復后可以通過串口打印或者調試器查看。這種方式在生產環(huán)境下是終端產品的一個保底方案正常運行時不打斷業(yè)務故障出現(xiàn)時能把現(xiàn)場留給工程師。4.3 Keil5里遇HardFault的幾條高效操作口訣我把自己多年Debug開發(fā)過程里驗證過的操作整理成了幾條口訣式清單配合上面講的方法論使用定位HardFault基本能控制在幾分鐘內一是“一定位、二看壓、三讀故障”。所謂一定位是讓程序停在HardFault_Handler時先別慌通過寄存器窗口和棧信息定位當前SP二看壓是讀取壓棧的8個字拿到異常發(fā)生前的PC和LR三讀故障是看CFSR/HFSR的解析結果確認屬于哪類故障并抓住BFAR/MMFAR。二是“先棧后碼”。排查HardFault時優(yōu)先檢查棧的完整性看SP地址是否落在合法區(qū)間內壓棧內容里PC是否指向一個合理代碼地址比如ROM范圍內LR是否指向一個有效的調用者。很多時候棧已經被踩得面目全非PC指向的是一個類似于0x0800xxxx的保留地址說明返回地址被覆蓋了這時候與其去分析那條非法PC不如順著棧底往上找看哪個區(qū)域被寫入了不該寫的數(shù)據(jù)往往能揪出越界寫和緩沖區(qū)溢出。三是“優(yōu)化等級降一降”。HardFault和編譯器優(yōu)化等級的關系非常密切。很多代碼在高優(yōu)化等級-O2以上下行為和-O0完全不同因為編譯器可能會省去一些邊界檢查、重排表達式、把局部變量直接映射到寄存器。當你用-O0能跑通、用-O2就HardFault時先別懷疑芯片也別盲目加volatile——先看反匯編確認是不是優(yōu)化導致了某個變量在你預期的時間點還沒被寫回內存或者某個中斷里讀取的共享標志被優(yōu)化成了寄存器緩存。實在不行對可疑模塊單獨關閉優(yōu)化這是最直接的止損手段。四是“多路檢查不迷信單點現(xiàn)象”。舉個例子有些HardFault彈窗時當前PC停在HardFault_Handler函數(shù)調用棧窗口里顯示的都是HardFault_Handler附近的信息僅憑這個現(xiàn)象你可能會以為是HardFault_Handler自己的代碼問題。其實不然因為編譯器把故障代碼編進了同一個文件調試器展示的調用棧信息是“物理上等價”的。正確做法是回到現(xiàn)場數(shù)據(jù)層面以壓棧PC和CFSR為準不要被調試器的可視化結果帶偏。4.4 從HardFault再往前一步寫一個故障記錄模塊追著HardFault打補丁是被動的我更推薦每個項目在開發(fā)階段就內置一個故障記錄模塊代碼量不大但能在后續(xù)所有調試中節(jié)省大量時間。這個模塊的核心就兩件事第一在HardFault_Handler里把現(xiàn)場數(shù)據(jù)PC、LR、SP、CFSR、HFSR、BFAR/MMFAR、R0-R3、R12、xPSR保存到一個固定的內存區(qū)域第二把保存的現(xiàn)場數(shù)據(jù)在系統(tǒng)重啟后通過串口或者調試信息輸出出來。存儲區(qū)域的位置需要動一點腦筋。如果直接定義一個全局結構體變量那么它會被編譯器分配到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故障記錄模塊里最好也保存當前任務句柄或任務名信息因為很多HardFault和任務切換相關知道是哪個任務出事的排查范圍能縮小很多。4.5 常見問題速查表現(xiàn)象可能原因排查要點解決建議HardFault_Handler里PC指向非法地址棧溢出或返回地址被篡改檢查棧頂和SP差值、壓棧區(qū)的PC值增大??臻g檢查緩沖區(qū)越界CFSR的BFSR位置位BFAR不為0數(shù)據(jù)訪問觸發(fā)了總線故障看BFAR訪問的是哪個地址檢查外設時鐘、地址空間合法性CFSR的UNALIGNED位置位開啟了對未對齊訪問的陷阱定位到具體訪問指令檢查數(shù)據(jù)結構對齊或關閉該陷阱HFSR的FORCED位置位CFSR全0嵌套異常導致無法上報檢查異常返回和棧狀態(tài)減小中斷里復雜操作增加棧深度出現(xiàn)HardFault后連不上調試器SWD接口被占用或讀保護開啟按復位鍵連接檢查選項字節(jié)短接NRST或使用Bootloader模式優(yōu)化后才能復現(xiàn)HardFault編譯優(yōu)化引入了時序/內存差異反匯編關鍵函數(shù)對比-O0和-O2局部關優(yōu)化或重寫臨界區(qū)邏輯HardFault伴隨FPU相關異常FPU上下文保存不完整檢查RTOS任務切換對FPU的處理開啟FPU惰性壓?;騿⒂萌蝿占塅PU保存表格里列出的這幾種情況基本覆蓋了我日常開發(fā)中九成的HardFault問題。尤其是第一條“返回地址被篡改”我再單獨多說一句它在?;厮輹r表現(xiàn)特別迷惑因為PC壞得很徹底反匯編窗口跳到一片空白或保留區(qū)域。遇到這種情況不要死磕PC回到棧區(qū)往上找看棧里有沒有出現(xiàn)“很規(guī)律”的填充數(shù)據(jù)比如0xA5A5A5A5或全0這種填充數(shù)據(jù)往往是緩沖區(qū)沒有初始化或者棧保護魔數(shù)從它們被破壞的位置就能反推是哪一段越界寫導致的。5. 寫在最后的心得跟HardFault打了這么多年交道我最大的體會是它不是一個“玄學問題”而是有一套固定邏輯鏈路的工程問題。你越是靠運氣去復位、重試它就越折磨你你越是把異常模型、壓棧機制、故障狀態(tài)寄存器這些底層知識吃透它反而越聽話甚至能變成你定位內存問題、時序問題的一把利器。最后再分享一個我每次都會檢查的細節(jié)在寫中斷服務函數(shù)時盡量讓代碼保持短小精悍不在中斷里做printf、malloc、延時這類操作每個中斷都加上對參數(shù)合法性的檢查對共享變量加上保護。這些老生常談的規(guī)則每一條背后其實都是HardFault的血淚教訓。認真去執(zhí)行你開發(fā)中遇到的HardFault概率至少能降一半。剩下的一半用前面講的那套方法也能快速定位、體面收場。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
五月丁香六月色婷婷| www.五月丁香| 亚洲综合1024| 丁香五月欧美婷婷| 色五月网址| 99热日韩这里只有精品| 亚欧州精品视频| 中国女人做爰A片| 99在线亚洲| 超碰碰碰碰| 国产黄色在线观看| 超碰精品在线| 久9视频| 婷婷区日本| 玖玖综合玖玖| 色婷婷色综合久久精品V| 天天草天天日| 精品人妻伦| 亚洲Av成人在线观看| 99成人小视频| 亚洲午夜精品久久久久久人妖| 韩日另类| 国产99久久久国产精品免费看| 欧美日本另类| 五月激情婷婷在线| 丁香六月婷婷激情| 丁香色情五月综合网站| 精品综合久久久久久五月天| caopeng超碰| 涩五月丝袜婷婷| 五月丁香色综合| 91丨九色丨熟女| 精品色色色| 激情深爱综合| 97色色色色色色色| 亭亭丁香aV| 日本在线视频播放91| 日韩欧美成人网| 日日夜夜干| 色婷婷狠| 五月天综合久久| av操一操| 五月天婷婷深深爱| 五月天狠狠干| 婷婷五月深爱五月| 婷婷色色播五月天| 婷婷丁香基地在线| 色五月丁香五月婷婷五月成人网| 五月开心深深爱激情综合| 五月情丁香色| 九九亚洲小视频| 26uuu淫色| 中文字幕在线日亚州9| 棕合影院色色| 九九综合网色全集 | 入口五月婷婷六月香| 97色图片中文字幕视频在线观看| 色一情一乱一乱91Av| 五月丁香婷婷激情爱爱| 久久艹网| 991精品在线视频| 超碰国产在线观看| 99操| 人妻AV在线| 色色色综合色| 不卡在线超碰| 五月天怕怕| 色99欧洲色19| 铁牛TV人妻| 色色五月天婷婷丁香| 色综合久久综合| 婷婷丁香无码专区| www色婷婷com| 91日韩美女被插视频| 色黄啪啪| 51XX嘿嘿午夜无码| 九热久| 久久亚洲天堂| 婷婷中文在线| av国产精品偷| 97人人干人人操| 99精品爱| 色婷婷视频| 日本熟妇乱妇熟色A片蜜桃| 日日操夜夜爽| 99惹精品视频| 99视频精品视频| 久操97| 亚洲乱码日产精品BD| 4399在线日本A片| 五月久久丁香| 开心六月丁香五月婷婷| 五月伊人网| 91主播在线| 久婷婷婷| 99热国产免费| 天天干夜夜想| 强伦轩人妻一区二区电影| 色情·com| 久久五月婷婷丁香| 九九中文字幕九| 无码激情AAAAA片-区区| 狠狠狠狠狠狠色| 中文精品在| 日韩aⅴ视频| 五夜婷婷| 亚洲va欧美va天堂v国产综合| 五月丁香六月婷婷综合网| 久久久激情| 五月婷婷婷| 色操综合| 1囯产午夜仑鲁鲁| 丁香五月首页| 9 1超碰九色| 久色激情| 热99AV网站| 丁香五月天婷婷中文| 丁香五月综合高清在线| 日日爱678| 大香蕉人人网| 99热碰碰| 激情综合区| 色五月激情| 亚洲另类久久| 天天干天天操天天上| 男人天堂亚洲综合| 婷婷色色播五月天| 狠狠狠狠狠狠草| 丁香五月天偷拍| 久久99jiu9| 久草热8精品视频在线观看| 亚洲色综合| 人妻操逼视频| 欧美成人精品A片免费一区99| 天天干天天色综合| 六月丁香网| 伊人久久艹| 欧洲亚洲精品| 夜夜穞天天穞狠狠穞AV美女按摩| 国产肥白大熟妇BBBB视频| 色婷视频| 婷婷丁香五月在线观看91| 99ri网站在线观看| 操操操91| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 久久一热| 婷婷成人五月天| 婷婷五月天论坛| 26UUU亚洲欧美| 丁香五月婷婷六月婷| 色婷婷五月天激情| 伊人丁香花综合影院| 欧美成人网婷婷综合在线| 五月天婷婷午夜丁香| 97人操| 99在线资源| 91黄操| 香蕉综合在线| 欧美人与性动交CCOO| 久久婷婷午夜| 91日韩美女被插视频| 视频一二区| 日韩99视频| 激情久久久久| 西瓜美女a片| 国产高清RV综合aVa| 色爱终和网| 狠狠色综合网站久久久久| 26uuu国产| 99综合久久| 婷婷五月天成人网| 九九色黄色| 无码橾| 五月婷婷影院| 婷婷五月天论坛| 婷婷丁香五月激情| 婷婷成人视频| www.婷婷五月.com| 99碰碰| 久久婷婷五月综合色播| 婷婷开心激情五月激情网| 色噜噜狠狠一区二区三区| 婷婷五月激情视频在线| 五月天色色网站| 亚洲中文字幕在线观看| 五月婷婷亚洲色图| 五月天社区| 色情丁香五月天| 丁香五月婷婷动漫视频| 五月天色五月| 专区无日本视频高清8| 久久受www免费人成| 国产AV不卡福利| 久久五月婷婷电影| 五月综合婷婷五月| 国产毛片精品一区二区色欲黄A片 欧美交换配乱吟粗大25P | 梁铮版《蜘蛛女侠》在线| 六月丁香好婷婷| 99啪啪网| 亚州成人综合在线| 久久视屏这里只有久久| 成年人最刺激的综合网| 人妻少妇色综合| 碰碰碰碰碰99| 99爱免费在线观看| 九九色图| 色婷婷五月成人网| 深爱五月亚洲| 久久综合激情| 九九色播五月丁香| 色天天综合| 思思精品视频| 狠狠色五月| 五月婷婷成人网首页| 99这里有精品| av免费在线观看0| 色欲av伊人久久大香线蕉影院| 五月天婷婷网站| 精品爆操| 伊人久久大香线蕉综合网站| 五月天激情日色在线| 99无码超碰| 丁香花狠狠婷婷亚洲中文字幕| 五月开心婷婷中文字幕| www.99热视频| 大香蕉久久久久久久久| 天天爽人人爽| 久热大香蕉| 婷婷色在线播放| 伦99热| 五月天啪啪| 影音先锋91男人资源在线播放| site:jszngf.com| 激情久久久久久| av免费在线观看0| 美女五月天婷婷| 另类激情五月在线视频欧美| 免费观看高清无码| 婷婷五月天成人基地| 久久久久久久人妻| 91网站黄| 色女人久久| www.夜夜爱.com| 亚洲 激情 中文| www超碰| 久久久亚洲成人无码A片| 天天搞夜夜叫| 久九色| 久久sp免费视频| 久久96热| 熟女人妻视频| 久久只这里有精品| 色五月综合激情网| 日韩色色视频www| 色综合中文| 欧美人人超级碰| 桃色激情婷婷伊人网| 99热精品在线播放| 九九综合视频在线观看| 激情九色| 最新久久网址| WWW久久久| 九九99热| 丁香五月91| 九九99视频精品| 狠狠干伊人| 免费看欧美成人A片无码| 色综合久久888| 婷婷久久99| 婷婷五月天AV在线| 玖玖综合色| 毛片新网地| 五月天婷婷综合免费| 婷婷丁香www视频日本韩国| 激情五月天色婷婷| 热久69| 五月天婷综合| 99re久久| 少妇真实被内射视频三四区| av在线色五月丁香婷区久| 天天插天天射| 九九亚洲小视频| 超级碰碰97在线| 五月天婷婷久久综合| 美女久久婷婷| 婷婷五月综合亚洲| 99A级片| 成人在线网址| 五月丁香久久网| 大香蕉久| 蜜桃五月天| 九月婷婷在线观看| 伊久久婷婷| w婷婷五月婷婷w| 人人操99| 天天爱天天做综合| www狠狠爱com| 91黄操| 狠狠搞五月天| 婷婷五月花| 99热这里只有精品50| 91女人18毛片水多国产| 91干视频| 婷婷区日本| 婷婷色五月91啪啪| 丁香五月婷婷AV在线| 123草逼网| 伊人超碰| 777丁香六月青青草婷婷综合久月| 激情文学综合婷婷五月天丁香花| 五月丁香综合激情| 亚州精品色情在线观看| 伊人丁香五月婷婷潮吹| 六月婷婷激情| 五月天激情小说婷婷基地| 91成人看| 丁香五月婷婷综合精品素人| 蜘蛛女免费观看完整版高清电影 | 亚洲欧洲国产精品| 亚洲第一成人无码A片| 五月天激情无码专区| 五月天停婷基地| 婷婷 伊人 久久| 婷婷色综合| 99ER热精品视频| 五月丁香六月在线| 婷婷欧美激情| 成人片黄网站色大片免费毛片| 亚洲色色精品| 99ri国产在线| 美女久久天堂| 99爱视频在线观看这里只有精品| 免费五月婷婷网| 99热丁香五月| 九九9久九9国产视频| 视频色色色色色色| 婷婷五六月丁香| 五月色亭丁香| 色情综合网| 思思热精品在线视频| 丁香五月成人| 色综合久久综合| 色婷婷狠狠18禁| 亚洲色域网| 五月婷婷丁香综合,亚洲天堂| 天天插综合网| 婷婷五月天网| www.热99热| 伊人色综合影院视频| AAA级久久久精品| 超碰日日操| 99热这里有精品24| 五月色情婷婷| 久久ri精品视频| 日本天天操| 天天日天天草| 精品久久久久久久人妻| 热99精品视频| 超碰A V在线| 亚洲欧美成人在线| 中文字幕在线资源| 天天综合色| www,婷婷五月天777me,com| 色玖玖综合网| 庭庭久久内射| 99色看| 91蜜桃婷婷狠狠久久综合9色| 在线播放成人| 日本在线播放97| 六月丁香网| 九九免费在线视频| 99热在这里只有免费精品| 91人操| 96精品国产综合久久久久久| 97色射| 99色热| 9l视频自拍九色9l视频自拍九色9l社区 | 日日爽天天| 欧美日韩AAAAA| 亚洲蜜乳AV| 中字幕视频在线永久在线观看免费| 成人 视频免费观看网站| 香蕉AV777XXX色综合一区| 久久最新色| 五月婷婷综合在线视频小说| 五月丁香好婷婷A片网| 久久最新色色色| 色综合丁香婷婷| 爱狠射| www.97视频| www.五月丁香| 丁香六月AV| 激情五月天视频| 99热亚洲精品| 国产97在线日韩亚洲女人被黑人巨大| 99久在线精品99re8热| 色激情五月天| 天天日天天操心| 99热这里只有精品18| 伦99热| 五月婷庭丁香在线| Av九九| 国产白丝在线一区| 99re在线精品视频| 日本片日本片祼观看网站在线看中文版网页在线看 | 桃色激情网| www.com操| 天天日狠狠| WWW.夜夜操.com| 婷婷丁香五月91| 色婷婷文字幕| 色色色婷| 色色婷婷丁香| 色色综合院| 久久一级免费黄色片| 强奸幻女毛片| www.97干视频| 亚洲区视频| 亚洲激情综合网| 99久久99九九九99九他书对| 91中文在线| 99ri国产在线| 丁香婷婷啪啪| 九九色婷婷| 伊人丁香五月婷婷潮吹| 啪啪黄页网| 91九色在线视频| 成人一级片| 国产成人网站在线观看| 五月丁香色婷婷婷基地| 六月婷婷国产| 五月亭亭开心网| 91青娱乐青青草| A片一曲| 九九这里有精品| 狠狠操狠狠插| 淫视馆av三区| 欧美超级视频97| 亚洲成人高清在线| 五月丁香六月婷婷,婷| 婷婷五月免费观看| 五月丁香在线看| 熟女激情五月天 | 色婷大香蕉| 丁香婷婷超碰 | 91主播在线| 日本久草福利| 五月色婷婷中文字幕| 色婷婷手机在线| 婷婷丁香九月| 色婷婷成人在线| 99re热视频这里只精品5| 激情小说五月欧美亚洲丁香| 播五月丁香六月| 欧美丁香五月| 人人爱操| 99精品偷拍视频| 99热播放| 丁香丝袜五月| 六月丁香五月天| 六月99天天婷婷激情综合| 国产成人网址| 热九九九九| 亚洲小视频免费播放| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 99热只有| 桃色成人网| 丁香五月最新网址| 九九精品这里只有| 婷婷射丁香| 97干在线| 91在线看片| 十区AV| 视色网在线播放| 婷婷五月情| 婷婷综合五月| 亚洲欧美日韩另类| 99 色色吧| wwwxxx五月婷婷小说| 五月丁香六月婷婷网站| 色婷婷99| 五月天堂色色| WwW天天干| 久久综合婷婷五月| 色五月丁香五| 五月天激情播播网| 看久久性爱视频| 色欲一区二区三区精品A片| 日本熟女啪啪| 99热在线里有精品| 九九色综合网| 久久月天堂| 婷婷五月天综合网| 婷婷亚洲欧美丁香五月| 欧美色综合天天久久综合精品| 91精产一区三区免费观看| ,99视频久久| 99啪啪网| 婷婷五月开心六月AV| 五月天色狠狠| 思思热久久艹| 亚州激情九月| 五月天婷婷深深爱| 久久综合九九| 91九色在线| 丁香五月婷婷在线视频| 日日干日日| 91制片厂久久久国产电影| 视频久久9| 思思热久久久久思思热| 97综合在线| 欧美三级黄色片久久| 六月婷婷天天操夜夜爽视频| 亚洲激情网| 啪啪日热| 婷婷五月激情综合| 色婷久九| 玖玖色资源| 五月开心深深爱激情综合| 天天日日夜夜| 人人干人人干骚美女| 99在线精品视频免费观看20| 国产毛片欧美毛片久久久| 丁香六月婷婷久久高清| 狠狠色大香蕉| 无语停婷丁香网| 99色色最新视频| 国产日韩欧美性爱| 精品久久99| 影视av久久久噜噜噜噜噜三级| 色射7856五月天激情四射| 婷婷六月丁香开心深深爱| 丁香五月欧美午夜视频| 久热精品在看| 噜噜狠狠色综无码久久合欧美| 99cao婷婷| 色狠狠六月| 亚洲天堂久久| 五月天免费色| 亚洲这里只有精品| 狠色综合网| 久久亚洲无码| 精品九九久久| 婷婷五月天激情文学| 精品9久| www.色五月天.com| 亚洲AV日韩在线观看| 六月婷婷影院| 日本三级99人妇网站| 五月丁香久久呀| 男人操女人高潮91视频| 日日夜夜天天爽| 99在线视频网址在线观看| 大伊久久| 91久久九| 蜜桃五月天| 色色综合五月| 欧美成人日韩| 九九久久五月天| 久热大香蕉| 亚洲色五月| 狠狠五月天| 人人操Av| 日本久久九| 人妻久久久久久久久久久| 国产在线视频1234| 9久热在线视频精品| 免费看欧美成人A片无码| 第四色婷婷最爱| 天天干在线播放| 婷婷五月天电影区小说区| CAoub青青超碰| 久久这里只有精品视频1| 激情综合网五月激情| 丁香五月婷婷啪| 色五月综合| 五月天激情小说| 婷婷五月天社区| 99热这里有精品2| 热婷婷av| 久99热| 99这里有精品免费| 国产av网| 丁香婷婷九月| 狠狠88综合久久久久噜噜噜| 少妇2做爰HD韩国电影| 久久这里只有国产精品视频| 激情AV中文| 色色色色五月天| 色噜噜,噜噜色| 九九99九九精品视频| 婷婷刺激综合| jiujiu热在线视频| 99re资源在线视频导航| 人人操97| 操逼123网| 99伊人婷婷在线| 狠狠干婷婷| 色 五月俺去也| 色婷婷操逼网| 色吧综合网| 亚艹艹| 婷婷五月丁香亚洲| 亚洲在线操| 五月色欧洲| 亚洲AV无码成人电影| 综合网啪啪| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 色九九九九| 丁香六月啪| 五月丁香六月合| www.婷婷,com| 九九亚洲天堂| 久久在这里99| 五月天婷婷成人资源站| 99热最新精品| 99国产精品久久久久久久久久久| 九九热在线精品视频| 99热在线爱| 日韩人妻AV在线| 国产精品视频免费看| 九九久久99| 亚洲第二AV| 五月丁香亭亭| 丁香五月先锋| 丁香五月激情图片| 天天舔天天插天天爱| 欧美va视频| 欧美爆乳一区二区三区| 色热久资源| 婷婷伊人网| 天天日天天摸天天| 99精品热视频| 五月天开心色色网| 激情五月综合| 久久久久久久久99精品| 色频玖玖五月天| 丁香色五月AV在线| 色婷婷伊人激情在线观看| 婷婷精品| 99热免| 婷婷伊人綜合中文字幕| 成人一区在线观看| 五月激情丁香啪啪| 久久丁香五月天| 成人丁香色| 成人超碰Av| 很很操很很操| 久久久五月婷婷| 人人操9| 99热这里是精品| 亚洲国产成人在线| 天天操天天干天天日| 精品少妇蜜臀91| 天天做天天爱天天日| 婷婷色在线视频| 无码91中文字幕| 狠狠操天天干| 五月综合无码| 看国产探花操逼三级片| 五月噜噜| 久久av电影| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 久久免费干| 亚洲愉拍99热成人精品| 九九热在线视频| 人妻久久久久久久 | 久热人妻| 丁香五月婷婷av| 婷婷五月天堂| 99精品大片| 五月丁香另类网| 丁香五月1页| 久久9精品| 五月婷婷丁香大陆免费| 婷婷五月丁香激情图片| 丁香五月婷婷总啪啪| 五月天久久婷| 狠狠精品干练久久久无码中文字幕| 综合网亚洲| 香蕉操亚洲| 九九精品热播| 婷婷五月激情的图片| www.日日夜夜.com| 六月丁香婷婷色综合| 久热9| 婷婷99狠狠躁天天躁| 91狠狠色| 婷婷成人网五月天| 99色这里| 开心婷婷五月天电影院| 天天插天天日天天爽| 亚洲综合色丁香婷婷六月| 婷婷久久六月天| 激情丁香网| 激情网五夜婷婷| 婷婷六月综合在线| 久久99激情| 夜夜爽日日躁| www夜夜操wwwcon| 婷婷五月丁香伊人| 五月婷婷婷丁香播| 九九九九毛片| 色五月首页| 亚洲最大成人综合网720P| 91久久99久久91熟女精品| www.99热| 亚洲五月六月婷婷| 91N 一起草| 人妻视频在线| 99小视频在线| 高清无码一区二区三区四区| 久久这里有精品视频在线免费观看| www夜夜操comwww| 婷婷九月丁香| 九九青青草成人| 成人在线视频一区| 五月婷婷香| 婷婷五月天网| 亚州在线中文字幕| 一本九九色| 99ri国产在线| 色婷婷在线综合色播网| 色五月丁香伊人| 思思久久99热只有频精品66| 色爱综合网| www.五月天婷婷| 亚洲情综合五月天| 成人VAV视频在线观看| 啪精品| 99re热精品在线视频| 2025天天爽天天摸| 伊人在线视频| 99九九精品| 99精品国产乱码久久久人妻| 狠狠干.com| 91视频免费后入强操| 色婷婷影视| 干婷婷五月天| 五月天开心婷婷激情网站| 久久久18| 狠狠干最新地址| 男女免费视频999| 天天操夜夜夜夜爽| 五月丁香六月综合激情无码软件亮点 | 婷婷色在线视频| 色五月丁香总合网| 五月丁香六月激情欧美综合| 97在线视频观看| 色呦呦在线| 97久久人人| 思思热在线视频99| 成人视屏在线观看| 99久久国产综合精品五月天喷水\| 97色欧美| 婷婷激情五月综合丁| 激情性爱五月天| 草草色情综合网| 国产无人区大片| 亚洲第精品| 97精品欧美91久久久久久久| 夜色五月天| 另类激情五| 久久精品小视频| 久久人人九九| 色色六月| 五月天婷a在线| 99视频只有精品| 久久er99热精品一区二区 | 激情丁香九九五月综合网| 亚洲愉拍99热成人精品| 超碰人人艹| 五月情色天| 亚洲激情久久| 亚洲视频操| www夜夜操comwww| WWW.99热| 色原狠狠综合| 丁香五月丁香伊人| 久久综合99| 亚州激情九月| 五月综合视频在线| 婷婷色操| 丁香花狠狠婷婷亚洲中文字幕| 久久机热这里只有精品免费视频| 色播五月天激情| 狠狠婷婷色| 久久精品爱爱| 丁香涩涩爱| AA片在线观看视频在线播放| 九九色中文| 丁香五月av| 色噜噜狠狠狠狠色综合久欧美| 91狠狠色| 婷婷综合成人| 久久免费干| 九九九成人在线视频| 99热这里只有精品3| 97婷婷狠狠久久综合9色| 午夜电影网VA内射| 欧美性生交XXXXX无码小说| 欧美熟女99| 超碰猛烈的性猛交| 亚州色综合| 婷婷五月伦理网站| 激情视频网址| 天天激情5月天亚洲| 天堂久久婷婷| 激情综合色婷婷啪啪六月天| se色99| 亚洲热视频| 狠狠色噜噜狠狠狠狠综合| 婷婷亚洲五月| 天天操天天国产三级片处女学生妹| 夜夜撸天天日| 九月婷婷在线视频| 丁香五月 综合| 天天操人人干| 香蕉网久久| 久久久无码精品成人A片小说| 五月婷婷9| 久久99美女精彩视频| 婷婷D区| 久久996re热这里只有精品无码| 97操操| WWW.夜夜操.com| 六月婷婷激情| 色黑鬼导航| 99色视频| 久久这里只有精品无码| 亚洲狠狠爱婷婷| 五月 婷婷 成人| 狠狠色综合无线观看| 婷婷五月花丁香| 操日本色| AV五月丁香| 最新色色五月天| 激情网五月| 九九热在线99| 婷丁香五月天| Caop在线| 亚洲色A| 五月天综合色| 另类激情首页| 日韩99视频| 久久久WWW| 天天色月| 欧美交换配乱吟粗大25P| 婷婷综合五月激情| 亚洲欧洲另类图片| 五月婷色激情五月| 美国不卡视频| 99ri在线观看视频| 五月六月丁香激情视频| 超碰婷婷色| 久久色五月天激情小说| 亚洲五月激情| 亚洲人妻AV| 婷婷丁香五月精品| 91制片厂久久久国产电影| 丁香五月久久综合| 色综合9| 丁香五月综合激情性爱| 97超碰综合| 拍真实国产伦偷精品| 玖玖福利视频资源| 2022人人操人人看| 玖玖色综合| va中文资源在线观看| 99精品国产乱码久久久人妻| 丁香五月婷婷在线观看| 久久总和99| 日日干日日| 久久色这里只有精品| 影视av久久久噜噜噜噜噜三级| 久久久久这里只有精品| 久久婷婷丁香六月天| 在线99精品| 婷婷综合亚洲| 色色色99韩| 97日日碰碰| 91精品久久久久| 精品无码人妻一区| 激情淫乱男女| 精品人妻一区二区| 中文不卡一二区| www久久艹| av中文在线| 丁婷婷五月天在线播放| 婷色五月| 婷婷丁香五月综合久久| 色婷丁香| 五月天成人在线| 99热很操老逼| 激情影院丁香五月| 久久久久思思热| 婷婷激情人妻| 天天干天天色综合| 丁香五月婷婷俺也要去| 日本99久久| 色综合久久久无码中文字幕999| 99热精品在线观看| 天天日日天天| 碰97久久| 婷婷五月天97干| 丁香色婷婷| 激情com| 92久久精品一区二区| 亚洲VA口| 九九热视频免费观看| 免费国产视频| 五月丁香综合精品欧美| 欧美内射AA| 午夜丁香五月天综合| 亚洲综人色综网| 久久六月综合| 99这里只有精品| 99热天堂| 色操b| 99色6爱9热| 黄色91在线观看| 男女啪啪做爰高潮无遮挡| 激情99| 99九九视屏| 五月天色色激情综合| 99啪视频在线观看| 少妇性BBB搡BBB爽爽爽电影| 中文字幕,综合,91| 好好干av| 五月综合亚洲色| 丁香五月激情啪啪啪| CHINESE熟女老女人HD视频| 99久在线精品99re8| 九九热只有这里是精品| 九热免费视频| 亚洲殴洲精品Av在线| 无码人妻少妇色欲AV一区二区| 婷婷激情九月| 99无码黄色视频| 五月婷色丁香| a色色片| 久热91精品| 亚洲成人AV电影网| 亚洲激情av| 九九热视频99| 五月丁香激情综合啪啪| 自拍盗摄 另类| 五月婷六月丁香| 狠狠88综合久久久久噜噜噜| 色色五月天婷婷| 超碰a女人的天堂| 碰碰碰97免费精彩视频| 99综合色色色| 婷婷无五月无码视频| 五月天婷婷色色| 丁香五月婷婷基地| 天堂A∨在线| 丁香五月婷婷六月丁香| 五月天婷婷中文字幕在线播放| 五月天欧美 另类小说| 97色色色色| 激情九月综合| 亚洲免费观看高清完整版AV线| 天天色五月婷婷91久久久久久久| 激情玖玖sh| 欧美成人精品A片免费一区99| 99热国产这里只有精品| 婷婷另类小说| 天天插天天插天天插天天插| 丁香五月婷综合网| 激情五月丁香综合网站 | 日韩性视频| 五月天激情网开心网| 色色色色色色综合| 日韩色色小视频| 婷婷激情四射| 激情丁香六月| 成人电影在线免费试看| 在线综合91| 超碰A V在线| 日欧一片内射VA在线影院| 欧美内射AAAAAAXXXXX| 97精品综合久久| 九九操操| 日韩AV片| 超碰成人免费| 五月丁香成人网| 婷婷香蕉| 人人干人人看| 超碰国产在线| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 26UUU精品一区二区Com| 涩五月丁香| 五月色精品| 婷婷五月天在线综合| 欧美日本va| 99热这里都是精品| www.色色五月天.com| 激情四射五月天| 欧美日韩成人在线| 五月天激情小说| 日日干日日| 久久久久久欧美精品se一二三四| 被强行糟蹋的女人A片| 人妻第九页| 五月天另类小说久久小说网| 久草视频大香蕉99| 操人精品| 久久久久亚洲AV成人无码电影| 伦99热| 婷婷啪啪| 欧美槡BBBB槡BBB少妇| 草草女人亚洲| 日本丰满久久| 日韩另类在线观看| 激情综合婷婷| 天天五月香欧美| 久久久久99精品成人片| 这里只有精品视频99| 亚洲色图五月丁香| 五月婷激情| 黄急一级视频| 黄色录像网点| 色九九一二| 大香蕉伊人99| 婷婷免费精品视频| 99自拍视频| 色五月天综合| 天天做夜夜爽| 婷婷在线精品| 国产亚洲成AV人片在线观黄桃| 九九色插| 激情綜合網址| 激情丁香久久| 亚洲小视频| 综合久久高清| 精品一区二区三区免费毛片爱 | 99视频在线观看网址| 亚洲综合婷婷| 久久在线视频免费观看| 9色在线视频精品观看| 婷婷五月丁香六月| www.思思99热| 涩五月婷婷| 深爱激情五月天| 五月婷婷综合色啪首页| 久热黄色| 色激情综合狠狠婷婷| 五月丁香做爱视频| 色色色色色色色色综合网| 激情AV网| 亚洲免费av在线| 色色综合日韩| 九九99久久| 婷婷五月天基地| 伊人丁香五月天丁香在线婷| 婷婷五月丁香超碰| 五月视频日本免费观看| 四色99久久| 高清无码视频网址| 91国产精品视频播放| 亚洲综合网 665566| 夜夜骑福利资源| 另类图片天天影视在线观看| 久cao香蕉影院| 久久综合干| 狠狠狠夜夜夜| 丁香五月天视频| 久草九九| 五月丁香六月婷婷玖玖| 一区二区乱码视频| 五月天激情色色| 五月天久久婷婷| 久热这里只有精品在线| 五月激情小说网| 91 影音先锋| 日本超碰在线| 婷婷五月天香蕉| 亚洲天堂99| 丁乡久久| 99精品22| 69精品人人人人| 伊人婷婷大香蕉| 五月天俺去也| 五月丁香六月激情综合| 秋霞日本免费毛片A片| 婷婷六月中文字幕| 人妻久久久| 热99.com婷婷| 日本色婷婷五月天成人电影| 婷婷五月天日逼| 丁香六月色婷婷| 色月丁| 另类的婷婷| 69久久99精品久久久久婷婷| 亚洲欧洲美女在线观| 色五月开心婷婷| 久久婷婷婷| 玖色色综合| 激情www.98com| 亚洲色综合| 99久久婷婷| 亚洲人妻电影| 999精品久久久久久久| av大香蕉| 久99视频在线观看| 色婷婷激情四射视频| 丁香九月婷婷色| 99热热热99精品婷婷| 天天综合久久| 丁香蜜臀黄色婷婷五月天| 天天干人人奸97| 密黄站| 99久久99九九99九九九| 免费啪啪啪网站| www一区二区三区| 极品人妻VIDEOSSS人妻| 五婷婷六月合| 色婷婷五月天在线观看| 久久狼人天堂| 色婷婷五月天成人网| 狠狠色狠狠色综合日日91| 六月丁香婷婷六月激情综合| 中文字幕婷婷9月天| 大波美女VA网站| 91精品91久久久中77777| 91久久婷婷| 天天色色天天| 91超碰人人操| 99九九99九九九视频精彩| 五月天狠狠色| 99爱精品| 国产色99| 亚洲色五月| 丁香五月综合久久综合| 婷婷五月天激情免费在线观看| 久久婷婷原创视频| 久热2025无码| 99精品在线| 婷婷五月蜜桃成人桃色丁香| 夜夜躁爽日日| 色色五月婷婷久久| 婷婷五月天激情在线| 91男人资源站| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 婷婷99丁香| 日本色视| 久久婷婷网址| 亚洲天天| 色色色色色五月| 狠狠干综合| 91在线日| 婷婷基地爱| 欧亚色色| 少妇性按摩无码中文A片 | 五月丁香综合久久夜夜| 五月六月婷| 99九九在线视频| 91偷拍视频| 久久婷婷六月| 综合激情五月天| 丁香久久五月天视频在线观看 | 五月丁香欧美综合| 日本三级中国三级99| 久 久9 9 热 视 频| 国产黄色大片| 99热精品在线| 超碰93在线观看| 乱码操操| 久一这里有精品国产| 五月婷婷色播| 丁香五月综合在线播放 | 影音先锋五月天婷婷丁香在线观看| 日日狠狠久久偷偷四色综合免费| 1024欧美日韩精品久久久| 婷婷丁香六月天| 久久婷婷五月综合精品蜜芽| 九九九九毛片| 丁香五月天激情婷婷丁香六月| 超碰在线国产| 好好日激情五月天| 色婷婷啪啪综合网| 99亚洲精品| 婷婷激情伍月网| 青草视频在线播放| 79色色色色| av在线中文| 色色色综合| 热99精品视频| 五月丁香六月色| 色色丁香婷婷综合| 五月天婷婷一起草| 中文字幕丰满乱孑伦无码专区| 六月婷婷中文字幕| 日本啪啪天堂| 日本熟妇乱妇熟色A片蜜桃| 欧美3AaAa大片| 欧美日韩成人在线观看| 丁香激情网| 亚洲另类噜噜| 婷婷人人操| 久草热久草在线视频| 99国产这里只有精品| 秋霞AV淫| 天天综合精品| 五月丁香六月婷婷国产视频| 日本 欧美在线| 99在线精品免费视频| 久久久精品人妻| 日操| 色婷婷久久9.com| 97人人草| 日日狠狠久久偷偷四色综合免费| 91人操人人人操人| 亚洲国产精品二二三三区| 丁香五月欧美午夜视频| 色五月丁香五月激情五月激情| 丁香五月久久社区| 九九这里只有精品| 婷婷五月深爱五月| 99热18| 色开心五月婷婷丁香HD| 一起草性爱不卡视频| 99re这里只有精品在线观看| 国产激情在线| 国产欧美精品AAAAAA片| 色婷婷综合网| 在线,国产,色,热视频| 婷婷色中文| 另类少妇人与禽zOZZ0性伦| 婷婷五月天色播| 五月丁香少妇A| 婷婷丁香www视频日本韩国| 99热精品在线| 久久9热| 六月丁香好婷婷| 日韩啪啪网| 人妻中文字幕网| 免费无码毛片一区二区A片| 性爱久久| 丁香五月天婷婷中文| 成片免费播放| 色在线免费观看| 人人干人人看| 丁香五月天婷婷中文字幕| 五月丁香 久久久| 思思99久久| 中文婷婷狠狠| 五月丁香综合啪啪| 一区二区免费看| 蜜桃五月天色| 色婷婷狠| 字母不卡码人逼| 亚洲激情网| 91久久久久久久久| 亚洲色情网站| 五月天天天开心激情网| 久久婷婷久久| 67久久| 爽tv | 色色色色色色色色综合网| 婷婷香五月天| 丁香五月天BBw| 亚洲丁香五月天在线视频| 日本美女上人| 丁香久月婷|