久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

FreeRTOS下DMA接管UART:解決中斷風(fēng)暴的完整實戰(zhàn)指南

FreeRTOS下DMA接管UART:解決中斷風(fēng)暴的完整實戰(zhàn)指南 簡介面向嵌入式開發(fā)者的實時操作系統(tǒng)串口收發(fā)工程資料包基于STM32F302CB平臺演示如何通過直接存儲器訪問DMA優(yōu)化通用異步收發(fā)器UART通信實現(xiàn)高效且不丟數(shù)據(jù)的循環(huán)接收覆蓋任務(wù)調(diào)度、緩沖區(qū)切換、數(shù)據(jù)解析等核心環(huán)節(jié)。工程壓縮包共包含六百五十九個文件體積約十三點八一兆字節(jié)以C源碼、頭文件、匯編文件及官方工程配置為主輔以鏈接腳本、調(diào)試配置、圖形化初始化配置等資源目錄結(jié)構(gòu)清晰便于移植與二次開發(fā)。目前已有三百九十六人學(xué)習(xí)下載。工程內(nèi)提供了完整的HAL驅(qū)動代碼、DMA中斷處理示例以及FreeRTOS任務(wù)集成框架同時附有構(gòu)建腳本、調(diào)試描述文件和豐富的外設(shè)配置實例可幫助讀者深入理解DMA循環(huán)接收的底層機(jī)制掌握中斷服務(wù)函數(shù)與實時任務(wù)協(xié)同設(shè)計的思路尤其適合需要高速連續(xù)串行通信的工業(yè)自動化和物聯(lián)網(wǎng)設(shè)備開發(fā)者。此類設(shè)計在實際項目中能顯著降低CPU占用提升通信穩(wěn)定性是進(jìn)階嵌入式開發(fā)的實用參考。1. FreeRTOS 下用 DMA 接管 UART中斷風(fēng)暴的終結(jié)與三個隱藏代價很多人第一次在 FreeRTOS 里碰串口都是被「丟字節(jié)」和「高波特率必翻車」這兩件事逼到查手冊的。用查詢方式收數(shù)據(jù)CPU 被占死任務(wù)調(diào)度成了擺設(shè)用傳統(tǒng)中斷逐字節(jié)收115200 波特率下每秒一萬多次中斷系統(tǒng)響應(yīng)被割成碎片稍一忙就進(jìn) HardFault。我最早做某跨平臺系統(tǒng)的串口通信模塊時就是被這種中斷風(fēng)暴折磨到換方案才徹底轉(zhuǎn)向 DMA。這套「FreeRTOS DMA UART」的方案核心思路是讓串口硬件直接把數(shù)據(jù)搬到內(nèi)存里收滿指定長度或總線空閑了再通知 CPU從「數(shù)據(jù)搬運(yùn)工」變成「數(shù)據(jù)驗收員」。對整個系統(tǒng)而言CPU 占用率能下降八成以上對你來說這套組合的代碼、移植模板和踩坑清單才是真正值錢的部分。注意DMA 不是萬能的緩沖區(qū)管理、斷幀判定、Cache 一致性這三個問題沒處理好移植回去一樣翻車。2. 為什么 FreeRTOS 的串口必須配 DMA先看懂「中斷風(fēng)暴」數(shù)學(xué)模型2.1 實時性斷裂的本質(zhì)一次中斷三次進(jìn)出在 FreeRTOS 里跑傳統(tǒng)串口中斷每次收一個字節(jié)中斷服務(wù)函數(shù)里要做三件事讀數(shù)據(jù)寄存器、把數(shù)據(jù)寫進(jìn)緩沖區(qū)、判斷是否要喚醒接收任務(wù)。每件事在 ARM Cortex-M 上都是十幾次時鐘周期的操作加上中斷壓棧和出棧的固定開銷一次中斷要消耗 60-100 個周期。115200 波特率意味著每 86.8 微秒來一個字節(jié)算下來一秒鐘約 1.15 萬次中斷。這還沒算 FreeRTOS 在中斷里調(diào)用 portYIELD_FROM_ISR 時進(jìn)行的上下文切換開銷——每次切換要保存和恢復(fù)十幾個寄存器。結(jié)果就是系統(tǒng)里最高優(yōu)先級接收任務(wù)的實時性看上去有保障實際上 CPU 的時間片被切得稀碎任何高于串口中斷優(yōu)先級的任務(wù)稍微跑久一點串口緩沖區(qū)就溢出。更隱蔽的問題在低優(yōu)先級任務(wù)。假設(shè)有一個周期 10ms 的采集任務(wù)被串口中斷不斷搶占它的實際完成時間可能被拉到 50ms 開外。這時候你調(diào) FreeRTOS 的任務(wù)優(yōu)先級根本沒意義因為中斷已經(jīng)把調(diào)度的顆粒度打碎了。2.2 DMA 改變了什么搬運(yùn)交給硬件通知只在邊界DMA 接管串口接收后數(shù)據(jù)流是這樣串口外設(shè)收到一個字節(jié)直接由 DMA 控制器搬到指定的內(nèi)存數(shù)組里完全繞開 CPU。只有當(dāng) DMA 搬完設(shè)定長度的數(shù)據(jù)或者外設(shè)觸發(fā)空閑中斷時CPU 才被叫醒一次。以 512 字節(jié)的 DMA 緩沖區(qū)為例同樣是 115200 波特率CPU 每秒被叫醒的次數(shù)從 1.15 萬次降到大約 20 次左右——也就是緩沖區(qū)滿了才處理一次加上空閑中斷若干次。理論上DMA 收滿一個緩沖區(qū)和 FreeRTOS 任務(wù)處理這段數(shù)據(jù)是并行的CPU 只在 DMA 搬運(yùn)結(jié)束的那一刻參與工作。這里有個關(guān)鍵選型點DMA 的傳輸模式。我一般會用 Normal 模式加手動重裝載而不是直接用 Circular 模式原因在后續(xù)章節(jié)展開但先記住一個結(jié)論——Circular 模式省心但丟幀邊界非常難判斷半傳輸中斷那套機(jī)制在 FreeRTOS 任務(wù)調(diào)度下反而容易產(chǎn)生競態(tài)。2.3 任務(wù)架構(gòu)怎么搭生產(chǎn)者-消費(fèi)者模型的正確姿勢硬件層面搞定 DMA 以后軟件層要把接收鏈路由中斷驅(qū)動改成「DMA 寫緩沖、任務(wù)讀緩沖」的生產(chǎn)者-消費(fèi)者模型。典型結(jié)構(gòu)分三段。第一段是 DMA 中斷回調(diào)函數(shù)里把本次搬運(yùn)的數(shù)據(jù)長度記下來然后通過二值信號量或 direct to task notification 喚醒接收任務(wù)中斷里不能做的解析、組幀、分發(fā)全部放到任務(wù)上下文。第二段是接收任務(wù)本體掛起在信號量上等待喚醒被喚醒后從緩沖區(qū)里按幀解析。第三段是業(yè)務(wù)任務(wù)和接收任務(wù)之間用 FreeRTOS 的 StreamBuffer 或者消息隊列解耦。/* FreeRTOS DMA UART 接收任務(wù)骨架 */ static void uart_rx_task(void *arg) { uint8_t frame_buf[128]; uint16_t frame_len 0; for (;;) { /* 等待 DMA 半滿/全滿或空閑中斷信號量 */ xSemaphoreTake(rx_sem, portMAX_DELAY); /* 從 DMA 緩沖區(qū)拷貝一幀數(shù)據(jù)到本地棧緩沖 */ frame_len dma_uart_pack_frame(uart_dma_buf, dma_buf_wr_idx, frame_buf, 128); if (frame_len 0) { /* 這里做協(xié)議解析比如幀頭校驗、CRC 校驗 */ parse_and_dispatch(frame_buf, frame_len); } } }這段代碼的邏輯核心在 dma_uart_pack_frame它負(fù)責(zé)計算 DMA 寫指針走到哪了把新到的數(shù)據(jù)按幀切出來。注意解析動作放在任務(wù)里不在中斷回調(diào)里做是為了避免在 ISR 里執(zhí)行過長邏輯導(dǎo)致新的 DMA 中斷被阻塞——這是判斷這套方案是否合格的分水嶺。信號量參數(shù)上xSemaphoreTake 的等待時間設(shè)為 portMAX_DELAY讓接收任務(wù)在數(shù)據(jù)沒來的時候徹底睡眠不占 CPU。實際項目中建議把信號量換成「任務(wù)通知Task Notification」因為通知的延遲比信號量低大約 20%-30%而且不消耗獨(dú)立的信號量對象。3. 拆分 DMA 緩沖區(qū)與幀邊界判定半傳輸中斷和空閑中斷的分工3.1 為什么單靠「傳輸完成」中斷會卡死自己如果用 DMA 的 Normal 模式搬運(yùn)完設(shè)定的字節(jié)數(shù)才觸發(fā)一次傳輸完成中斷那 CPU 必須趕在 DMA 寫完緩沖區(qū)之前把數(shù)據(jù)取走否則 DMA 繼續(xù)搬運(yùn)新數(shù)據(jù)就會覆蓋還沒處理的內(nèi)容。問題是 FreeRTOS 任務(wù)的調(diào)度延遲不可控——如果接收任務(wù)優(yōu)先級不夠高或者恰好有更高優(yōu)先級任務(wù)在跑DMA 緩沖區(qū)被覆蓋幾乎是必然的。把緩沖區(qū)做大能緩解但治標(biāo)不治本內(nèi)存開銷先吃不消。于是經(jīng)典做法是引入「半傳輸中斷」DMA 每搬滿半個緩沖區(qū)就觸發(fā)一次中斷CPU 處理前半段數(shù)據(jù)等搬滿整個緩沖區(qū)再觸發(fā)傳輸完成中斷CPU 處理后半段。這樣在一個 DMA 周期內(nèi)CPU 始終在處理「另一半」的數(shù)據(jù)緩沖區(qū)永遠(yuǎn)有安全區(qū)。3.2 環(huán)形緩沖區(qū)的寫指針和讀指針怎么跟蹤實際落地時我們不用裸數(shù)組直接當(dāng)緩沖區(qū)而是包一層環(huán)形緩沖區(qū)。環(huán)形緩沖區(qū)的好處是讀寫解耦DMA 只管寫任務(wù)只管讀互不干擾。麻煩的是要維護(hù)兩個指針寫指針由 DMA 硬件在搬運(yùn)時更新讀指針由任務(wù)在消費(fèi)數(shù)據(jù)時更新。/* DMA FreeRTOS 環(huán)形緩沖區(qū)結(jié)構(gòu)體 */ typedef struct { uint8_t pool[DMA_BUF_SIZE]; /* 實際存儲區(qū) */ volatile uint16_t wr_idx; /* DMA 寫到的位置 */ volatile uint16_t rd_idx; /* 任務(wù)讀到的位置 */ uint16_t dma_half_len; /* 半傳輸閾值 */ uint16_t dma_full_len; /* 整包閾值 */ } dma_ring_buf_t; /* DMA 傳輸完成中斷回調(diào) */ void uart_dma_rx_complete_cb(DMA_HandleTypeDef *hdma) { dma_ring_buf_t *rb (dma_ring_buf_t *)hdma-RxBuf; BaseType_t xHigherPriorityTaskWoken pdFALSE; /* 若是半傳輸中斷寫指針移動到 half_len */ if (hdma-Instance-ISR DMA_ISR_HTIF) { rb-wr_idx rb-dma_half_len; } /* 若是全傳輸中斷寫指針回到尾部或者循環(huán) */ else if (hdma-Instance-ISR DMA_ISR_TCIF) { rb-wr_idx rb-dma_full_len; } /* 通知接收任務(wù)處理 */ vTaskNotifyGiveFromISR(rx_task_handle, xHigherPriorityTaskWoken); portYIELD_FROM_ISR(xHigherPriorityTaskWoken); }這段代碼里最核心的是 wr_idx 的賦值邏輯半傳輸中斷到達(dá)時DMA 寫完了前半段wr_idx 指向半閾值全傳輸中斷到達(dá)時DMA 寫完整個緩沖區(qū)wr_idx 指向滿閾值。任務(wù)側(cè)每次拿到新的 wr_idx就對比自己上次處理到的 rd_idx把兩者之間的數(shù)據(jù)全部取走。有一個容易被忽略的參數(shù)DMA 源地址和外設(shè)地址的方向配置。串口 DMA 接收時外設(shè)地址是 UART 數(shù)據(jù)寄存器內(nèi)存地址是 pool 數(shù)組方向是外設(shè)到內(nèi)存這些必須在初始化時設(shè)置正確否則數(shù)據(jù)根本不會進(jìn)到 pool 里。排查時第一件事就是打印外設(shè)地址和內(nèi)存地址八成問題出在這。3.3 空閑中斷負(fù)責(zé)「斷幀」別讓粘包毀了協(xié)議DMA 半滿和全滿中斷解決的是「大流量持續(xù)灌入」的場景但實際串口數(shù)據(jù)幾乎都是不定長的。一幀數(shù)據(jù)可能 10 個字節(jié)也可能 200 個字節(jié)。如果只靠 DMA 長度閾值CPU 必須在收到一幀后等緩沖區(qū)填滿才知道有數(shù)據(jù)延遲無法接受——尤其像 Modbus 這種短幀協(xié)議一幀 8 個字節(jié)512 字節(jié)的緩沖區(qū)要 64 幀才填滿實時性全沒了。解決辦法是啟用 UART 的空閑中斷??偩€空閑超過一個字節(jié)時間說明一幀發(fā)完了立刻觸發(fā)空閑中斷。中斷里我們不做數(shù)據(jù)拷貝只是更新寫指針并通知任務(wù)。/* UART 空閑中斷處理表示一幀結(jié)束 */ void UART_IRQHandler(void) { BaseType_t xHigherPriorityTaskWoken pdFALSE; if (__HAL_UART_GET_FLAG(huart1, UART_FLAG_IDLE)) { __HAL_UART_CLEAR_IDLE_FLAG(huart1); /* DMA 還在搬運(yùn)的話先關(guān)閉 DMA 通道獲取實際寫指針 */ size_t dma_remaining __HAL_DMA_GET_COUNTER(hdma_usart1_rx); rb.wr_idx rb.dma_full_len - dma_remaining; /* 用任務(wù)通知喚醒接收任務(wù) */ vTaskNotifyGiveFromISR(rx_task_handle, xHigherPriorityTaskWoken); } portYIELD_FROM_ISR(xHigherPriorityTaskWoken); }空閑中斷和 DMA 配合的細(xì)節(jié)在于DMA 計數(shù)器CNDTR時刻在變表示還剩多少字節(jié)要搬。用「DMA 總長度減去剩余計數(shù)」得到當(dāng)前已寫入的位置這樣即使 DMA 還沒到半滿或全滿閾值我們也能精確知道數(shù)據(jù)停在哪。有個參數(shù)值得專門說——空閑中斷的判定時間由串口的波特率決定16 倍過采樣下大約是一個字節(jié)的傳輸時間。波特率越高空閑判定越快所以 CPU 的響應(yīng)要跟上建議空閑中斷不要分配太低的優(yōu)先級。4. 從零配置 FreeRTOS DMA UART 工程初始化順序與參數(shù)對照4.1 初始化順序GPIO、DMA、UART、RTOS 的先后關(guān)系初次上手最容易踩的就是初始化順序。我見過有人先初始化 UART 再初始化 DMA結(jié)果串口一收到數(shù)據(jù)DMA 還沒就位數(shù)據(jù)直接丟在硬件 FIFO 里。正確順序是先配置 GPIO 的復(fù)用功能確保引腳輸出到串口的 TX/RX 通道再配置 DMA 控制器的數(shù)據(jù)流把它綁定到 UART 的接收請求然后初始化 UART 外設(shè)本身使能 DMA 接收請求和空閑中斷最后才創(chuàng)建 FreeRTOS 的信號量和任務(wù)。順序反了輕則收不到數(shù)據(jù)重則 DMA 配置失敗直接 HardFault。/* FreeRTOS DMA UART 初始化順序示例 */ void uart_dma_init(void) { /* 第一步GPIO 復(fù)用配置 */ __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Mode GPIO_MODE_AF_PP; GPIO_InitStruct.Alternate GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); /* 第二步DMA 流配置必須設(shè)成循環(huán)模式配合環(huán)形緩沖 */ __HAL_RCC_DMA1_CLK_ENABLE(); hdma_rx.Instance DMA1_Stream3; hdma_rx.Init.Direction DMA_PERIPH_TO_MEMORY; hdma_rx.Init.PeriphInc DMA_PINC_DISABLE; hdma_rx.Init.MemInc DMA_MINC_ENABLE; hdma_rx.Init.PeriphDataAlignment DMA_PDATAALIGN_BYTE; hdma_rx.Init.MemDataAlignment DMA_MDATAALIGN_BYTE; hdma_rx.Init.Mode DMA_CIRCULAR; /* 循環(huán)模式保證連續(xù)接收 */ hdma_rx.Init.Priority DMA_PRIORITY_HIGH; HAL_DMA_Init(hdma_rx); /* 第三步UART 使能 DMA 接收 */ huart1.Instance USART1; huart1.Init.BaudRate 115200; huart1.Init.WordLength UART_WORDLENGTH_8B; huart1.Init.StopBits UART_STOPBITS_1; huart1.Init.Parity UART_PARITY_NONE; huart1.Init.Mode UART_MODE_TX_RX; HAL_UART_Init(huart1); /* 第四步關(guān)聯(lián) DMA 并啟動接收 */ __HAL_LINKDMA(huart1, hdmarx, hdma_rx); HAL_UART_Receive_DMA(huart1, rb.pool, DMA_BUF_SIZE); /* 第五步創(chuàng)建信號量和接收任務(wù)FreeRTOS 啟動后 */ rx_sem xSemaphoreCreateBinary(); xTaskCreate(uart_rx_task, uart_rx, 256, NULL, 5, rx_task_handle); }初始化參數(shù)里DMA_CIRCULAR 循環(huán)模式是這里最大的決策點。前面說 Normal 模式手動重裝載適合某些場景但環(huán)形緩沖區(qū)的場景下 Circular 是首選——它讓 DMA 在搬滿整個緩沖區(qū)后自動回卷到起點繼續(xù)搬運(yùn)不用 CPU 干預(yù)配合半滿/全滿中斷正好實現(xiàn)「雙緩沖」效果。另一個參數(shù)是 MemDataAlignment。如果緩沖區(qū)聲明為 uint8_t 數(shù)組就用 BYTE如果改成 uint16_t 數(shù)組加速傳輸就要同步改這一項否則 DMA 搬完數(shù)據(jù)在內(nèi)存里是錯位的解析時全是亂碼。4.2 關(guān)鍵宏定義和緩沖區(qū)大小怎么定緩沖區(qū)大小不是拍腦袋定的它取決于你的協(xié)議幀最大長度、波特率、任務(wù)處理速度三者之間的平衡。經(jīng)驗值是緩沖區(qū)至少是最大協(xié)議幀的兩倍同時保證在最高波特率下任務(wù)取出數(shù)據(jù)的速度大于 DMA 灌入的速度。/* 工程配置示例典型的參數(shù)宏定義 */ #define UART_DMA_BUF_SIZE 512 /* 環(huán)形緩沖區(qū)總大小 */ #define UART_RX_FRAME_MAX 128 /* 協(xié)議單幀最大長度 */ #define UART_BAUDRATE 115200 /* 波特率 */ #define UART_RX_TASK_STACK 512 /* 接收任務(wù)棧大小(字) */ #define UART_RX_TASK_PRIO 5 /* 優(yōu)先級高于業(yè)務(wù)任務(wù) */參數(shù)說明512 字節(jié)的緩沖區(qū)在 115200 波特率下DMA 灌滿需要約 44ms只要接收任務(wù)在 44ms 內(nèi)處理完 256 字節(jié)系統(tǒng)就穩(wěn)。任務(wù)棧 512 個字2048 字節(jié)給協(xié)議解析預(yù)留了足夠空間如果解析里有大數(shù)組或格式化打印建議加一倍。我一般會把任務(wù)優(yōu)先級設(shè)為 5比業(yè)務(wù)任務(wù)高一級。太低的話 DMA 緩沖容易溢出太高的話會搶占關(guān)鍵業(yè)務(wù)邏輯的 CPU。這個值不是死的調(diào)試時先用高優(yōu)先級跑通再逐步降。4.3 數(shù)據(jù)解析任務(wù)里如何與協(xié)議層解耦數(shù)據(jù)進(jìn)到任務(wù)上下文后最怕的是在接收任務(wù)里同步調(diào)協(xié)議解析、寫 Flash、發(fā)網(wǎng)絡(luò)。任何一個慢操作都會阻塞下一次空閑中斷的處理造成數(shù)據(jù)堆積。正確做法是把解析和分發(fā)拆成兩個階段。接收任務(wù)只做快速判斷——檢查幀頭、幀尾、CRC然后把完整幀拷貝到 StreamBuffer 里真正的業(yè)務(wù)處理任務(wù)從 StreamBuffer 讀數(shù)據(jù)做業(yè)務(wù)邏輯。StreamBuffer 的好處是天然帶阻塞讀業(yè)務(wù)任務(wù)沒數(shù)據(jù)時自動掛起不占 CPU。/* 接收任務(wù)拷貝到 StreamBuffer 后快速返回 */ void uart_rx_task(void *arg) { uint8_t tmp[DMA_BUF_SIZE]; uint16_t len 0; for (;;) { xTaskNotifyWait(0, 0, NULL, portMAX_DELAY); while (rb.rd_idx ! rb.wr_idx) { len get_valid_frame(rb, tmp, sizeof(tmp)); if (len 0) { /* 寫入流緩沖業(yè)務(wù)任務(wù)會取走 */ xStreamBufferSend(rx_stream, tmp, len, 0); } } } }StreamBuffer 的發(fā)送超時傳 0表示緩沖區(qū)滿就立刻返回不等待。實際使用中要注意 StreamBuffer 的尺寸必須大于可能寫入的最大幀否則大幀會寫不進(jìn)去。觸發(fā)閾值設(shè) 1意思是任何數(shù)據(jù)到達(dá)都喚醒對端任務(wù)不要設(shè)成半包再喚醒那樣會額外引入一幀的延遲。5. FreeRTOS DMA UART 常見問題與排查五個必踩的坑5.1 數(shù)據(jù)錯位或亂碼DMA 搬運(yùn)方向反了現(xiàn)象串口收到數(shù)據(jù)是亂碼每個字節(jié)都不對偶爾能收到幾個正確的字符但整體不可用。原因最常見的兩個——GPIO 復(fù)用配置錯誤引腳實際連到了別的串口DMA 方向初始化成了 MEMORY_TO_PERIPH數(shù)據(jù)從內(nèi)存發(fā)到外設(shè)而不是從外設(shè)收進(jìn)內(nèi)存。第二種更隱蔽因為系統(tǒng)不報錯DMA 也正常搬只是方向反了寄存器里根本沒數(shù)據(jù)。解決第一步檢查 GPIO 復(fù)用功能編號是否正確第二步打印 DMA 控制器的 CR 寄存器里的 DIR 位確認(rèn)是 00外設(shè)到內(nèi)存。我排查時會先用輪詢方式接收一個字節(jié)做比對能收到說明 UART 本身沒問題收不到就是 DMA 配置的問題直接看 DIR 位。5.2 任務(wù)收不到數(shù)據(jù)信號量與 DMA 中斷優(yōu)先級打架現(xiàn)象DMA 中斷被打斷數(shù)據(jù)正常搬運(yùn)了但接收任務(wù)永遠(yuǎn)不被喚醒偶爾按一下復(fù)位鍵積壓的數(shù)據(jù)全部吐出來。原因DMA 中斷的優(yōu)先級被配置成了比 FreeRTOS 內(nèi)核的 SysTick 或 PendSV 還低。Cortex-M 的中斷優(yōu)先級數(shù)值越小優(yōu)先級越高如果 DMA 中斷優(yōu)先級數(shù)值大于等于 PendSV 的閾值FreeRTOS 上下文切換機(jī)制根本不會觸發(fā) ISR 里的通知操作——具體表現(xiàn)就是「中斷進(jìn)了任務(wù)不跑」。解決把 DMA 中斷優(yōu)先級調(diào)到高于 PendSV。在 CubeMX 里將 DMA 中斷優(yōu)先級設(shè)為 Highest 或 High 級別同時確認(rèn) FreeRTOS 的 configMAX_SYSCALL_INTERRUPT_PRIORITY 允許該優(yōu)先級調(diào)用 fromISR 結(jié)尾的 API。我通常設(shè) DMA 中斷優(yōu)先級為 5SysTick 為 15保證 DMA 響應(yīng)最快。5.3 DMA 緩沖區(qū)溢出任務(wù)處理慢導(dǎo)致數(shù)據(jù)被覆蓋現(xiàn)象串口長時間跑高流量數(shù)據(jù)后一幀數(shù)據(jù)中間插入了幾字節(jié)的舊數(shù)據(jù)或者幀的頭尾錯亂。原因緩沖區(qū)是循環(huán)的DMA 寫到頭自動回卷。如果任務(wù)處理速度跟不上 DMA 寫入速度wr_idx 追上 rd_idx就會把還沒消費(fèi)的數(shù)據(jù)覆蓋掉。FreeRTOS 任務(wù)調(diào)度的不確定性加劇了這個問題——任何一次高優(yōu)先級任務(wù)搶占都會讓接收任務(wù)多等幾十毫秒。解決最直接的辦法是加大緩沖區(qū)給任務(wù)更多處理時間更根本的辦法是用雙緩沖區(qū)交替使用——A 緩沖被 DMA 寫滿后自動切到 B 緩沖CPU 只處理 A反過來同理。雙緩沖把「DMA 寫入」和「CPU 讀取」的沖突概率降到最低。5.4 低功耗模式下 DMA 收不到數(shù)據(jù)外設(shè)時鐘被關(guān)了現(xiàn)象設(shè)備進(jìn)入睡眠模式后串口外部發(fā)數(shù)據(jù)無法喚醒或者喚醒后 DMA 數(shù)據(jù)全丟。原因低功耗模式下DMA 控制器的時鐘被關(guān)閉串口數(shù)據(jù)到了但沒有搬運(yùn)通道數(shù)據(jù)在 UART 的 FIFO 里直接溢出。即使 UART 能用外部中斷喚醒芯片DMA 來不及啟動數(shù)據(jù)已經(jīng)丟了。解決在每個需要串口喚醒的低功耗入口前把 DMA 重新初始化或者配置 DMA 控制器為低功耗模式的喚醒源。我一般用「睡眠模式 保留 DMA 時鐘」的折中方案睡眠能省的功耗有限但數(shù)據(jù)完整性有保障。深度睡眠模式下串口喚醒基本不可用除非外接硬件緩沖。5.5 FreeRTOS 內(nèi)存不足任務(wù)棧分配導(dǎo)致啟動失敗現(xiàn)象系統(tǒng)啟動后任務(wù)不運(yùn)行調(diào)試器看任務(wù)狀態(tài)是 Ready 但永遠(yuǎn)不被調(diào)度或者 vTaskStartScheduler 直接斷言失敗。原因FreeRTOS 的堆大小配置不足。接收任務(wù)的棧、StreamBuffer 的存儲區(qū)、其它業(yè)務(wù)任務(wù)的??偤统^了 configTOTAL_HEAP_SIZE。DMA 緩沖區(qū)沒占 FreeRTOS 堆它是靜態(tài)數(shù)組但 StreamBuffer 會動態(tài)分配。解決把接收任務(wù)棧從 512 降到 256或者把 configTOTAL_HEAP_SIZE 從 4KB 提到 16KB。我用的是 heap_4 方案碎片少一些但堆仍然要留至少 20% 的余量。建議在啟動時調(diào)用 xPortGetFreeHeapSize 打印一次堆剩余量心里有數(shù)。6. 進(jìn)階DMA 與 Cache 一致性問題——Cortex-M7 上的隱形殺手6.1 為什么 CM7 核心會出現(xiàn)「DMA 寫了數(shù)據(jù)CPU 讀到舊值」Cortex-M7 或更高端核心帶 D-Cache 時CPU 讀數(shù)據(jù)會先查 CacheCache 沒有才訪問內(nèi)存。DMA 是直接訪問內(nèi)存的外設(shè)它寫完的數(shù)據(jù)在內(nèi)存里但 CPU 的 Cache 里可能還留著舊值于是任務(wù)讀到的還是老數(shù)據(jù)——這就是 DMA 和 CPU 之間的 Cache 一致性問題。癥狀極其隱蔽數(shù)據(jù)明明是新的調(diào)試器單步看數(shù)組確實是新值但跑起來任務(wù)就是拿不到最新內(nèi)容有時候要等 Cache 被其他訪問擠掉才能讀到一次新數(shù)據(jù)表現(xiàn)出「大部分時間正常偶爾丟一幀」。解決手段有兩種一是用 MPU 把 DMA 緩沖區(qū)所在的 SRAM 區(qū)域配置成非緩存屬性讓 CPU 每次都直接訪問內(nèi)存二是在 DMA 搬運(yùn)完成中斷里調(diào)用 SCB_CleanInvalidateDCache主動刷新 Cache。/* 方案一MPU 配置 DMA 緩沖區(qū)區(qū)域為非緩存 */ void mpu_dma_buffer_config(void) { MPU_Region_InitTypeDef MPU_InitStruct; MPU_InitStruct.Enable MPU_REGION_ENABLE; MPU_InitStruct.BaseAddress (uint32_t)uart_dma_buf; MPU_InitStruct.Size MPU_REGION_SIZE_4KB; MPU_InitStruct.SubRegionDisable 0; MPU_InitStruct.TypeExtField MPU_TEX_LEVEL1; MPU_InitStruct.AccessPermission MPU_REGION_FULL_ACCESS; MPU_InitStruct.DisableExec MPU_INSTRUCTION_ACCESS_DISABLE; MPU_InitStruct.IsShareable MPU_ACCESS_NOT_SHAREABLE; MPU_InitStruct.IsCacheable MPU_ACCESS_NOT_CACHEABLE; /* 關(guān)鍵 */ MPU_InitStruct.IsBufferable MPU_ACCESS_BUFFERABLE; HAL_MPU_ConfigRegion(MPU_InitStruct); __HAL_MPU_ENABLE(); }這段配置里 IsCacheable 設(shè)為 NOT_CACHEABLE是核心中的核心。這樣 CPU 訪問這塊緩沖區(qū)時不經(jīng)過 Cache直接讀內(nèi)存DMA 寫進(jìn)去的數(shù)據(jù)立刻對任務(wù)可見。注意不是所有內(nèi)存區(qū)域都適合關(guān)閉 Cache像協(xié)議棧的收發(fā)緩沖區(qū)也建議這樣做全局變量、任務(wù)棧別碰關(guān)掉 Cache 會讓這些區(qū)域的訪問性能大打折扣。方案二適合不想動 MPU 的場景/* 方案二DMA 中斷里主動刷 Cache */ void uart_dma_rx_complete_cb(DMA_HandleTypeDef *hdma) { /* 先清掉 D-Cache 中的舊數(shù)據(jù)再讓 CPU 讀內(nèi)存 */ SCB_InvalidateDCache_by_Addr((uint32_t *)rb.pool, DMA_BUF_SIZE); /* 通知接收任務(wù)處理 */ vTaskNotifyGiveFromISR(rx_task_handle, NULL); }注意這里用的是 Invalidate失效而不是 Clean。因為 DMA 是從外設(shè)往內(nèi)存寫內(nèi)存里的數(shù)據(jù)是最新的CPU 的 Cache 是舊的所以要讓 Cache 失效迫使 CPU 重新從內(nèi)存讀。反過來如果是 CPU 往內(nèi)存寫、DMA 從內(nèi)存讀的場景比如 DMA 發(fā)送就要用 Clean 把 Cache 里的數(shù)據(jù)先寫回內(nèi)存再啟動 DMA。6.2 實測臟數(shù)據(jù)場景與判定方法我最初在某個圖像處理 Demo 里遇到這個坑癥狀是任務(wù)偶爾解析出完全不符合協(xié)議的數(shù)據(jù)但幀頭校驗明明通過了——后來發(fā)現(xiàn)是因為 Cache 里殘留了上一幀的數(shù)據(jù)幀頭字段恰好沒變校驗碼又是對舊數(shù)據(jù)算的整個鏈路的錯誤就這樣被隱藏了。判定方法很簡單在 DMA 完成中斷里主動 Invalidate 一次 Cache看問題是否消失——消失大概率就是 Cache 一致性問題。也可以用調(diào)試器對比 DMA 計數(shù)器和 buffer 里的實際數(shù)據(jù)差異DMA 明明搬了 256 字節(jié)任務(wù)讀的時候前面 64 字節(jié)還是舊值不用再猜直接上 MPU 方案。從那以后我每次在帶 Cache 的核心上移植 DMA 外設(shè)第一件事就是檢查映射緩沖區(qū)地址的 MPU 配置不把這個前提確定清楚后面任何調(diào)試都是白費(fèi)時間。這套 FreeRTOS DMA UART 的組合在邏輯上已經(jīng)足夠可靠剩下的瓶頸全在這類硬件細(xì)節(jié)上希望這些排查路徑能幫你少走幾趟彎路。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
AV 少妇 人妻 偷拍| 久久99精品国产| 激情小说亚洲| 亚洲精品不卡一二三区| 中亚精品极乱| 懂色AV蜜臀无码精品APP| 熟妇熟女一区二三区| 国产午夜精品理论片a大结局| 女人妻一区| 欧美性爱1080p| 欧美中出| 久久久久久久久9| 啊啊啊啊啊在线观看网址 | 手机看av网站在线看| 校园春色亚洲色图| 亚洲人精品午夜不卡| 一品道视频一区二区三区| 一本色道久久天天射天天干| 成人26uuu| 18一区二区三区| 成人国产二区三区在线,男女精品。| 香蕉色网| 99xav| 日本一区二区三区免费观看| 色妇综合网| 人妻免费观看| 91色射| 人妻无码久久一区二区三区免费| 久久久久密| 99性爱视频| 日韩精品1区2区中文字幕| 火箭成精品视频884必出精品| 欧洲精品一二三在线| 中文字幕丝袜美腿| 欧美少妇熟女| 日本91白丝| 日韩乱插| 自慰白浆在线观看| 1人人看人人摸人人操| 蜜臀中文字幕| 综合av社区| 大香蕉一级黄色片久久| 日韩性爱视频在线免费观看| 天天躁日日躁成人字幕aⅴ| 淫荡网址| 精品99999| 在线观看不卡一区二区三区| 日韩欧美性爱电影在线观看| 99老司机精品视频在线观看| 中国一级特黄大片护士| 日韩成人在线性爱视频| 欧美精品xxxwww| 国产精品永久免费10000| 999久久久国产精品| 96一区二区| 中文字幕人妻丝袜乱一区三区| 日韩AV噜噜噜一区二区三区四区| 日日骚一区二区三区| 亚洲成人AB| 日本大香蕉综合网红本杳社区| 人妻夜夜爽天天爽三区麻豆AV网站| 亚洲色图第四色| 午夜精品久久久久久久| 91超碰在线观看| 97天天插| 国产福利电影| av日韩在线观看电影| 国产精品探花视频| 天天操综合网| 中文字幕视频一区视频二区| 欧美性爱网97| 老鸭窝在线视频播放| 97se亚洲| 久久久久亚洲熟妇熟女| 亚洲第一黄色av网站| 333kkkk·亚洲com久久| 五月婷丁香| 久久久久久久 九九九九九九九| 十八禁网站在线| 超碰午夜| 欧美 亚洲 第一页| 91人妻最真实刺激绿帽| 岛国片在线观看视频亚洲| 婷婷五月天色| 一区二区蜜臀| 深夜国产福利| 日本不卡高清视频| 亚洲综合中文字幕有码 | 宅男91视频在线播放| 日韩国产十八禁| 福利五区| 国产无码三级视频在线观看| 日本99久久| 国产精品久久发布| 青青青草伊人精品| 欧美日韩性爱无码| 欧美第一页性| 亚洲日本大香蕉1| 欧美影院一区二区三区| 18禁免费视频| 青青草精玖玖69精品| 少妇特黄一区二区三区| 综合av社区| 91操操| 操91| 亚洲国产av中文字幕久久| 91精品啪在线观看国产城中村| 色五91| 风骚少妇视频中文字幕| 97超碰日韩| 超碰97资源大奶| 国产熟女自拍| 国产成人99久久亚洲综合| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 99操| 性生活性生大爱77AV国产| 国产精品点击进入在线影院高清| 婷婷成人五月天| 爱丝福利| 婷婷亚洲色| 日本精品一区二区三| 久久透逼视频| 10000部十八禁看电影| 亚洲精品国产拍免费91在线| 91精品国产高清久久久久久,亚洲成人| 蜜臀AV一区二区三区激情综合| 99久在线精品99re8蜜桃| 国产精品自在线发布| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 亚洲图片欧美| 色色99| 亚洲欧美综合网站| 5月婷婷6月六月丁香| 好舒服视频| 日熟女| 97免费视频网| 亚洲va有码在线天堂| 99天天超碰| 国产欧美日本亚洲精品| 最新av在线| 不卡av在线中文字幕| 91夜夜蜜桃臀1区2区3区| 嗯嗯啊啊好爽| 久久9久9久99久9久9| 日韩猛交| 91久久精品国产| A片大香蕉在线| 91视频观看网站| 九九九精品成人免费视频小说| 日本一二区免费| 九九AV| 色综合加勒比四四季| 色吧 综合| 激情欧美日韩女同久久| 欧美极度丰满熟妇hd| 2003天天干夜夜操| 人人射人人操人人摸| 蜜臀99久久精品| 日本 欧美 国产一区| 久久大香蕉97| 欧美 亚洲 大香| 久久久亚洲高清不打码| 国产精品久久久久亚洲av| 狠狠操一区二区| 国产麻豆福利av在线播放| 欧美日本天堂| 暖暖精品二区三区观看| 中国国产精品一区视频| 中文字幕人妻丝袜乱一区三区| ′ !γ}丶。。久久精品欧美一区二区三区| 中文字幕99999| 99蜜桃臀亚洲成人在线观看| 夜夜爽33333| 最新av网站在线观看| 偷拍综合亚洲| 粉嫩国产精品久久粉嫩| 99久久久无码精品国产人| 91中文字幕在线观看| 99久久久无码| 国产高清无码一区二区三区四区皇冠| 强奸乱伦免费网站| 青青草依人大香蕉| 久久一二三四不卡| 九九精品热| 亚洲国产美女久久久久| 狠狠爱夜夜| 精品亚洲俞拍视频一区| 99自拍B亚洲| 久操凹凸视频| 中文字幕AV乱伦| 91高潮| 欧美91精彩| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 日韩天天本| 欧美日韩成人| 午夜男人一级A片7777| 电家庭影院午夜69久久夜色精品国产69乱 | 亚洲综合113页| 精品黑人一区二区| 国产毛片久久久久久久| 婷婷操视频| 国产精品白丝www| 欧美最大综合网| 97干色天堂| 久久久一区二区三区四曲免费听 | 久久‘黄片视频| 成人av性爱电影在线观看| 欧美 色 亚洲| 欧美在线电影| 欧美性高潮在线| 欧洲自拍色图gif在线| 国产性刺激| 国产伦精品一区二区三区视频女| 殴美大黄片| 自拍偷拍草一草| 亚洲色宗合| 欧美成人性活片| 欧美 色 亚洲| 精品人妻少妇| 国产嫩草精品A88AV| 夜夜高潮夜夜爽| 婷婷四五区| a网站免费观看| 高清国产av无码| 黄色大香焦1级‘′‘| 中文字幕,人妻,日韩| 欧美国产精品久久九九| 亚洲国产另类在线中文| 野狼激情网| 激情综合婷婷| 综合久| 顶级丝袜熟女一区二区三区 | 九九九九九九九九九九九九九九九女| 色av中文字幕| 欧洲性人爱视频| 欧美在线|亚洲| 超碰97久| 国产一区二区二区按摩精品啪视频| 99久久99九九99九九九| 91欧美大片| 日韩啊V| 青娱乐福利99| 91人精品妻入口| 中文字幕一二区二三区人妻专区| 亚洲精品一区二区三区在线播放| 色婷婷五月综合| 日本 欧美 亚中文字幕| 亚洲丝袜天堂| 疯操AV| 97干97色| 日本一区二区不卡精品| 中文字幕精品一区二区精品| 欧美色图亚洲色图成人在在线| 区一二区日韩亚洲乱码av电影| 欧美亚洲涩涩| 男啪女色黄无遮挡免费观看| 丁香五月性爱| 伊人精品视频| 久久久久久久久一区二区三区| 日韩无码一级黄色av片| 久久一区二区三区入口| 爽爽歪在线视频| 东京热av男人的天堂| 狠狠爱夜夜干| 91香蕉国产尤物视频| 婷婷天堂站| 中文字幕日韩综合| 97av,com| 一本色道综合久久欧美| 一块操欧美性爱| 天天综合欧美综合| 女人香蕉久久毛毛片精品| 天堂v无码免费视频| 欧美日韩色综合网| 天天干天天干天天| 夜夜青青无码影院| 成 人 A V免费视频在线观看| 久久久无码av精| 国产av白丝| 亚洲精品黑丝| 亚洲成人日韩小说| 国产精品视频播放| 精品人妻一区二区三区在| 国产成人免费观看在线视频| 中文字幕乱碼在线| 九九无码| 亚洲色图久久成人| 日韩有码专区| 99久久精品国产高潮| 精品网站99999| 久久国产成人精品国产成人亚洲| 亚洲婷婷五月天| 99后入| 久久产精品一区二区三区电影| 国产成人www免费人成看片| 日韩78m视频| 97色网| 一区二区三区四区色图| 淫乱图区 | 伊人久久蜜月| 一级特黄aaa大片在线观看成人一级片在线观看 | 97干97色| http://qxhbdz.com| 欧美日本一区二区a人| 久久亚洲不卡| 九九热九九| 另类天堂| 伊人网高清| www超碰| 一二三区精品视频| 日本熟妇熟色97一本在线观看| 欧美热图99| 色综合九九| 99re欧美| 国产性刺激| 国产多人在线观看视频| 中日韩久久人妻一区二区| 亚洲 小说 欧美 激情 另类| 欧美97日韩| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 国产乱人伦AVA麻豆软件.| 91久久国产综合精品| 色婷婷六月丁香七月婷婷| 欧美一区二区情色| 久热精品在线国产| 99国内熟女露脸视频| 国产精品无码在线| 日韩成人小视频| 色综合五月天| 婷婷av在线中文字幕| 一区二区三区网站日日骚| 91精品无码久久久久久久| 色情亚洲日本成人| 九九AV| 91超碰在线| 国产丝袜美腿美女麻豆| 手机在线人成免费视频| 美女性91| 亚射在线| 一区二区 韩日AV| 日韩av无码网站| 99精品丰满人妻| 成人性爱全视频观看| 无码粉嫩白虎一线天b区| 亚洲 日韩 欧美 国产综合体| 亚洲第一男人天堂| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 日韩成人精品| 深夜视频| 亚洲资源网| www.久久| 伊人黄色视频免费观看| 日韩欧美加勒比| 91jk色拍| 欧美综合自拍成人自拍第二十页| 无码操逼网| 午夜一区| 国产久久男人天堂| 青娱乐 成人娱乐在线| 欧美大香蕉同搞| 国产深喉视频一区二区| 人妻精品一区一区三区蜜桃91| 七久久久| 国产成人网址| 97最新在线播放视频| 亚洲色阁| 久久久少妇诱惑精品视频| 2024年最新色情网站在线观看| 日本欧美色| 超碰97日韩| 久久成人午夜狠狠| 亚熟在线| 久久色激情一区二区三区| 大香蕉久久| 99久久com免费视频′| 国产第25页在线观看| 99婷婷一区二区| 久久99干一本高清| 五月开心久久AV官网| 九九玖玖精品| 91熟女熟妇视频网站| 午夜无码精品免费看性色| 日韩欧美亚欧在线视频| 少妇色| 欧美92| WWW美腿丝袜香蕉中文| 天堂精品在线| 台欧久久精品视频| 99啪| 日本三级日本三级三级人妇四虎| 好吊妞转入那个网| 丁香五月色情| 日日狠狠久久偷偷色综合免费| 99久久久久久久久| 91足交| 美国aaaaa一级黄片| 日韩性爱1级片视频| 精品国模无码| 国产精品久久aV| 五月天我淫我色av| 99久久久久久亚洲精品不卡| 国产日逼视频| 夜夜影视四色| 在线 制服丝袜中出 人妻| 91狠狠色丁香婷婷综合久久精品| 亚洲无码AV九九九| 99热这里是精品| 97久久精品亚洲| 国内精品不卡无毒99999| 国产伦精品免编号公布| 欧美 日韩 另类 亚洲| AV老汉| 91老熟女老女人国产老太| 亚洲性少妇| 成人精品视频| 欧美色91| 精品人妻免费观看| 午夜一区二区三区国产| 亚卅熟女乱色| 97WW精品| 蜜臀一二三| 国产午夜精品一区二区三区牛牛| 黑人猛交| 大香网站| 97超碰碰碰| 大香蕉十区| 韩日精品福利视频一区不卡在线免| 97超碰总站| 在线天堂资源亚洲| A片大香蕉在线| 中文字幕乱码人妻二区三区| 日本123区操B视频| 床上啊啊啊一区二区三区| 丝袜视频一区二区在线播放国产中文| 91在线丝袜| 9Ⅰ老熟女| 丁香六月激情| 不卡一区二区日本视频| 丁香六月婷婷综合| 欧美 牲| 人妻91少妇| 操www| 色色热| 91亚州欧美| 熟女少妇一区二区三区| 亚洲国产91精品一区二区久久| 777AV电影| 婷婷色一区| 亚洲欧洲无码一区夜| 亚洲高清综合网| 大香焦A片| 男人天堂2019亚洲| 亚洲图片在线| 欧美一区二区三区互相| 天美av在线观看| 日本一级不卡一二区| 亚洲国产丝袜熟女av| 日本熟妇人妻中出视频| 欧美亚洲美少妇一区二区| 欧美色图片欧美色图| 99久久久久久亚洲精品不卡| 中文字幕一区 二区三四五 区日 日骚| 草b在线| 午夜传煤十二区精品| 亚洲欧美国产成人综合不卡| 久久久111| 一区AV| 久久极品伊人| 无码日韩网站| 蜜臀久久久国产| 东京热一区二区中文字幕| 九热视频| 91精品人妻一品二品三品| 国产女人操逼视频| 亚洲视频二区| 欧美不卡二区| 精品一国2| 91成人高清在线观看| 操人妻丝袜高跟| 五十路三区在线| 五月丁香激情综合| 久草综合网| 日韩另类| 成人性生活高清视频在线播放| 一区二区三区激情在线观看| 热热色国产一二区AV| 黑人操一区二区| 超碰久久精品| 久久AV无码网址| 少好三P| 国产精品一级片在线看| 国内一区二区三区| 国产福利精品最新在线| 91少妇通奸网站| 8050无码八戒| 97日韩欧美亚洲| 你懂得91| 青青草中文字幕| 人人妻人人爽一区二区三区| 欧美激情综合色综合啪啪五月| 99热成人| 欧美超碰在线| 884t在线| 色婷婷综合久久久久中文一区二区 | 91AV天美在线视频| 日本肏逼视频在线观看| 97欧美日韩综合| 99性爱视频| 亚洲国产另类在线中文| 99re95| 亚洲国产精品无码AV久久久| 神马久久69| 睡产熟女乱伦| 亚洲精品久久久久久| 99色在线| 91人精品妻入口| 精彩久久中文| 欧美日韩丝袜 | 密乳无码| 91殴美| 欧美色图下一页| 天天色播亚洲综合网站| 殴美性天天| 欧美 牲| 九九激情网| av毛片aaaaa免费看| 无码人妻精品一区二区三区九九| 色99视频| 2020中文在线一区二区三区| 78精品| 亚洲视频一二区| 超97在线精品视频| 亚洲欧美综合| 人乳av| 极品粉嫩一区二区| www色婷婷| 日婷婷| 欧美综合1性辶| m欧洲一级午老| 人人人人人人少妇| 人妻少妇av在线观看| 乱伦一二三| 中文字幕黄色一起草| 久久久久亚洲精品| 91熟女熟妇视频网站| 国产精品女久久久久av爽| 久久久96| 久久岛国| 91美女视频直播| 亚州综合电影| 超碰国产情侣自拍网| 久久色一区二区| 色播五月婷婷| 强奸乱亚洲| 日本精品无码三级网站| 国产av激情无码久久天堂| 97av在线观看| 夜夜嗨一区二区三区直播内容| 欧美论理片| 亚洲精品天天影视综合网 | 久久精品性| 激情综合二| 中文字幕一二区二三区人妻专区| JIZZJIZZ亚洲女人被躁| 欧美精品宗合| 久久精品熟女亚洲AV麻豆软件| 欧美中日韩XXXX| 国产精品69久久久久孕妇欧美| 国产高清不卡视频| 成人色女网| 精品国产一区二区久久| 伊人五月天青青草婷婷| 国产欧美岛国精品一区| 国产色呦呦| 秋霞久久亚洲精品成人| 18禁精品网站在线看| 日韩激情毛片一级久久久| 日韩精品资源专区二区| 欧美性爱综合,免费| 成人午夜高潮av猛片| 无码不卡亚洲成?人片| 国产v亚洲v日韩v欧美v片另类| 久久久久久性爱免费视频| 中文字幕第2页| 农村女一级毛卡片| 久久国产逼| av网站在线观看了| 国产69精品久久久久99尤物| 欧美精品1区2区3区| 亚洲精品美女久久久久久久久| 久久久精品成人国产| 人人看人人爰人人操| 综合免费无码中文| 久久久免费一级黄片| 国产欧美日韩在线不卡第一页| 九月丁香婷婷| 中文字幕乱碼在线| 中文字幕在线2| 天堂亚洲精品| 一级性爱视频免费观看| 草草网站影院白丝内射| 五月天大香蕉| 亚洲欧美九九九| 日韩无码久久熟女一级片| 99最新日韩偷拍视频| 欧美一级二级三级| 亚洲黄片免费在线播放| 午夜影美女日鸡鸡天天视频国产| 丁香五月激情啪啪| 国产精品乱码久久久久久久久久久久| 加勒比av中文| 91bbbbbb| 欧美 日韩 亚洲 春色| 中字幕人妻一区二区三区| 久久精品国产亚洲AV片多多| 亚洲日产专区| 99久久9| 亚洲综合九九| 福利在线观看一区二区| 中文字幕av色| 啊啊啊啊,啊啊好多水| 久久97超碰| 在线可观看的黄色网址| 亚州成人a∨| 亚洲色棕合| 国产9 9在线 | 亚洲| 欧美性生活综合| 久久中日麻豆| 女人天堂av在线播放| 国产av美女被艹的乱叫| 春色91| 欧美精品成人在线播放| 95精品在线| 91美女视频电影| 欧美一区二区日韩三区| 色性综合| 日本高清加勒比| 一区二区乱码福利| 五月丁香激情综合网| 天天操天天日天天干| 日韩免费中文字幕视频| 天天天天操| 夜夜春夜夜操| 亚洲色图亚洲无码强奸乱伦| 欧美日韩亚洲天堂网| 热99这里有精品综合久久 | 美女人妻色网站| 91亚洲最新在线| av天堂天堂av日韩| 色哟哟-国产专区| 欧美综合第一页| 99久久9| 91男人综合| 香伊人在线| 日韩欧美成人大香蕉| 亚洲天堂资源在线| 久热免费视频| 欧美亚洲首页| 激情五月天色播| 狠久久| 婷婷五月色| 新怡红院| 九热视频| 欧美色亚洲色| 久久丁香五月婷婷| 九九热精品视频六| 性爱久久| 九九精品网| 日本狠狠干| 亚洲乱妇p22| 欧美在线官网| 清纯唯美第一页| 老司机深夜18禁污污网站| 最新亚洲风情电影| 夜夜天天噜狠狠爱2021| 少妇专区一二三四五| 美女尤物人人操| 加勒比少妇AV婷婷六月天超碰超碰| 日韩一性一交一A片俄罗斯| 四虎在线观看网站| 欧美性爱另类综合| 热99re69精品8在线播放| 人妻啊啊人妻啊| 日本孕妇一区二区视频操逼免费看 | 手机午夜电影神马久久| 性爱AV天堂| 97任你吞精| 国产熟女一区二区| 91女网站| 嫩呦国产一区二区三区AV| 91天天c| 91在线精品| 九九九九九精品视频| 久久综合日韩亚洲欧美| 熟妇的味道HD中文字幕| 无码精品啪啪啪一区二区三区三州| 激情五月天插| 久久午夜神马| 午夜天堂网| 精品毛片久久久精品毛片| julia国产在线| 日韩精品三区四区| 天天色天天干天天射| 91亚洲黄色网| 97玖玖超碰| 日韩一级片| 91香蕉国产尤物视频| 97精品在线| 狠狠躁AV| 亚洲熟女av日韩熟女| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 97欧美综合网| 久久久啊啊| 久草免费在线一区二区| 久久精品人妻一区| nuu12国产麻豆精品| 久久婷婷国产一区二区色| 黄色一区二区秘书性感| 97干在线| 久久午夜神马| 日韩欧美中文字| 无码一区二区三区四区五区六区七区八区九区十区视频 | 婷婷五月综合在线| 日韩欧美成人综合在线| 久久区| 国产精品97超碰| 久久久久久91香蕉国产| 亚洲天堂区| 99精品成人免费看| 97在线精品观看视频| 96久久久久久久| 美国三级日本三级久久99| 色爱综合网欧美| 黄污污污污| 国产在线精品偷| 黑人无码一区二区| 翔田千里一区二区三区奶水| 日韩无限资源| 黄页网站成人免费| 欧美在线|亚洲| 夜夜 中文视频rt| 亚州色站 日韩电影| 91ise欧美| 手机在线视频国内精品| 日韩综合成人免费视频| 丁香七月婷婷| 少妇久久久久| 91欧美网| 久久久一区二区三区四区五区| 999久久久久久久久| 亚洲大色鬼| ...日韩成人一区二区三区字幕| 日韩在线人妻网站| 91殴美大片| 久久国产三区| 红杏大香蕉| 亚洲人妻av| 丁香六月激情| 久久国产视频性吧 | 激情视屏国产乱伦强奸| 日韩一级成人毛片免费观看 | 91色伦综合| 色 亚洲 91| 美女爽爽爽刺痛洞洞| 欧美色老汉| 网友自拍第一页| 韩国一级婬片A片无码天美| 亚州免费啪啪视频| 九九热九九| 97亚洲性爱| 96国产污污污丝袜| 九九九不卡| 一中国女人毛片水真多| 国产精品久久久久久照片| 亚洲精品一区二区三区在线播放| 天天插天天射| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 插穴性爱视频在线观看| 91人妻Pr| 中文字幕55555| 日本高清一本二本免费不卡| 亚洲超碰97| 久久久国产亚洲精品系列| 五月天婷婷小说| 亚州人妻| 强奸乱亚洲| 九九九九九九九九九九九免费国产| 久久少妇人妻| 五月丁香激情四射| 亚洲色图亚洲无码强奸乱伦| 九九热免费国产视频婷婷伊人五月| 久久大精品乱码视频人妻熟女| 九色黄站| 久久男女激情视频网站| 日本一片一区| 一区二区视频在看| 99色热国产视频精品| 欧美拳交在线播放| 99蜜月精品久久| 久久无码一区二区二三区性色| 五月婷婷爱六月丁香色| 男人 天堂 日 亚洲| 啊啊啊爽爽| 久久久久久精品免费看A级| 蜜桃久久久久久久| 九久久精| 久久亚洲精品成人av| 四虎AV影视国产精品亚洲精品| 国产精品久久泡妞网站| 国精精品无码一二三区水多多| 夜夜狼人妻| 四虎精品一区二区| 日韩中文字幕二区| 日韩熟女视频二区| 日本欧美韩国国产在线| 丰满翘臀美女影院视频| 果冻传媒A片麻豆熟妇人妻| 国产精品一级特黄aaa大片在线观看| 91国产精品熟女| 粉嫩av一区二区三区天美传媒 | 色欲久久99精品久久| 岛国视频一二三区| 18岁禁 茉莉成人久久| 国产在线播放成人免费| 婷婷五月天激情四射| 国产精品高朝久久久久久久| 日本不卡高清视频| 秋霞午夜视频一区二区| 69XX一中文字幕人妻91| 9久久9综合| 超碰在线人人射| 97色冈| 91少妇| 啪啪91| 日本操逼无码| 91在线视频免费中出| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 亚洲国产第一页综合视频| 午夜亚洲| 五月天婷婷色色| 人妻激情视频| 五月天婷婷久久| 四方色播| 欧美AB在线观看| 黄色成人网久久久久久| 日韩av色图综合| 国产精品毛片?v一区二区三区| SS久久| 顶级丝袜熟女一区二区三区| 精品制服美女中文一区二区三区| 欧美东京热精品A∨| 玖玖综合视频| 国产玖玖| 日韩极品无码B| 色综合久久夜色精品国产天堂| 天天搞在线综合网| 国产精品大屁股999| 色婷婷综合网站| 屁股久久久久久久久久| 涩爱AV在线| 国产AV激情无码久久无码| 色婷婷一区二区三区久久午夜 | 亚洲人综合19| 青青草亚洲一区 | 人妻在线大香蕉| 日韩黄色一区二区三区| 欧洲精品二区| 天美一二三在线观看Av| 在线观看亚洲专区| 最新AV在线| 丝袜性亚洲| 中文操嬖片。| 激情一区二区| 啊啊啊不要啊啊受不了了视频在线| 成人亚欧免费视频| 啊啊啊要高潮了| 色噜噜人妻av 中文字幕| 久久人妻视频网| 日韩国产九九精品一区二区三区毛片| 婷婷丁香五月天亚洲天堂网| 999热这里只有精品| 97欧美色资源| www.99在线| 免费精品中文字幕| 中文字幕制服诱惑| 美女骚尻视频| 黄总AV色图| 麻豆久久久一区二区| 操逼www.| 97色冈| 九月丁香婷婷色| 九九色热| 超碰一区二区| 亚洲婷婷丁香在线| 亚洲欧美一区二区三区一猛片| 91 在线亚洲| 国产精品欧美激在线| 欧美牲| 丝袜美腿制服人妻二区中文字幕| 大香蕉视频一二三区| 一级性爱视频免费观看| 大象AV在线| 久久久四区| 丰满人妻-区二区三区免费看| 国产青青综合伊人| 碰人碰碰人人开房人肉| 97在线播放 | 国产 日韩 欧美 人妻 熟女 中文 69人妻精品一区二区绯色 | 亚洲最新中文字幕免费| 天海翼久久| 96AV久久久| 俺去久久| 色九九九综合| 97人妻色| 亚洲成人无码影院| 欧美韩日精品99综合| 97日视频| 精品福利视频| av资源在线播放天堂| 欧美中文字幕日韩在线| 综合97久久| 特级大荫道BBwBBwBBW| 国产精品视频一区二区三区八戒| 秋霞一集毛片观看| 9久热| 97色干| a一区二区三区乱码在线| 91丝袜激情在线 | 色偷综合| 97久久超碰日韩精品| 国产成年女黄特黄| 色官网色综合| 色五月综合| 亚洲天天影视综合网| 日韩,欧美,中文在线| 欧美制服网站美腿丝袜| 校园春色欧美| 免费精品国偷自产在线在线| 啪一啪免费视频| 久久一二区四| 91美| 青青操轻轻| 天天日天天操VV| 99re在线| 九九内射在线| 九热超碰| 99精品欧美一区二区三区桃色| 九九热视频在线观看| 日本不卡一区二区三区| 激情五月综合开心五月| 91久久国产综合久久| 99热在线只有精品| 大伊香蕉在线视频免费| 97天天弄| 国产女人高潮嗷嗷嗷叫小说| 日韩伦理久 久久 清纯| 美女诱惑久久| AV中文在线可看| 超碰欧美97| 精品99999久久久久久| 少妇高潮九九九九| 91久久国产综合久久| 亚洲欧美不卡线| 欧美图片偷拍| 亚洲国产丝袜熟女av| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | AⅤ片水多多| 激情图片亚洲色图| 国产精品熟女九色九色蜜臀| 91色综合激情| 国产精品久久久久久久黄无码| 成人一区二区三区四区| 午夜爽爽爽在线观看永久入口姬片| 9999九九九久久久| 激情专区综合| 天天综合网~91| 99www.bibizy香蕉资源国产一区二区三区高清 | 国产日产精品久久快鸭的功能介绍| 一区,二区,三区视频| 欧美十八禁网站| 最新制服中文第一页| 久久e6只有精品| 很黄很色的视频在线观看| 亚洲丰满很很操| 女色视频社区| 日韩人妻 中文字幕| 久久69| 丝袜美腿射精91| 内射白嫩美女| 精品久久久久av影院| 青青草福利视频| 狠狠躁日日躁夜夜躁A| 99国产精品人妻人伦| 国产精品久久久久久久毛片1| 9久久精品| 日韩人妻精品| 成人热久久精品| 天天做天天爱天天高潮| 国产熟女完整版中字 | 国产在线综合网| 国产97av| 国产精品69久久久久孕妇欧美| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 五月婷婷综合在线| 人妻熟女午夜精品在线| 蜜桃视频一区二区三区在线观看| 尤物视频偷拍免费| 超碰78| 日韩成人大片一区二区| 五月激情影院| 国产a级精品| 国产怡红院| 欧美五区| 天天影视射综合网| 嗯嗯嗯不要不要免费视频| 丁香五月天啪啪| 性做久久久久久免费观看软件| 丝袜人妻av一区二区| 欧美综合第一页| 99999亚洲| 大香蕉综合网| 国产乱子伦一区二区三区在线观看| 狼人狠干| 亚洲乱妇p22| 中文字幕在线观| 97国产精品一区| 91亚洲电影| 97任你吞精| 久久久久久97| 国产av热热色| 日本三级韩国三级99| 中文字幕 国产区| 日韩免费看在线黄色片| 综合熟妇一区二区三区| 亚州色国| 男人天堂.AB| 欧美成人性爱视频大全| 亚洲AV无码国产成人| 亚欧性爱在线无码| 91xingse| 天天综合网1| 亚洲欧美综合图片| 蜜臀一区二区三区在线| 黄色香蕉视频网站一区| 再深点灬舒服灬太大了好硬好爽| 99色| 精品一二三区女同| 久久精品店| 草草网站影院白丝内射| 99这里有精品| 无码人妻系列少妇| 日韩欧美亚洲自拍偷拍| 女人午夜视频777| 欧美精品 - 91爱爱| 3级毛片一二| 国产成人一级av88| 淫色网综合| 男人的天堂久久| 午夜电影在线观看无码专区| 宅男91视频在线播放| 中文不卡视频| 欧美日韩第一页| 欧美综合 站| 人人操我人人干| 女人妻一区| 久久9久| 久久久久久国产精品| 色九九久九九| 蜜乳AV色欲AVAV无码| 久久久九精品| 囯产操逼片| 国内成人圈中文字幕无码视频| 熟女乱伦A| 情侣操 逼视频99| 日本免费人成视频播放120秒| 一个人在线看的黄色电影网站| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 九九综合久久中文字幕| 丝袜性亚洲| 无码国产Av| 超碰久久网| 日韩中文欧美| 成·人免费午夜在线观看| 精品国产乱码久久久久久久久1| 亚洲欧美另类图片| 91天天日| 蜜乳AV一区| 91模特在线观看| 亚洲午夜免费狠狠干| 乱伦熟女论坛| 欧美第一页| 亚洲操操| 欧美十八禁视频| 久久女女| 91精品国产综合久久久蜜臀| 十八禁视频一区二区| 日韩人妻丝袜美腿中文| 99在线精品视频| 无码精品久久| 亚洲91射| 狠狠夜色午夜久久综合在线| 探花一区在线| 久久久久久久强迫| 免费成人在线熟妇网| 涩五月婷婷| 国产成人无码网站在线视频| 精品午夜福利| 亚洲精品久久久久久| 无码heyzo高清一区| 综合自拍| 激情抓乳插进去啪啪啪日韩 | 亚洲欧洲综合成人av一区| 91无码精品| 国产AV线| 亚洲一区二区专区-国产丝袜精品丝袜-成人AV | 亚洲天堂一区二区久久| 亚洲色图欧美激情| 国产精品高潮久久久无码| 欧美成人免费在线观看| 亚洲中字幕日本一区二区三区| 少妇一级无码精品| 大香蕉一区二区在线观看.| 美日韩男女操屄视频| 免费αⅴ在线观看| 浪人综合网| 精品久久久久久亚洲| 久久精品免费| 精品人妻一区春色| 亚洲激情视频| 天美传媒AV在线| 色色青青久久| 亚洲精品人伦一区二区| 美女黑人91神马| 日韩在线97| 人妻 制服 日韩 中文 在线| 日韩99神马视频播放片在线播放| 日本精品成人无码| 欧美色性爱| 亚洲五码一区二区三区| 国产精品美女在线一区| 日本一区二区三区午夜观看| 亚洲加勒比久久日本道| 久久久久久久9| 97色伦97色伦国产欧美| 日韩日本欧美在线观看| 一级AV性爱| 人妻少妇精品久久久久久| 久久人妻一区二区三区高清| 制服中出中文人人精品| 97精品97久久| 久久久久久九九九| 亚洲自拍天堂| h无码动漫在线观看| AVE乱伦| 亚洲欧美一区二区网址| 97在线视频观看网站| 丰满人妻无码一区二区三区| 国产传媒操逼视频| 嗯啊不要在线| 99re8免费高清在线|