色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(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)接收的底層機制掌握中斷服務(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ù)搬運工」變成「數(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 改變了什么搬運交給硬件通知只在邊界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 搬運結(jié)束的那一刻參與工作。這里有個關(guān)鍵選型點DMA 的傳輸模式。我一般會用 Normal 模式加手動重裝載而不是直接用 Circular 模式原因在后續(xù)章節(jié)展開但先記住一個結(jié)論——Circular 模式省心但丟幀邊界非常難判斷半傳輸中斷那套機制在 FreeRTOS 任務(wù)調(diào)度下反而容易產(chǎn)生競態(tài)。2.3 任務(wù)架構(gòu)怎么搭生產(chǎn)者-消費者模型的正確姿勢硬件層面搞定 DMA 以后軟件層要把接收鏈路由中斷驅(qū)動改成「DMA 寫緩沖、任務(wù)讀緩沖」的生產(chǎn)者-消費者模型。典型結(jié)構(gòu)分三段。第一段是 DMA 中斷回調(diào)函數(shù)里把本次搬運的數(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%而且不消耗獨立的信號量對象。3. 拆分 DMA 緩沖區(qū)與幀邊界判定半傳輸中斷和空閑中斷的分工3.1 為什么單靠「傳輸完成」中斷會卡死自己如果用 DMA 的 Normal 模式搬運完設(shè)定的字節(jié)數(shù)才觸發(fā)一次傳輸完成中斷那 CPU 必須趕在 DMA 寫完緩沖區(qū)之前把數(shù)據(jù)取走否則 DMA 繼續(xù)搬運新數(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 硬件在搬運時更新讀指針由任務(wù)在消費數(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 還在搬運的話先關(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ù)搬運不用 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 搬運方向反了現(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ù)正常搬運了但接收任務(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 上下文切換機制根本不會觸發(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就會把還沒消費的數(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ù)到了但沒有搬運通道數(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ù)不運行調(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 搬運完成中斷里調(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)試都是白費時間。這套 FreeRTOS DMA UART 的組合在邏輯上已經(jīng)足夠可靠剩下的瓶頸全在這類硬件細(xì)節(jié)上希望這些排查路徑能幫你少走幾趟彎路。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日本精品五区| 97久久免费| 精品人妻丰满熟妇一区二区三| 国产91影院| 精品一区二区3区| 这里只有精品97| 狠狠操狠狠| 日本506070| 亚洲熟妇丝袜在线观看| 一本久道在线综合视频| 午夜福利 成人 91| 密臀在线免费观看| 大香蕉免费3| 亚洲日产专区| 亚洲不卡三级手机播放| 色婷婷综合久久中文字幕雪峰| 日本高清免费一本视频在线观看| 男人的天堂日韩| 久久久婷婷| 9久超碰| 免费αV在线视频| 日本加勒比无码专区一二三| 婷婷五月天社区| 欧美日韩97| 久久亚州高清| 天天弄天天操| 亚洲日韩精品一区视频在线| 日本道日本道中文字幕日本道最新日本道在线观看| 精品久久久亚洲AV成人网站| 岛国免费黄色网址| 一区二区视频在看| 超碰在线1234区| 精品人妻一区二区三区-国产| 青娱乐国产精品| 欧州91高潮| 人人澡综合涩| 欧美美女在线高潮999| 免费视频a级毛片免费视频| 国产亚洲色停停久久99精品91| 强上我不卡卡| 亚洲丝袜色| 五月丁香婷婷啪啪| 色欲久久99精品久久| 国产黄色动态精品| 久久欧洲| 久久综合18p| 嗯啊不要在线观看嗯啊| 99视频只有精品| 综合色久| 久久午夜伦| 精品国产人成在线| 巨爆乳肉感一区二区三区竹菊影视| 影音先锋乱伦资源| 欧美操逼熟女| 手机在线视频国内精品| www.久久制服糖| 沈阳熟女高潮对白视频| 国产亚洲女v在线观看| 人妻一二三区| 欧美久久伊人| 九九色色| 97人人爱人人做人人乐| 久久久一区二区三区麻豆| 操曰本熟女| 欧美亚洲韩国视频十五区 | 天天综合网AV91| 五月天人妻综合| 91高清欧美| 狠狠色噜噜狠狠狠狠2018| 日日橹狠狠爱欧美超碰| 另类小说五月天| 97国产高清视频在线观看| 婷婷伊人五月| 性videos欧美熟妇hdx| 人人干人人操人人爱| 友优传媒精品在线一区二区| 精品久久久久久中文字幕视频免费| 中文字幕第7页| 久久久久国产精品久久久| 精品性爱| 欧洲综合无码| www四虎| 日韩免费a级毛片无码a∨| 麻豆久久一区二区三区| 成人 日韩欧美一区| 久欲AV| 国产偷拍自拍在线视频| 色婷婷日韩精品一区二区三区| 91三级理论片播放器| 日韩中文字幕宗合在线| 最新中文字幕精品在线| 青青草公开在线免费不卡视频| 国产精品老师| 操逼无码操逼| 久久熟女精品不卡一区| 亚洲男人天堂2019| 久久黄色视频一区二区三区| 欧美激情黑人| 亚洲中文人妻色| 亚洲av综合色区图片亚洲| 风月影院男女十八禁| 午夜久久无码1000合集| 韩国三级色呦呦| 亚州色图狠狠干| 久久香蕉综合一本到3atv| 亚洲综合色图欧美| 久神马| 九九综合| 欧美v亚洲v日韩v最新在线二区| 96超碰网| 天天在线91| 欧美日韩淫加| 老鸭窝亚洲毛片| 综合欧美日韩在线观看| 国产JDAV无码视频在线观看| 亚洲熟妇AV日韩熟妇在线| 天天日老熟妇| 丁香激情五月天| 人妻 丝袜美腿 中文字幕| 东京热综合久久一区二区| 亚洲欧美一区二区不卡视频播放 | 116美女午夜| 中文字幕在线高清男人的天堂| 韩国一区二区精品亚洲| 亚洲清纯综合| 无码国产Av| 九九九久久久| 777超碰| av日韩中文字幕| 九一综合网| 亚州久久9| 久久国产视频专区一二三| 九九综合久久| 久操不卡视频| 久久男人的天堂国产| 曰韩av中文字幕专区| 蜜桃视频成a人v在线| 激情五月综合开心五月| 熟妇xxxxx性春色| 第四色奇米影视777| 富女玩鸭子一级毛片| 9118禁| 香蕉人欧美综合| 97综合久久| 青草综合| 在线a v| 欧美精品日韩一区二区| 久久久久久欧美精品se一二三四| 天天拍天天操| 综合网欧| 校园春色 亚洲| 激情小说亚洲| 日韩国产在线观看av| 日本在线视频导航| 欧洲综合视频| 久操婷婷| 亚洲人天堂| 亚洲图片日本AⅤ欧美在线| 日韩99神马视频片| 成人性爱全视频观看| 精品国产乱码久久久久久久| 另类图片五月天| 日本不卡二区| 国产人人干| 美女啊啊啊啊pc| 亚州欧美另类| 黄网站黄视频网站进入口 | 综合网亚| 日本在线999| 日韩性色| 啊啊啊好大好深| 99热精品在线观看| 97综合国产| 天天日天天操天天射河南省| 婷婷丁香五月激情啪啪| 欧美成97爱| 激情专区综合| 国产老熟女| 人人操人人干网页| 激情五月婷婷综合| 韩美日操逼| 97操碰| 日本性一区| 成人97人人超碰人人| 日本三级黄页| 亚洲综合影院| 嗯嗯嗯,草死我| 亚洲国产综合图区中文字幕 | 91精品无码人妻系列| 欧美曰韩国产精品| 综合在线导航一区| 夜夜夜夜爽| 深田咏美亚洲精品福利社| 日日夜夜草草草| 九九九精品成人免费视频小说| 蜜臀少妇一区二区| 性久久久| 成人情色综合网| 熟女突然公开看18禁影片| 中文字幕在线第二页| 俺去俺来也在线www| 99精品丰满人妻无码| 色综合尤物| 大茄子熟女AV导航| 久艹伊人精品综合在线| 国产av强奸美女| 91成人久久| 国产精品一区二区黄片| 丝袜亚洲综合| 日本一久是| 欧美男人一区| 二男一女成人A片| 欧美亚洲系列| 亚洲精品蜜桃久久久久久久| 国产精品熟女丝袜一区二区| 亚洲欧洲av影音| 91劲爆| 精品国产少妇高潮视频| 欧美精品99久久久**| 亚洲中文字幕av | 婷婷五月天久久久| 大香蕉123| 26uuu性| 亚洲激情视频| 大但人体久久久久| 大香蕉国产中文自拍| 五月天激情四射| 久久黄色视频一区二区三区| 午夜精品久久一区二区| 99999久久精| 岛国999| 色欲人妻一区二区在线| 久久麻豆一区二区| 亚洲精品99| 中文字幕日韩人妻视频一区二区三区| 亚洲欧美日韩偷拍色图| 97碰碰色| 精品视频久久| 精品九九| 欧美福利视频啊啊啊啊| 你懂的在线观看区国产| 日本一区二区不卡| 天堂69亚洲精品中文字| 黄色免费网| 久久精品国产精品一区| 伊人热综合| 亚洲美女AV无码| 啪啪综合网| 97在线免费| 伊人天天久久动态图| 久久久久久久97| 另类天堂| 欧洲成人性爱视频| 国产精品亚洲一区二区三区四区| 337p大胆噜噜噜噜噜91Av| www.国产高潮精品| 夜夜爽77777| 96AV精品| 久久成人午夜狠狠| 成人性生活高清视频在线播放| 中文区中文字幕免费看| 欧美精品精品一区二区| 操逼视频免费日韩无码| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 中文字幕av乱伦| 亚州色图第三区| 91精品人妻一区二区三区蜜桃| 亚洲日韩XXX| 天天综合网1| 97bbn| 国产对白刺激视频| 97精选久久| 啪啪91| 欧美呦呦性爱| 4虎在线视频| 发朗少妇买婬全视频中文| 人妻少妇精品视频一区二区三区| 91逼逼女人91| 欧美偷拍区| 精品久操| 国产熟女高潮一区二区三区| 91 亚洲情侣偷拍 久久| 超碰公开久久网| 白丝在线一区| 97色操| 丝袜 中出 制服 人妻 美腿 中文字幕| 97在线视频观看免费| 黑人精品久久97| 欧美96交| 色五天伊人| 中文字幕91页| 巨爆乳肉感一区二区三区竹菊影视| 性爱边摸边日免费AV| 91人妻素女| 精品婷婷| 亚洲另类久操网| 密臀AV在线| 97精品国产97久久久久久| 亚洲 综合 欧美| 国产性爱乱伦AV| 福利天堂| 精品人妻美妇91job| 免费97视频| 99re公开精品免费视频 | 搡老女人老91二区| 97视频在线免费看| 日本成人A片免费看| 日韩无码AB| 丁香五月综合| 青草成人免费视频一COm| 女优视频第10页| 欧美激情视频在线一区| 激情四射婷婷六月天| 啊v视频在线观看| 97视频网站| 99精品高潮| 欧亚在线视频| 日本人妻中文字幕精品| 人妻人久久精品中文字幕| 五月丁香| 新久久AV| 七月丁香婷婷| 福利五区| 99RE在线视频精品,这里只有精品| 国产日韩区| 四虎影视精品| 亚洲色图美腿丝袜| 亚洲骚女一区二区三区| 手机在线人成免费视频| 亚洲男人综合| 亚洲欧美日韩不卡人妻| 96久久久精品| 国产盗摄美女如厕大神作品在线观看| 99爱久久视频频| 久久綜合很很很| 久热69九色熟妇97| SUV一区二区在线看| 成人一二三区| 天天天乱色综合全| 婷婷香蕉欧美在线一区二区三区 | 无套内射人妻在线播放| 91亚洲色人| 中文字幕奈奈美被公侵犯| 国产成人久久精品蜜臀| 9久久精品| 国产女生在线| 亚洲图片 欧美电影| 精品国产99| 丁香五月AV| 91精品久久综合熟女| 亚洲免费成人在线高清无码视频| 黑人娇小av在线播放| 国内精品久9| 亚洲凸凹超碰成人| 丝袜美腿校园春色| 25国产精品免费观看| 五月婷婷丁香中文字幕| 天天色怡春院| 亚洲黄色影视| 国产 热久久久久国产精品| 久久啊啊| 综合操逼| 黄片www视频免费| 日本在线一二 | 探花激情视频| 性久久久| 精品久久一区二区三区四区五区| 亚洲一二三| 人人干人人操人人爱| 91丨九色丨东北熟女| 中文字幕在线2| 亚洲成人在线高清| 亚洲天堂另类美腿| 草草草草视频| 婷婷在线视频| 欧美国产婷婷久久| 亚洲AV成人无码一二三久久| 夜夜高潮夜夜爽高清视频一| 欧美后入视频| 亚洲老熟妇xxx| 激情综合亚洲| 久久婷婷综合国际产色怕| 91国产精品熟女| 亚洲,欧美,综合网| 高清成年美女黄网站免费大全| 青苹果影院男人的天堂| 精品人妻一区二区三区在线视频不卡| 99色热| 久久久久久久久久精| 91免费看一区二区三区| 免费看污网址| 91伊人久| 日本美女性生活久久久久久久| 伊人在线大香蕉视频久久| 足交视频老司机| 国产亚洲福利第一页丝袜| 高清无码 国产精品| 入口操逼网站| 日本加勒比无码专区一二三| 日韩国产乱子伦App| 国产美女激情| 另类一区| 蜜臀中文无码午夜| 九月婷婷| 亚洲图片欧美| 1区2区3区在线视频| 亚洲欧美日韩偷拍色图| 天天操天天射青青草| 色妇综合网| 欧美日韩m| 白丝一区| 少妇内射www在线观看视频| 100啪啪视频大全| 97硬碰| 人妻干天天| 久久久婷| 国产欧美日韩在线不卡第一页| 精久久久| 丰满人妻一区二区三区| 成人精品在线免费视频| 色九月综合| 久久av成人无码免费| www.男人天堂| 亚洲精品国产精品乱码不99| 色约约一区=区三区| 激情第四色| 少妇高潮流水av免费| 超碰碰激情97+久| 亚洲AV无码黄色强奸| 一区二区三区 丝袜高跟| 久久五十路熟女人妻| 人妻熟妇久草在线| 91九色在线| 97碰| 九九av| 日日夜夜狠狠| 欧洲欧美视频一区二区| 丰满熟妇大乳做爰| 欧美大香蕉97| 亚洲精品日日夜夜52| 欧美劲爆第一页| 熟女中出视频| 欧美十八禁在线看| 无遮挡男女激烈动态图| 超碰久草| 中文字幕AV片| 大香樵伊人网| 免费作爱一级视频| 一区二区免费电影久久| 91女日逼| 精品美女少妇一区二区三区| 激情综合五月| 自拍视频一区在线观看| 久久这里只精品| 日韩午夜国产| 婷婷国产精品九区| 亚洲天堂99| 国产 日韩 欧美一区| 有码专区最新中文字幕有码| 屌妞视频久久久久久久久久久久| 色色五月婷| 国产一级高跟丝袜| 亚州综合色| 久久女女| 久草在| 东京太热久久久| 午夜福利视频在线一区| 国产成人欧美一区二区三区的国产| 综合亚州欧美| 91欧美性| 日韩精品99久久久久久中文字幕| 九九色综合| 久操不卡视频| 波多野结衣先锋影音| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 久久中文字幕一区不卡| 综合久久久久久久久91| 999热这里只有精品| 国产丝袜高跟美女av免费观看| 嗯啊啊啊轻点视频| 色色99| 亚洲精品视频在线| 国产福利影视| 天天躁日日躁AAA片李宗瑞| 黄色香蕉视频网站一区| 国内精品久久人妻性色av| 91青青草| 91人人操| 偷拍盗拍亚洲色图图片| 亚洲国产97在线精品一区| 五十路人妻在线| 国产午夜视频| 久久骚少妇| 97爱亚洲综合色| 丰满搜索结果 -第18页- 久久高清无码| 久久午夜伦| 91狠| 黄色二级片网站| 嗯嗯嗯啊啊啊操的我好爽 | 精品久久久久久中文| 国产精品免费1区2区视频| 欧美一区二区一级岛国大片| 无码高清少妇久久| 久久久久久一日韩字幕无码| 日韩99精品视频综合区| 免费人成在线观看网站品爱网| 欧美性生活免费网| 约操熟妇| 欧美做爰无码A片视频| 新版天堂中文资源8在线| 91五月天| 超碰性爱97| 久久久久久久久久久久黄色| 中国小夫妻勾搭露脸淫荡对白| 亚洲91综合| 极品出轨视频网站| 91丝袜| 97在线视频免费观看| 麻豆色约约| 天天日天天干天天操| 国产精品点击进入在线影院高清| 国产精品久久久久久久久久梁医生| 操逼日批| 久操热| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 亚洲黑丝在线| 色女综合| 少妇贴图| 国产精品第一区第一页| 亚洲最新av无码成人精品区| www.yw尤物| 少妇人妻精品| 久久大香蕉97| jizz啪啪| www色色com| 好好的日:com久久九九| 91网站在线播放| 97极品无码| 天天草夜夜草高潮片| 丁香六月啪啪| 日韩 欧美 校园一区| 老鸭窝在线视频播放| 五月婷亚洲精品天堂| 999精品国产高清一区二区| 免费在线黄片视频| 欧洲综合视频| 黑人粗大V S日韩女优视频| 精品传媒在线一区| 亚洲Av无码成人精品国产| 偷拍 精品另类 凸凹了四区| 极品色电影院| a'v在线资源| 欧美日综合| 久热精品色情| 中文久久久| 丝袜剧情| 色综合久久夜色精品国产天堂| 久久粉色| 中文字幕狠狠玩| 亚洲熟妇无码一区二区三区| 超碰色97| 97人人模人人爽人人| 久久的网站啊啊啊啊啊| 9丨久久九九九| 免费啪啪啪网站18岁| 免费人人搞97| 日本影视久久免费| 一区二区日韩欧美久久| 97中文综合| 国产精品探花视频| 第45页一区二区| 蜜臀久久久99久久久久 | 超碰国产精品久| 狠狠干狠狠色| 手机在线大香蕉| 殴美大黄片| 香蕉免费一区二区三区不读| 久久久久久九九九九| 久久免费精彩视频| 成人夜夜| 久久久久国产一区二| 成年男人的天堂| 好爽免费视频| 少妇二级| 超碰免费97| 亚洲综合网电影91| 欧美日韩1234| WWW4虎| 91综合色| 熟妇一区二区三区| 为用户提供免费看黄网址在线观看| 人妻天天爽夜夜爽爽| 91精品国产综合久久久蜜臀酒店| 99色| 日本在线观看网址| 青青草亚洲一区 | 97精品97久久| 蜜乳性色无码专日粉嫩骚逼AV| 金典av| 久草福利在线资源站| 99热日| 亚洲天堂无码| 色约约一区=区三区| 成人情色一区二区| 久久大| 久久熟女人| 97超碰色情| 精品四五区| 三级日本一区二区三区| 亚州色图欧美| 91强奸乱轮| 女上位精品在线| 操高情无码| 国产精品一区二区三区免费视频| 又大又黄国产| 免费观看性欧美一级| 综合大香蕉美。| 亚洲午夜AV| 91伊人| 欧洲乱码视频| 国产67194| 91无码西班牙视频在线| 歐美性天天| 涩五月婷婷| 无码动漫av中文字幕| 秋霞午夜视频一区二区| 亚洲精品乱码久久久久久蜜桃麻豆| 少妇精品久久| 国产精品视频| 成人日本视频人妻在线| 国产天天噜一噜久久久| 欧美综合97www| 亚洲色图尤物视频| 久草看看看| 久久国模av| 九热视频| 中国一级特黄大片护士| 夜夜夜爽www精品视频| 今日头条成人一区二区三区四虎精品| 新版天堂中文资源8在线| 三久久久四久久久久| 欧美色图在线视频少妇| 老女人日韩美91| 啪一啪免费视频| 久久久亚洲熟妇熟女| 素人伊尹大香蕉免费下载视频| 欧美乱色| 欧美黄片视频在线观看免费| 国产精品久久久久无码A√| 农村少妇久久久久久久| 九九热视频这里只有精品| 白嫩国模丰满一二三区| 八戒无码国产午夜福利| 欧美性爱一区二区三区| 中文字幕精品乱码| 久久久久中出| 99婷婷| 国产精品久久久久久久毛片1| 9久久久久| 亚洲中亚日激情视频| 欧美三级免费伊人| 五月天婷婷成人网| 国产精选三级在线观看| 天天操人人操狠狠插| 欧美加勒比| 欧美激情高清性猛交| 黄久在线| 日韩美女,国产传媒,视频一区| 久久久999日本大片| 人人人人人人少妇| 亚洲欧美日韩综合在线尤物| 欧美aaaaaaa| 一类av片在线看| 日语五十路和六十路亚洲国产精品 | av大香蕉| av国产无码| 欧美综合区| 国产精品婬乱一级毛片彝族| 日本色色视频网站| 欧美特大AA级黄片| 人妻一区二区三区四区视频| 综合色91| 久久久青青草| 亚州欧美在线| 夜夜精品视频一区二区| 人人操人人精品影片| 亚洲91射| 91精品国| 2017天天操天天日| 久操国产在线| 久久综合97| 91蜜桃传媒精品久久久一区二区| 少好三P| 日韩成人人妻网站| 欧色网址| 老熟女网站| 超碰95| 久综合国内精品自在自线| 午夜视频久久久久一区| 日韩成人在线性爱视频| 欧美成熟性爱精品| 日韩综合无码色欲vv| 亚洲天堂一区二区久久| 国产一区二区精品久久99| 俺去俺来也在线www| 国产在线视视频有精品| 在线99热| 上床不卡网站| 校园春色宗合网| 很狠操| 天天射日日干| 日韩精品资源专区二区| 天天谢天天干| 91色婷婷综合久久中文字幕二区| 色墦五月丁香| 亚州伊人色综台| 人妻天天夜夜爽一区二区| 久久熟妇五十路一区| 搞中出视频在线观看| 天天综合麻豆视频| 92一区二区| 26uuu国产亚洲综合| 黄片色区软件| 男人天堂2019亚洲| 欧美高潮在线| 亚洲怡春院| 韩国一级做a久久久久| 国产日韩欧美中文在线播放| 日韩去日本高清在| 青青草黑寡妇男人天堂| 色呦色呦色精品| 四虎影视欧美| AVE乱伦| 日本女优在线视频福利| 亚洲黑丝在线| 久久久男人的天堂| 啊啊啊久久| 欧美黄色片在线播放| www.伪伪| www老逼91| 日本久久久精品电影| 国产91丝袜 在线播放| 成人av影院在线观看| 久久xxxx| 老司机久久| 超碰在线人人射| JIZZJIZZ国产精品喷水| 刺激性视频黄页| 96久久久久久久| av在线不卡一区二区三区| 能看的AV| 日本熟妇自慰性高潮一区二区三区| 亚洲国产综合图区中文字幕 | 中文字幕av亚洲精品| 日本熟妇人妻中出视频| 国产精品久久发布| 男人天堂资源| 特级丰满少妇一级AAAA爱毛片| 91成人在线| 欧美情色亚洲| 欧美日韩性爱操大逼| 爱爱久久| 99婷婷一区二区| 久久综合九九| www.acm成人黄色毛片| 2019精品国产无码成人| 看日韩美女二区三区免费操逼视频 | 操b在线观看| 97精品综合| 综合大香蕉美。| 黄色小视频日本txt| 老师充足的奶水小说| 亚洲天堂男| 91操人| 懂色av中文字幕| 狠狠中文字幕| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 九色精品视频导航1| 4141514逼喷水三级片| 久久系列| 亚洲国产成人精品久久久国产成人一区二区三. | 亚洲综合 欧美| 91丨国产丨白浆秘 洗澡动漫| 亚洲欧美九九| 清纯唯美亚洲综合| 色婷婷导航| 日韩有码中文字幕女同性恋| 熟女六十路| 密臀在线视频| 日韩人妻无码专区| 9美女超碰在线免费观看| 99久re热视频精品98| 一区超碰一区| 熟女突然公开看18禁影片| 尤物视频新赏网鲜网色诱网| 国产福利影视| 嗯嗯嗯啊啊在线观看| 久久人人看| 超碰97综合| 日本在线视频导航| 色97干| 亚洲 图片 综合91| 精品久久久久久AV无码| 大香蕉在线视频重口味毛片在线| 欧美亚洲国产91在线| 色超碰综合| 偷拍自拍在线视频观看| 亚洲免费97免费| 成全在线观看免费观看| 9精品久久| 久久性爱网站| 人人妻人人玩人人澡人人爽| 人人喜人人妻| 四虎午夜影院| 四虎影视永久在线观看精品免费网站 | 国产精品国产| 亚洲激情久久| 亚洲欧美999| 精品人妻一区二区三区-国产精品| 在线播放免费av福利片| 超碰无码五月97| 高清无码国产亚洲| 富女玩鸭子一级毛片| 麻豆 亚洲 97| 久久久亚洲欧美综合| 又黄又硬又粗又长国产视频| 黑操B| 欧美人妻久久精品二区三区| 欧美色蜜桃97| 精品人妻一区二区三区-国产精品| 性在久久久久久| 91丝袜人妻| 国产91美女高潮| 国产 热久久久久国产精品| 天美av在线| 亚洲人妻熟妇三十三区| 偷拍自拍在线视频观看| 精品久9| 色偷综合| 欧美综合97www| 99在线无码精品秘 入口黑人| 中文字幕乱亚洲美女精品一区| 大香蕉伊人在线成人AV在线观看| 亚欧毛片基地国产毛片基地| 男人的天堂三级| 熟女在线视频| 一区二区三区机械有限公司| 秋霞网—男女啪啪亚洲免费体验区| 日韩特一级久久| 91在线丝袜视频| 狠狠激情综合狠狠操中文字幕| 免费操逼91| 婷婷10月天青娱乐| 亚州综合AⅤ| 日韩成人性爱AV| 亚洲黄片免费在线播放| 黄页网站成人免费| 亚洲综合贴图91| 精品四五区| 日日碰狠狠添天天爽超| 91av一区二区在线观看| 欧美美女视频| 日本道人妻久久久在线不卡色视频| 久久人妻97久久久久久久| 欧美成人黄网色网站| 久久黄色性爱视频| 神马久久久久久| 女人18精品一区二区三区| 久久超碰98| 久草精品热视| 久久久久久久久久久六六| 操逼片中文| 男人的天堂午夜av| 八戒午夜福利理论片| 91精品网站| 国产超碰欧美| 91 亚洲情侣偷拍 久久| 亚洲欧美九九九| 国产怡红院| 色蜜AV| 美女操逼福利视频| 97在线精品观看视频| 欧美黄页| 69国产对白刺激| 美女网站91| 亚洲情色 自拍| 男人的天堂久久| 97人人色| 1024精品在线| 91热| 视频黄站| 亚洲,欧美,综合网| 肉丝无码中文高清| 人妻喷水| 人妻激情视频| 亚洲怡春院| 欧美午夜视频| 亚洲欧洲无码一区夜| 色情婷婷久久五月天| 婷婷精品国产一区二区三区日韩| 欧美亚洲涩涩| 久久精品电影| 天天拍天| 婷婷国产精品一区二区| 风间由美日韩欧美久久| 国产一区在线看| 九九草| 啊啊啊网站| 人人操人人干xxx| 超碰精品日韩欧美国产| 啪啪视频亚洲第一| 久草视频观看视频在线| 男女做爰猛烈动高潮A片免费应用 少妇厨房愉情理伦片bd在线观看 不卡中文字幕aⅴ在线 | 新怡红院| 人人妻人人爽| 久久78| 熟妇的味道HD中文字幕| 欧美操逼熟女| 亚洲操操| 久久久亚洲精品电影免费看| 日本久操视频| 91色综合激情| 亚洲AV不卡在线观看| 久久九九热| 国产成人久久精品蜜臀| 搡老熟女免费视频| 国产欧美日韩一区二区三区| 国模精品一区二区三区苹果色戒| 五月激情综合网| SS久久| 97欧美久久久久久久| 91丨九色丨熟女高潮| 蜜乳成人AV| 酒色综合网| 日韩猛交| 成人小说视频在线精品欧美| 久久久久久亚洲中文| av天堂精品久久| 国产AV久久野战精品| 日韩av一级黄片| 婷婷AV一区二区三区| 91强热人妻| 67914亚洲精品| 裸模AV女优| 国产成人精品午夜福利| 蜜臀久久99精品久久久久电影| 啊啊啊啊免费视频| 青青免费在线视频一区| 美女熟妇色| 人人透人人操| 成人老鸭窝人人在线视频| 试看福利| 色臀av| 午夜无遮挡男女啪啪视频| 免费观看网黄| 午夜120视频在线观看| 中文字幕乱在线伦视频中文字幕乱码在线| www.av在线视频| 丁香九月激情| 亚洲美女30b| 热热色中文无码| 久久国产热视频97电影| 九九热精品| 神马久久69| 国产强奸无码乱伦| 激情综合色| 欧美日韩人妻婷婷一区| 三级日韩一区二区三区| 综合久久婷婷| 插插综合网天天影视网| 亚洲伊人a线观看视频| 91女人的网站| 猛猛干| 啊…啊…操我用力操我| 免费男人的天堂| 亚洲砖码砖专无区2023| 九九成人精品| 国产高清视频无码在线| 日本一区二区电影网站| 久久九色| 99re这里只有精品3| 九久9精品| 免费A V在线| 亚91网| hd成人一区二区在线| 亚洲91射| 久久性视频| 91bbb| 人妻精品一区二区全免费| 热无码中文亚洲H一道本一区二区| 亚洲有薄码区日本系列中文字幕| 亚洲色图欧美| 91人妻超碰| 成人无码在线超碰网| 懂色综合久久久| 最新日本中文字幕| 内射卯月麻衣| 丁香六月婷婷久久综合| 人妻二区| 亚洲天在线| 欧美午夜色妇色鬼| 久久久九九网站| 91亚洲色人| 97超碰香蕉| 9997se| 精品国产72| 999狠狠综合| 久久久久久久国产视频| 日本三级精品| ai欧美亚洲小说| 色综合美国| 成人午夜视频免费播放| 放黄片放3级黄片没穿衣服| 人妻内射一区二区在线视频| 亚欧精品久久久久久久久久久| 国产亚洲精品农村妇女| 一级性爱网| 欧美美女视频| 激情五月天校园春色网| 午夜男人天堂| 极品美女福利在线观看| 国产操逼网站亚洲一级黄色| 九九九九精品一区| 人妻一区二区三区| 国产人妻天天干精品| 国产一级高清免费观看| 粉嫩久久久极品| 情色五月天网| 亚洲综合色男人网| 午夜精品一区二区三区三上悠亚| 金莲网址| 99久久e免费热视| 中国国产精品一区视频| 国产精品原创巨作?v网站| 久久久久久97| 欧美一区二区三区不卡高清视频| 综合亚洲欧美| 亚洲精品九九九| 97干97色| 人妻干天天| 人人操我人人干| 精品国产www久久| 五月丁香久久| 91在线免费观看处女| 欧美狠狠弄| 亚洲美女 晚间男人天堂 | 91N五十路| 国产亚洲日本| 天天影视综合色| av网站免费看| 日本黄色大片一级视频免费麻豆| 男男H黄动漫啪啪无遮挡网站| 操碰91| 都市激情人妻一区二区青青操视频 | 日本网色| 殴美日韩m| 久草在| 91人人| 视频黄色国产一级| 丰满人妻一区二区三区免费,| 国产有码一区| 黑人性欧美| 人人操肉肉| 日韩AV中文字幕电影| 91模特在线观看| se吧提供91精品国产91久久久久久 | 国产精品3| 中国AV美女| 亚洲高潮少妇| 久草精品一区 | 久久久精选| 大香蕉强奸乱伦| www.AV有限公司一区| 91春色| 五月综合久久| 亚洲少妇综合| 日韩欧美中文日韩欧美色| 亚洲 欧美 小说| 试看日韩黄片| 亚洲性爱高潮影院| 亚洲人妻爽爽爽| 9+1视频网址| 自拍六区| 一区二区激情国产熟女 | 久久高清无码夜夜操| 人妻干天天| 嗯嗯啊好大| 国产无马视频| 欧美精品欧美精品系列| 久久精品国产亚洲AV片多多| 亚洲的天堂网| 久草视频分类在线| 亚洲自拍小说| 精品人人| 久久性生大片免费观看性| 91熟女熟妇视频网站| 男人的天堂 在线一区| 亚洲AV乱码专区国产噜噜亚洲 | 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 日本精品第一视频在'| 九九热精品| 亚洲人妻熟妇三十三区| 日本欧美一区二区三区视频麻豆| 搞中出视频在线观看| 97国产高清视频在线观看| 欧美春色| 欧美 亚洲 另类 综合| 国产精品一区二区 尿失禁| 97色综合中文网| 96精品在线| 333kkkk·亚洲com久久| 亚洲精品熟妇1区2区3区。| 91狠狠综合久久久久久| 亚洲成人无码影院| 美女黄网| av橘色网站| 老熟妇综合| 人妻久久久久久久久久久久久久久| 欧洲性爱无码区| 18精品一二区| 无毛精品| 日本裸体久久色噜噜| 激情久久av一区av二区av| 亚洲春色一区二区三区| 中文字幕欧洲有码| 国模不卡一本二本三电影| 亚洲福利中文字幕在线| 免费一级精品啪啪视频| 97亚洲中文| 天天综合网~91| 蜜区区视频79| 超碰98综合网| 婷婷香网站| 二三四区精品| 日本天天干天天搞一区| 久久精品老司| 殴美综合色88| 日韩三级在线观看mp4| 综合干干干av久久久综合网 | 丝袜狠狠草尤物 91| 欧美97视频| 综合天天网| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 五月丁香啪啪啪| 麻豆国产尤物AV| 色欧美天天| 亚洲综合有玛| 亚洲日韩XXX| 91青青在线视频| 酒色综合网| 你懂的在线观看区国产| 欧美亚洲激情| 久久精品国产亚洲妲己影视| 免费a级毛片av无码久久精品中文字幕| 超碰精品国产无码| 乱伦图av| 久久亚洲精品成人av| 深夜啪啪啪视频免费| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 亚洲欧洲第二视频在线观看色图|