欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

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

FreeRTOS全局變量與信號量實(shí)戰(zhàn):解決多任務(wù)數(shù)據(jù)競爭與優(yōu)先級反轉(zhuǎn)

FreeRTOS全局變量與信號量實(shí)戰(zhàn):解決多任務(wù)數(shù)據(jù)競爭與優(yōu)先級反轉(zhuǎn) 1. 從一次詭異的“數(shù)據(jù)漂移”說起最近在調(diào)試一個基于STM32F407的FreeRTOS項(xiàng)目時遇到了一個讓我排查了大半天的詭異問題。項(xiàng)目里有兩個任務(wù)一個任務(wù)負(fù)責(zé)通過ADC采集傳感器數(shù)據(jù)并將原始值寫入一個全局變量g_sensor_raw_value另一個任務(wù)則負(fù)責(zé)讀取這個全局變量進(jìn)行濾波和校準(zhǔn)計算然后通過UART發(fā)送出去。邏輯看起來清晰簡單但實(shí)際運(yùn)行時UART輸出的數(shù)據(jù)時不時會出現(xiàn)一些“跳變”或“漂移”比如一個穩(wěn)定的電壓信號輸出值會偶爾出現(xiàn)幾個明顯錯誤的數(shù)值然后又恢復(fù)正常。起初我懷疑是ADC采樣受到了干擾或者是UART發(fā)送的時序問題。但經(jīng)過一系列測試包括在ADC任務(wù)里直接打印原始值發(fā)現(xiàn)原始值本身是穩(wěn)定正確的。問題似乎出在“讀取-計算-發(fā)送”這個鏈路上。更奇怪的是這種錯誤并非每次都出現(xiàn)而是在系統(tǒng)負(fù)載較高比如我手動創(chuàng)建了幾個模擬繁忙的測試任務(wù)時出現(xiàn)的概率會顯著增加。這讓我把目光聚焦在了那個共享的全局變量g_sensor_raw_value上。在單線程的裸機(jī)程序中讀寫一個全局變量是“原子”的因?yàn)椴淮嬖趫?zhí)行流被打斷的情況。但在FreeRTOS這樣的多任務(wù)搶占式調(diào)度環(huán)境下對全局變量的訪問瞬間從一個“安全操作”變成了一個潛在的“臨界區(qū)”訪問問題。我的ADC任務(wù)可能在任何一個指令周期后被更高優(yōu)先級的任務(wù)搶占如果恰好在寫入g_sensor_raw_value的過程中比如一個32位整數(shù)在32位MCU上可能需要多條指令才能完成寫入被發(fā)送任務(wù)打斷那么發(fā)送任務(wù)讀到的就是一個“半成品”數(shù)據(jù)——一部分是舊值一部分是新值這就導(dǎo)致了數(shù)據(jù)錯誤。這個案例引出了FreeRTOS嵌入式開發(fā)中兩個經(jīng)典且密切相關(guān)的話題全局變量的安全訪問與信號量的正確使用。很多人學(xué)了FreeRTOS知道信號量可以用來做同步和互斥但在實(shí)際項(xiàng)目中何時該用信號量保護(hù)全局變量何時可以不用以及如何高效地使用這里面有不少門道。處理不好輕則出現(xiàn)上述的數(shù)據(jù)錯誤重則導(dǎo)致系統(tǒng)死鎖、優(yōu)先級反轉(zhuǎn)等嚴(yán)重問題。接下來我就結(jié)合自己的踩坑經(jīng)驗(yàn)把這兩個問題的本質(zhì)、關(guān)聯(lián)和實(shí)戰(zhàn)解法掰開揉碎講清楚。2. 全局變量多任務(wù)環(huán)境下的“共享危險品”在FreeRTOS中全局變量本質(zhì)上是一片所有任務(wù)都可以訪問的內(nèi)存區(qū)域。它的“危險”并非來自變量本身而是來自多任務(wù)并發(fā)訪問時對變量操作的“非原子性”和編譯器優(yōu)化可能帶來的“可見性”問題。2.1 為什么簡單的賦值操作也不安全很多人會想對一個uint32_t類型的變量進(jìn)行賦值g_var 100;這難道不是一條指令嗎怎么會不安全這里存在兩個誤解。首先架構(gòu)依賴。對于32位ARM Cortex-M內(nèi)核如STM32常用的M3/M4/M7如果內(nèi)存地址是自然對齊的且編譯器優(yōu)化級別合適對32位整數(shù)的賦值通常是一條STR指令理論上算“原子”操作。但對于8位或16位單片機(jī)或者是對64位變量uint64_t、不對齊的內(nèi)存訪問、結(jié)構(gòu)體等復(fù)雜數(shù)據(jù)類型賦值操作幾乎肯定不是原子的。它會被編譯成多條加載Load和存儲Store指令。其次也是更關(guān)鍵的一點(diǎn)在C語言層面我們無法保證任何操作的原子性。C標(biāo)準(zhǔn)沒有定義“原子操作”。即使底層是一條指令編譯器在優(yōu)化時也可能為了性能而重排指令順序或者將變量緩存在寄存器中導(dǎo)致其他任務(wù)無法及時看到內(nèi)存中的最新值。這就是所謂的“內(nèi)存可見性”問題。讓我們看一個更典型的非原子操作例子自增g_counter。這行代碼看起來人畜無害但它通常會被編譯成至少三條機(jī)器指令從內(nèi)存加載g_counter的值到寄存器LDR。在寄存器中對值進(jìn)行加一操作ADD。將寄存器中的新值存回g_counter所在的內(nèi)存STR。如果在步驟1和步驟3之間發(fā)生了任務(wù)切換另一個任務(wù)也執(zhí)行了g_counter那么最終g_counter可能只增加了1而不是預(yù)期的2。這就是經(jīng)典的“丟失更新”問題。注意即使你使用的是volatile關(guān)鍵字也只能解決“可見性”問題強(qiáng)制從內(nèi)存讀取/寫入阻止編譯器優(yōu)化掉該變量的讀寫但絕不能解決“原子性”問題。volatile保證了每次訪問都去內(nèi)存但訪問過程多條指令仍然可能被打斷。2.2 編譯器優(yōu)化帶來的“幽靈”數(shù)據(jù)除了原子性編譯器優(yōu)化是另一個隱形殺手??紤]以下代碼片段// 任務(wù)A (生產(chǎn)者) void vTaskProducer(void *pvParameters) { int local_calc 0; while(1) { // ... 復(fù)雜的計算過程結(jié)果存于 local_calc ... g_shared_data local_calc; // 寫入全局變量 xSemaphoreGive(xDataReadySem); // 給出信號量 } } // 任務(wù)B (消費(fèi)者) void vTaskConsumer(void *pvParameters) { while(1) { xSemaphoreTake(xDataReadySem, portMAX_DELAY); process_data(g_shared_data); // 讀取全局變量 } }如果編譯器認(rèn)為g_shared_data只在任務(wù)A中寫入在任務(wù)B中讀取它可能會進(jìn)行一種叫做“寄存器緩存”的優(yōu)化。即任務(wù)A將local_calc的值寫入寄存器然后賦值給g_shared_data但編譯器可能覺得先把值存到寄存器稍后再一起寫回內(nèi)存更高效。如果在這個過程中發(fā)生了任務(wù)切換任務(wù)B在信號量觸發(fā)后立刻讀取g_shared_data讀到的可能是舊的內(nèi)存值而不是剛剛計算的新值。雖然使用volatile修飾g_shared_data可以阻止這種優(yōu)化但如前所述這又引入了額外的內(nèi)存訪問開銷且不解決根本的并發(fā)寫入問題。因此依賴volatile來保護(hù)多任務(wù)共享數(shù)據(jù)是一種非常脆弱且不推薦的做法。2.3 實(shí)戰(zhàn)中的全局變量使用場景分類根據(jù)我的經(jīng)驗(yàn)可以把全局變量在多任務(wù)中的使用分為三類應(yīng)對策略也不同只讀全局變量在系統(tǒng)初始化后就不再修改的常量或配置表。這是最安全的所有任務(wù)可以隨意訪問無需任何保護(hù)。例如const uint8_t g_device_id[] {0x12, 0x34};。單寫多讀全局變量只有一個任務(wù)負(fù)責(zé)寫入多個任務(wù)負(fù)責(zé)讀取。這是本文開頭案例的情況也是嵌入式系統(tǒng)中最常見的模式如傳感器數(shù)據(jù)、系統(tǒng)狀態(tài)標(biāo)志。這里的主要風(fēng)險是“撕裂讀”讀到中間狀態(tài)和“可見性”問題。需要保護(hù)。多寫多讀全局變量多個任務(wù)都可能對其進(jìn)行讀寫。這是最復(fù)雜、最危險的情況極容易產(chǎn)生數(shù)據(jù)競爭。必須嚴(yán)格保護(hù)。對于后兩種情況我們必須引入同步或互斥機(jī)制而信號量特別是二值信號量和互斥量正是FreeRTOS為我們提供的主要工具之一。3. 信號量不僅僅是任務(wù)同步的“信號燈”信號量在FreeRTOS中是一個核心的同步原語。很多人把它簡單理解為“任務(wù)通知器”——A任務(wù)做完某事給個信號B任務(wù)收到信號開始干活。這沒錯但這只是信號量功能的一半。它的另一半也是解決全局變量問題的關(guān)鍵在于互斥Mutex訪問。3.1 二值信號量與互斥量細(xì)微之差天壤之別FreeRTOS提供了兩種常用于互斥的信號量二值信號量Binary Semaphore和互斥量Mutex Semaphore。它們在創(chuàng)建時都是“滿”的計數(shù)為1都可以被Take和Give看似都能用來保護(hù)臨界區(qū)。但在實(shí)際使用中如果選錯了可能會導(dǎo)致嚴(yán)重的系統(tǒng)問題。二值信號量本質(zhì)是一個長度為1的隊(duì)列用于任務(wù)間同步或事件通信。誰都可以Give誰都可以Take。典型用途中斷服務(wù)程序ISR向任務(wù)通知事件如“數(shù)據(jù)已收到”、“定時器超時”。在這種情況下ISR調(diào)用xSemaphoreGiveFromISR()任務(wù)在循環(huán)中調(diào)用xSemaphoreTake()等待。用于互斥的缺陷假設(shè)任務(wù)A低優(yōu)先級獲取Take了信號量進(jìn)入臨界區(qū)。此時高優(yōu)先級任務(wù)B就緒搶占了A。如果任務(wù)B也嘗試Take同一個信號量它會被阻塞。這沒問題。但如果此時一個中優(yōu)先級任務(wù)C就緒了它不需要這個信號量它就可以一直運(yùn)行從而阻止了低優(yōu)先級任務(wù)A的運(yùn)行。任務(wù)A無法運(yùn)行就無法Give信號量釋放資源導(dǎo)致高優(yōu)先級任務(wù)B永遠(yuǎn)被阻塞。這種現(xiàn)象叫做優(yōu)先級反轉(zhuǎn)。二值信號量沒有解決這個問題的機(jī)制?;コ饬縈utex本質(zhì)具有優(yōu)先級繼承機(jī)制的特殊二值信號量。它除了包含一個隊(duì)列項(xiàng)還記錄了當(dāng)前持有它的任務(wù)句柄。優(yōu)先級繼承當(dāng)高優(yōu)先級任務(wù)B嘗試Take一個已被低優(yōu)先級任務(wù)A持有的互斥量時系統(tǒng)會臨時提升任務(wù)A的優(yōu)先級到與任務(wù)B相同。這樣中優(yōu)先級任務(wù)C就無法搶占AA得以盡快執(zhí)行完臨界區(qū)代碼釋放互斥量然后系統(tǒng)恢復(fù)A的原始優(yōu)先級。任務(wù)B隨后獲得互斥量并執(zhí)行。這有效緩解了無界優(yōu)先級反轉(zhuǎn)問題。典型用途專門用于保護(hù)臨界區(qū)資源如共享的全局變量、外設(shè)SPI、I2C總線、內(nèi)存池等。它明確了“所有權(quán)”的概念通常要求“誰Take誰Give”。下表清晰地對比了兩者的關(guān)鍵區(qū)別特性二值信號量互斥量創(chuàng)建時的初始狀態(tài)通常為空0用于同步也可為滿1用于互斥始終為滿1所有權(quán)概念無。任何任務(wù)都可以Give釋放它。有。通常由Take的任務(wù)負(fù)責(zé)Give。優(yōu)先級繼承不支持??赡軐?dǎo)致無界優(yōu)先級反轉(zhuǎn)。支持。緩解優(yōu)先級反轉(zhuǎn)。主要用途任務(wù)間同步、ISR與任務(wù)同步互斥訪問共享資源刪除安全刪除時如果信號量被Take可能導(dǎo)致不可預(yù)知行為。持有互斥量的任務(wù)不能刪除它有更強(qiáng)的安全性。核心結(jié)論如果你要保護(hù)的是一個需要被多個任務(wù)訪問的全局變量或其他共享資源請務(wù)必使用互斥量Mutex而不是二值信號量。這是避免系統(tǒng)出現(xiàn)難以調(diào)試的優(yōu)先級反轉(zhuǎn)死鎖的關(guān)鍵。3.2 如何使用互斥量保護(hù)全局變量正確的使用模式是“包裹”住對共享變量的所有訪問。以下是一個標(biāo)準(zhǔn)范式// 1. 在文件作用域聲明互斥量句柄 SemaphoreHandle_t xSharedDataMutex; // 2. 在初始化函數(shù)中創(chuàng)建互斥量 void System_Init(void) { xSharedDataMutex xSemaphoreCreateMutex(); if (xSharedDataMutex NULL) { // 創(chuàng)建失敗錯誤處理 } // ... 其他初始化 } // 任務(wù)A寫入全局變量 void vTaskWriter(void *pvParameters) { while(1) { // ... 生產(chǎn)數(shù)據(jù) ... if (xSemaphoreTake(xSharedDataMutex, pdMS_TO_TICKS(100)) pdTRUE) { // 成功獲取互斥量進(jìn)入臨界區(qū) g_shared_variable new_value; // 可能還有其他相關(guān)操作... xSemaphoreGive(xSharedDataMutex); // 離開臨界區(qū)釋放互斥量 } else { // 獲取互斥量超時進(jìn)行錯誤處理如重試、記錄日志等 } vTaskDelay(pdMS_TO_TICKS(10)); } } // 任務(wù)B讀取全局變量 void vTaskReader(void *pvParameters) { local_copy 0; while(1) { if (xSemaphoreTake(xSharedDataMutex, pdMS_TO_TICKS(100)) pdPASS) { // 成功獲取互斥量進(jìn)入臨界區(qū) local_copy g_shared_variable; // 安全讀取 xSemaphoreGive(xSharedDataMutex); // 離開臨界區(qū)釋放互斥量 // 對 local_copy 進(jìn)行后續(xù)處理此時已離開臨界區(qū)不影響其他任務(wù)訪問共享變量 process_data(local_copy); } else { // 處理超時 } vTaskDelay(pdMS_TO_TICKS(20)); } }關(guān)鍵點(diǎn)解析超時設(shè)置xSemaphoreTake的第二個參數(shù)設(shè)置了一個超時時間pdMS_TO_TICKS(100)表示100毫秒。永遠(yuǎn)不要使用portMAX_DELAY來等待一個互斥量除非你百分百確定它不會被長期持有。設(shè)置一個合理的超時可以在發(fā)生死鎖或某個任務(wù)異常時讓系統(tǒng)有機(jī)會恢復(fù)或報告錯誤而不是永遠(yuǎn)掛起。臨界區(qū)盡量短在Take和Give之間包圍的代碼臨界區(qū)應(yīng)盡可能短小精悍。絕對不要在臨界區(qū)內(nèi)調(diào)用任何可能引起任務(wù)阻塞的API如vTaskDelay(),xQueueReceive(), 或等待另一個信號量。這極易導(dǎo)致死鎖。讀操作也需要保護(hù)即使只是讀取也需要用互斥量保護(hù)。這是為了保證讀取數(shù)據(jù)的完整性和一致性。在你讀取一個多字節(jié)變量如結(jié)構(gòu)體的過程中如果寫任務(wù)被調(diào)度并修改了部分字節(jié)你讀到的就是一個不一致的數(shù)據(jù)。4. 替代方案當(dāng)互斥量顯得“笨重”時使用互斥量是通用且安全的做法但它并非沒有代價。每次Take和Give都涉及任務(wù)調(diào)度和上下文切換對于訪問非常頻繁的簡單變量比如一個每秒被讀寫成千上萬次的計數(shù)器互斥量的開銷可能成為性能瓶頸。此時我們可以考慮一些更輕量級的方案。4.1 關(guān)中斷最強(qiáng)大但最危險的鎖在FreeRTOS中最徹底的互斥方法是關(guān)閉中斷。UBaseType_t uxSavedInterruptStatus; uxSavedInterruptStatus taskENTER_CRITICAL(); // 進(jìn)入臨界區(qū)關(guān)中斷 g_shared_variable new_value; // 安全訪問 taskEXIT_CRITICAL(uxSavedInterruptStatus); // 退出臨界區(qū)恢復(fù)中斷狀態(tài)優(yōu)點(diǎn)絕對安全能防止任何任務(wù)和中斷的搶占。缺點(diǎn)嚴(yán)重影響實(shí)時性關(guān)閉中斷期間所有中斷包括系統(tǒng)滴答定時器無法響應(yīng)會破壞系統(tǒng)的實(shí)時性導(dǎo)致任務(wù)調(diào)度延遲、通信超時等問題??赡芤l(fā)中斷丟失如果關(guān)閉時間過長快速的外部中斷如UART接收可能丟失數(shù)據(jù)。使用準(zhǔn)則僅用于保護(hù)極短幾條指令的、且會被中斷服務(wù)程序訪問的共享變量。并且要精確計算關(guān)閉中斷的最大時間確保在可接受范圍內(nèi)。對于純?nèi)蝿?wù)間共享的變量絕不推薦使用關(guān)中斷。4.2 關(guān)調(diào)度器任務(wù)級的“隔離”如果共享變量只在任務(wù)間訪問不會被ISR訪問那么可以臨時關(guān)閉調(diào)度器。vTaskSuspendAll(); // 掛起所有任務(wù)調(diào)度 g_shared_variable new_value; // 安全訪問但當(dāng)前任務(wù)仍可被中斷打斷 xTaskResumeAll(); // 恢復(fù)調(diào)度優(yōu)點(diǎn)比關(guān)中斷“溫和”一些中斷仍可正常響應(yīng)只是任務(wù)間不會發(fā)生切換。缺點(diǎn)實(shí)時性影響關(guān)閉調(diào)度器期間高優(yōu)先級任務(wù)即使就緒了也無法運(yùn)行違背了RTOS的優(yōu)先級調(diào)度原則。需謹(jǐn)慎處理阻塞在調(diào)度器掛起期間不能調(diào)用vTaskDelay(),xQueueSend()等會引起任務(wù)切換的API。使用準(zhǔn)則適用于保護(hù)一段稍長但依然可控的代碼段且確保這段代碼不會調(diào)用任何可能阻塞的RTOS API。同樣需要謹(jǐn)慎評估對系統(tǒng)整體響應(yīng)時間的影響。4.3 原子操作針對簡單變量的“手術(shù)刀”對于基本的整數(shù)類型uint8_t,uint16_t,uint32_t的讀寫如果硬件架構(gòu)支持單指令原子操作并且我們只需要原子性而不需要復(fù)雜的互斥邏輯可以使用FreeRTOS提供的原子操作API位于portable.h等文件中具體取決于端口。但更通用和便攜的方法是使用C11標(biāo)準(zhǔn)引入的stdatomic.h頭文件如果編譯器支持。對于STM32的GCC/ARMCC編譯器通常支持C11??梢赃@樣使用#include stdatomic.h // 聲明一個原子整數(shù) atomic_uint g_atomic_counter ATOMIC_VAR_INIT(0); // 在任務(wù)中安全地自增 atomic_fetch_add(g_atomic_counter, 1); // 安全地讀取 uint32_t current_value atomic_load(g_atomic_counter);優(yōu)點(diǎn)開銷極小通常編譯為一條帶特殊前綴的原子指令如ARM的LDREX/STREX無需關(guān)中斷或任務(wù)調(diào)度性能極高。缺點(diǎn)僅適用于基本數(shù)據(jù)類型的簡單操作加載、存儲、加減、邏輯運(yùn)算等。無法保護(hù)復(fù)雜的代碼塊或?qū)Χ鄠€關(guān)聯(lián)變量的操作。使用準(zhǔn)則保護(hù)單個整型變量、標(biāo)志位的理想選擇。比如一個多任務(wù)共享的計數(shù)器、狀態(tài)標(biāo)志位。它解決了原子性和內(nèi)存順序問題是替代volatile的現(xiàn)代、正確方案。4.4 隊(duì)列將數(shù)據(jù)“移動”而非“共享”有時最好的保護(hù)就是不去共享。FreeRTOS的隊(duì)列Queue機(jī)制提供了一種“消息傳遞”的范式可以徹底避免顯式的共享內(nèi)存。// 創(chuàng)建一個深度為10的隊(duì)列用于傳遞 uint32_t 數(shù)據(jù) QueueHandle_t xDataQueue xQueueCreate(10, sizeof(uint32_t)); // 任務(wù)A生產(chǎn)者發(fā)送數(shù)據(jù)到隊(duì)列 uint32_t data_to_send read_sensor(); if (xQueueSend(xDataQueue, data_to_send, pdMS_TO_TICKS(10)) ! pdPASS) { // 發(fā)送失敗隊(duì)列滿處理錯誤 } // 任務(wù)B消費(fèi)者從隊(duì)列接收數(shù)據(jù) uint32_t received_data; if (xQueueReceive(xDataQueue, received_data, pdMS_TO_TICKS(20)) pdPASS) { process_data(received_data); // 安全地處理數(shù)據(jù) }優(yōu)點(diǎn)天生線程安全隊(duì)列內(nèi)部實(shí)現(xiàn)了互斥發(fā)送和接收操作本身就是安全的。解耦生產(chǎn)與消費(fèi)生產(chǎn)者不需要知道消費(fèi)者是誰、何時處理數(shù)據(jù)。消費(fèi)者按自己的節(jié)奏處理。緩沖作用隊(duì)列深度可以平滑生產(chǎn)速度和消費(fèi)速度的差異。缺點(diǎn)需要額外的內(nèi)存開銷來存儲隊(duì)列項(xiàng)和隊(duì)列結(jié)構(gòu)體。數(shù)據(jù)傳遞有拷貝開銷對于大結(jié)構(gòu)體可以傳遞指針但指針指向的內(nèi)容又需要保護(hù)回到原點(diǎn)。使用準(zhǔn)則當(dāng)任務(wù)間是“生產(chǎn)者-消費(fèi)者”模型時隊(duì)列是最優(yōu)雅、最安全的解決方案。它用通信代替了共享是RTOS設(shè)計的推薦模式之一。5. 實(shí)戰(zhàn)排坑那些年我踩過的信號量與全局變量的“坑”理論說再多不如踩一次坑記得牢。下面分享幾個我實(shí)際項(xiàng)目中遇到的典型問題及其排查思路。5.1 坑一在臨界區(qū)內(nèi)調(diào)用阻塞API導(dǎo)致死鎖這是我早期犯的一個錯誤。當(dāng)時有一個共享的SPI總線資源用互斥量xSPIMutex保護(hù)。任務(wù)A獲取了SPI互斥量開始傳輸一長幀數(shù)據(jù)。在傳輸函數(shù)內(nèi)部我調(diào)用了vTaskDelay()來等待硬件響應(yīng)這是一個糟糕的設(shè)計應(yīng)該用中斷或DMA。此時任務(wù)A被掛起但互斥量沒有釋放。高優(yōu)先級任務(wù)B也需要SPI它嘗試獲取xSPIMutex被阻塞。更糟的是任務(wù)B阻塞后一個中優(yōu)先級任務(wù)C開始運(yùn)行它不依賴SPI但一直占著CPU。結(jié)果就是任務(wù)A無法醒來釋放鎖任務(wù)B永遠(yuǎn)等不到鎖系統(tǒng)部分功能死鎖。排查過程現(xiàn)象UART輸出日志突然停止但看門狗沒有復(fù)位說明任務(wù)調(diào)度還在運(yùn)行。工具使用FreeRTOS的uxTaskGetSystemState()或像Segger SystemView這樣的追蹤工具查看所有任務(wù)的狀態(tài)。發(fā)現(xiàn)任務(wù)B狀態(tài)為eBlocked阻塞阻塞對象是xSPIMutex。任務(wù)A狀態(tài)為eSuspended掛起或eReady就緒但沒運(yùn)行。分析任務(wù)A就緒卻無法運(yùn)行說明有同優(yōu)先級或更高優(yōu)先級任務(wù)在跑。查看發(fā)現(xiàn)是中優(yōu)先級任務(wù)C在空轉(zhuǎn)。檢查任務(wù)A的代碼發(fā)現(xiàn)在SPI操作函數(shù)里找到了vTaskDelay()。解決重構(gòu)SPI驅(qū)動將vTaskDelay()改為基于信號量或事件標(biāo)志組的異步等待方式。確保在持有互斥量期間絕不調(diào)用任何可能引起任務(wù)切換的API。教訓(xùn)互斥量保護(hù)的臨界區(qū)必須保持“短平快”只包含對共享資源的最小必要操作像沙漠中的水源一樣珍貴取用后立即離開。5.2 坑二忘記釋放互斥量資源泄漏這個錯誤很初級但后果嚴(yán)重。在某個錯誤處理分支中我直接return了忘記了調(diào)用xSemaphoreGive()。if (xSemaphoreTake(xMutex, 100) pdTRUE) { if (some_error_condition) { LOG_ERROR(Something wrong!); return; // 災(zāi)難互斥量被永遠(yuǎn)鎖住了 } // 正常操作... xSemaphoreGive(xMutex); // 正常釋放 }下一次任何任務(wù)嘗試獲取這個互斥量時都會超時失敗相關(guān)功能全部癱瘓。排查與預(yù)防排查同樣使用RTOS分析工具查看該互斥量的持有者。如果發(fā)現(xiàn)一個互斥量被某個任務(wù)長期持有而該任務(wù)已經(jīng)不在相關(guān)函數(shù)中執(zhí)行基本可以確定是資源未釋放。預(yù)防使用“獲取-釋放”對在代碼結(jié)構(gòu)上讓Take和Give盡可能成對出現(xiàn)減少中間出口。利用編程語言特性如果使用C可以使用RAII資源獲取即初始化技術(shù)構(gòu)造一個鎖守衛(wèi)對象在析構(gòu)時自動釋放鎖。在C語言中模擬可以使用宏或固定的代碼模式#define TAKE_MUTEX(mutex, timeout) \ if (xSemaphoreTake((mutex), (timeout)) pdTRUE) // 注意這里沒有分號 // 使用方式 TAKE_MUTEX(xMutex, portMAX_DELAY) { // 臨界區(qū)代碼 } // 這里編譯器會報錯提示需要分號提醒你忘記寫 Give xSemaphoreGive(xMutex); // 必須手動配對這個Give更好的方法是養(yǎng)成在函數(shù)開頭獲取在函數(shù)所有退出路徑return, break, error label都釋放的習(xí)慣并仔細(xì)檢查。5.3 坑三錯誤地在ISR中Give互斥量中斷服務(wù)程序中不能使用xSemaphoreGive()而必須使用xSemaphoreGiveFromISR()并且要處理可能需要的上下文切換。// 錯誤 void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE)) { xSemaphoreGive(xUartRxSem); // 錯誤不能在ISR中用這個 // ... } } // 正確 void USART1_IRQHandler(void) { BaseType_t xHigherPriorityTaskWoken pdFALSE; if (USART_GetITStatus(USART1, USART_IT_RXNE)) { xSemaphoreGiveFromISR(xUartRxSem, xHigherPriorityTaskWoken); // ... } portYIELD_FROM_ISR(xHigherPriorityTaskWoken); // 如果需要進(jìn)行上下文切換 }如果錯誤地在ISR中使用了任務(wù)級的API在有些FreeRTOS端口上可能會導(dǎo)致內(nèi)存損壞或立即崩潰因?yàn)镮SR和任務(wù)使用的堆棧和上下文不同。排查這類問題通常在測試階段就會暴露出來表現(xiàn)為系統(tǒng)進(jìn)入HardFault或行為異常。檢查所有在ISR中使用的RTOS API確保它們都帶有FromISR后綴。5.4 坑四信號量用作互斥量時的優(yōu)先級反轉(zhuǎn)死鎖這是我用二值信號量保護(hù)一個共享配置結(jié)構(gòu)體時遇到的。任務(wù)L低優(yōu)先級持有信號量任務(wù)H高優(yōu)先級等待該信號量。此時任務(wù)M中優(yōu)先級開始運(yùn)行一個無關(guān)但耗時的循環(huán)。由于二值信號量沒有優(yōu)先級繼承任務(wù)L被任務(wù)M搶占無法運(yùn)行也就無法釋放信號量。任務(wù)H雖然優(yōu)先級高但只能無限期等待。從外部看高優(yōu)先級任務(wù)“卡住”了系統(tǒng)響應(yīng)變慢。排查現(xiàn)象高優(yōu)先級任務(wù)如用戶界面響應(yīng)周期性卡頓。分析使用Trace工具觀察任務(wù)狀態(tài)切換。發(fā)現(xiàn)當(dāng)卡頓時任務(wù)H處于阻塞狀態(tài)等待信號量任務(wù)L處于就緒狀態(tài)但未運(yùn)行任務(wù)M正在運(yùn)行。定位檢查任務(wù)H和任務(wù)L阻塞在哪個信號量上。發(fā)現(xiàn)是一個二值信號量。解決將二值信號量替換為互斥量Mutex。重新測試優(yōu)先級反轉(zhuǎn)問題消失。因?yàn)楫?dāng)H等待L持有的互斥量時系統(tǒng)會臨時提升L的優(yōu)先級使其能盡快執(zhí)行釋放資源。這個坑讓我深刻理解了二值信號量與互斥量的本質(zhì)區(qū)別從此在需要互斥的場景下再無腦使用互斥量。6. 設(shè)計模式與最佳實(shí)踐總結(jié)經(jīng)過這么多項(xiàng)目和坑的洗禮我總結(jié)出一些在FreeRTOS中處理全局變量和信號量的最佳實(shí)踐它們能幫你從設(shè)計上規(guī)避大部分問題原則盡可能減少全局變量能用局部變量就用局部變量通過函數(shù)參數(shù)傳遞。能用隊(duì)列傳遞數(shù)據(jù)就不要用全局變量共享。隊(duì)列是RTOS中更安全、更解耦的通信方式。如果必須共享將其作用域限制在最小范圍如用static限制在單個C文件內(nèi)通過Getter/Setter函數(shù)訪問。選擇正確的保護(hù)工具簡單的整型標(biāo)志/計數(shù)器- 優(yōu)先考慮原子操作(stdatomic.h)。任務(wù)間共享的復(fù)雜數(shù)據(jù)/資源- 使用互斥量Mutex。ISR向任務(wù)通知事件- 使用二值信號量或任務(wù)通知更輕量。保護(hù)極短的、且ISR也會訪問的代碼段- 謹(jǐn)慎使用關(guān)中斷并精確計算時間。避免使用volatile做線程同步它只應(yīng)用于硬件寄存器映射。互斥量使用鐵律誰Take誰Give保持嚴(yán)格的配對。臨界區(qū)要短只包含對共享資源的核心操作。禁止在臨界區(qū)內(nèi)調(diào)用阻塞函數(shù)如vTaskDelay,xQueueReceive, 等待其他信號量等??偸窃O(shè)置超時不要用portMAX_DELAY給系統(tǒng)一個恢復(fù)的機(jī)會??紤]優(yōu)先級繼承默認(rèn)使用互斥量而不是二值信號量來保護(hù)資源。良好的編程習(xí)慣為共享資源設(shè)計清晰的訪問接口集中在一個模塊中管理提供加鎖/解鎖的API。使用斷言Assert在調(diào)試版本中可以在Take/Give前后加入斷言檢查資源狀態(tài)。進(jìn)行壓力測試在高負(fù)載、多任務(wù)頻繁切換的場景下測試同步機(jī)制的正確性。利用調(diào)試工具熟練使用FreeRTOS的跟蹤、狀態(tài)查看功能和像SystemView、Tracealyzer這樣的專業(yè)工具它們能在問題發(fā)生時給你清晰的視圖。回到文章開頭那個傳感器數(shù)據(jù)漂移的問題我的最終解決方案是將二值信號量最初錯誤地用于同步替換為互斥量用于保護(hù)g_sensor_raw_value的讀寫。同時我評估了數(shù)據(jù)訪問頻率發(fā)現(xiàn)并不高互斥量的開銷完全可以接受。修改后系統(tǒng)運(yùn)行了72小時壓力測試未再出現(xiàn)一次數(shù)據(jù)錯誤。嵌入式RTOS編程尤其是涉及多任務(wù)同步時細(xì)節(jié)決定成敗。全局變量和信號量是強(qiáng)大的工具但也是雙刃劍。理解其背后的機(jī)制遵循最佳實(shí)踐才能構(gòu)建出既穩(wěn)定又高效的實(shí)時系統(tǒng)。希望我的這些經(jīng)驗(yàn)和教訓(xùn)能讓你在下次遇到類似的“幽靈”問題時能夠快速定位游刃有余。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
五月婷婷六月丁香激情| 丁香五月性爱| 激情五月,色五月| 成人做爰A片免费看视频| 五月四色婷婷| av网址在线| 色播播五月天| 夜夜资源站| 欧美精品久久久久久视频观看| 五月婷婷欧洲| 五月天社区| 人人噜天天上| 五月色 亚洲| 五月婷婷色色网址| 中文字幕一色哟哟哟哟| 人人爱人人草| 伊人色综在线| 天天成人五月天| 中文字幕欧美久久| 九九99偷拍视频| 色色五月丁香| 丁香五月婷婷五月天| 婷婷激情丁香五月婷婷激情丁香五月婷婷| 懂色av蜜臀av粉嫩av永陈冠希| 婷婷五月天视频| 99色免费视频| 色婷婷综合网站| 色婷婷久久久| 黄色成人网站在线播放| 欧洲综合视频在线观看。欧洲,亚洲综合食品在线观看。 | 国产乱子轮XXX农村| 激情婷婷丁香| 色久天| 亚洲五月天综合色| 久久激情网| 综合精品99| 这里只有精品久久| 人人操AV| 久99| 超碰碰碰碰| 人人爽欧美婷婷久久久五月丁香| www,婷婷五月天,com| 中美日韩成人在线| 五月天婷婷操逼视频| 五月天天综合网色婷婷| 久久精99| 亚洲色五月婷婷| 丁香五月五月婷婷欧美大香蕉| 天天综合在线网| 婷婷五月草| 色色丁香五月婷婷| 婷婷一本和五月丁香| 色五月激情视频在线综合| 伊人热婷婷| 丁香五月婷婷av影院| 久99| 日本婷久久| 久久这里都是精品| 九九这里是免费的视频5| 开心五月深爱五月丁香五月激情五月 | 欧美日本国产欧美日本韩国99| 天天肏视频| 免看黄大片AA | 久久女婷| 97在线观视频免费观看| 7777国产盗摄农村女人| 天堂久久大香蕉| 婷色天堂| 97碰碰人人视频| 亚洲AV久久久久久久久久久久久久久久 | www.五月丁香av| 五月情丁香色| 超碰在线人人| www.av视频xx999.com| 五月天婷婷久久| www.婷婷六月天| 久操福利| 99在线免费视| 亚洲色亚洲精品| 人妻久久久久久久久久| 91se在线观看| 亚洲天堂色色| 久久加勤综合| 99久久久久久www| 丁香五月大香蕉AV| 色婷婷狠狠爱| 婷婷丁香五月激情图片| 激情五月天网页| 色五月婷婷在线视频| 色五月丁香激情| 夜夜爽天天干| 97色色色| 一级AV片| 成人短视频免费| 婷婷丁香www视频日本韩国| 极品少妇婷婷五月| 91精品婷婷国产综合久久| 久久综合性| 97人人干| 五月天激情av| 99热这里只有精品1| 五月天成人综合| 日本欧美成人片AAAA | 91九色中文字幕女在线观看| 亚洲午夜av| 蜜桃五月天| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 在线天堂9| 久久婷婷五月天懂色| 婷婷91| 中文幕无线码中文字蜜桃| 天天色中文字幕女优AV| 九月影院義母在线播放| 婷婷丁香五月激情中文字幕版| 激情综合五月色丁香婷婷| 亚洲天码视频www蛋播视频| 午夜九九九九九九九九九九九九九| 夜夜夜夜夜操| 色婷亚洲| 亚洲av骚货| 亚洲色久| 丁香 久久| 五月婷婷五月丁香综合| 99国产精品久久久久久久久久久| 99久久国产宗和精品1上映| 激情五月丁香五月色| 久久九九亚洲| 九九这里只这里只有精品| 丁香丝袜五月| 超碰精品在线| 狠狠色噜噜狠狠| 视频综合网| 丁香九月婷婷色| 91九色无码日韩| 久热免费视频| 97人人操人人爽| 色天天综合成人网| 亚洲无码色| 性爱五月婷| 色五月激情问网站| 色婷网| 1024AV视频| 97在线碰| 色五月涩涩婷婷| 少妇真实被内射视频三四区| 久久香蕉网| 深爱五月日韩| 性欧美大战久久久久久久83| 久久久亚洲精品一区二区三区浴池 | 任你干线上免费视频有3吗| 色色丁香| 大香蕉五月婷婷| 九久久婷婷| 婷婷五月av| 六月丁香五月天| 无码人妻少妇色欲AV一区二区| 991精品在线视频| 五月婷婷激情四月| 国产成人AV| 五月婷婷av| 亚洲va在线∨a天堂va欧美va| 91久久久久久| 六月婷婷五月丁香首页| 色婷视频| www.99热| 中文AV网站| 超碰在线99热| 色天堂A| 视频一区二区在线| 日韩欧美骚货| 日韩久久日| 开心五月婷婷激情网| 久久婷婷六月综合资源| 婷婷五月天久久| 中文字幕人妻一区二区| 操一操插一插| 婷婷五月五月丁香| 五月丁香花婷婷玉莉AV| 婷婷九月丁香中文| 五月丁香六月婷婷综合网站| 色色色五月天激情资源| 丁香色五月婷婷| 婷婷丁香六月天激情四射网| 天天天操天天天日| 色99超碰| 99.N在线视频| 成人在线网| 熟女网站久久| 五月天丁香六月综合| 激情性爱五月| 99天堂网| 人妻久久久| 成人婷婷桔色| 丁香五月激情图片婷婷| 日日爽日日| 97干在线免费| 久久丁香久久| 日日操日日撸| WWW丁香五月| 国产精品成人在线| 人人干AV| 无码 色| 六月丁香网| 激情文学 综合 色| 成人无码精品1区2区3区免费看| 婷久看人爽| 激情网五月天| 99成人免费热视频| 久久久久亚洲AV无码网影音先锋| 天天做夜夜爽| 伊人狠狠狠综合| 91se视频| 成人在线综合| 五月天婷婷六月| 丁香网五月天| 丁香五月六月激情| 99热九九在线| 日日夜夜干| 亚洲精99| 国产亚洲99久久精品熟女| 五月激情综| 色五月婷婷激情基地| 婷婷久久五月天| 色婷婷www| 五月婷婷亚洲天堂激情在线| 狠狠色婷婷色| 99re这里| 亚洲a色| 婷婷99狠| 五月丁香六月激情欧美综合| 亚洲精色| 97操碰| 国产无遮挡又黄又爽免费网站| 天天成人丁香美女AV| 最新日韩久热免费视频看看| 99热这里全是精品| 夜夜撸日日骑| 婷婷色色五月| 色婷婷激情视频| 伊人激情综合网| 超碰AV在线| 成人做爰高潮A片免费视频| 婷婷五月丁香手机在线视频| 五月花婷婷在线精品视频| 黄色AAAA韩国guochansanji| 五月婷婷,六月丁香| 成人网丁香五月| 婷婷五月,偷窥偷拍网| 激情五月婷婷视频一区二区三区| 狠狠草在线观看| 91chinese在线| 五月婷婷影视| 五月天中文字幕在线婷婷| 亚洲国产网站| 亚洲成av人影院| 黄色一级影片| 久久人妻伊人| 五月色丁香成人| Www.狠狠| 97碰 在线视频观看| 午夜丁香| 丁香婷婷色情| 亚洲人成人五月天| 九九免费精品在线视频| 久热一本| 91精品又长又大又粗又爽又猛| 亚洲激情AV| 色五月激情综合| www·五月天| 99久久婷婷国产综合| 色欲色香综合网站| 91婷婷视频| 色五月天综合网| 99色网站| 欧美丁香婷婷五月天| 99久久99热| 日本九九网| 人妻日日日| 色婷婷大香蕉| 99这里有精品久久97| 被强行糟蹋的女人A片| 蜜臀99精品| 日本成人噜噜| 99视频精品全部免费 在线| 丁香六月啪| 超碰京东热av男人的天堂| 色综合色色| 久久婷婷综合基地| 99热爱爱干干日| 99热99热在线| 五月婷婷婷婷网| 少妇口诉沐足视频播放器网址| 日本黄色精品| 热996精品在线观看| 国产精品色情AAAAA片软件| 丁香五月成人| 超碰人人在线| 中字幕视频在线永久在线观看免费| 夜夜 操无码| 综合久久99| 少妇人妻综合色6699| 南京搡BBBB搡BBBB| 99 这里只有精品| 精品视频这里只有精品| 五月天六月丁香| 最近免费中文字幕大全高清大全1| www.色婷婷| 99九九99九九九视频精彩| 伊人婷婷色激情丁香| 五月深爱婷婷| 91人妻视频| www.狠狠操.con| site:minyis.com| 日日骑夜夜撸| 婷婷 激情 五月| 色色色色色色色综合| 五月久久噜噜| 狠狠干思思热| 婷婷干| 伊人婷婷99热精品| 国产精品电| 五月婷婷丁香| 亚洲成人在线在线| 青青草婷婷久久| 殴美97色| 亚洲婷婷久久综合| 色狠狠色| 97色五月天| 丰满人妻一区三区三区| 久久五月丁香六月婷| 欧美婷婷五月激情| .肏屄视频一区二区| 五月天大香蕉视频| 五月丁香色| 99天堂网最新| 国产67194| www.色99| 天天干天天操天天干天天操天天干天天操| 婷婷六月视频| 欧美色色色色色| 玖玖婷婷色五月| 丁香六月啪啪啪| 九九色综合| 91碰碰碰| 青青草99热久久精品国| 97天堂| www..com色爱| 99热这里只有精品在线观看| 五月天另类小说| 青草视频在线观看视频| OUMEIRIHANCHENGREN| 色情五月婷| 深爱婷婷基地| 五月五婷婷| 日韩99视频| 性生活视频98791| 开心五月深爱五月| av五月丁香婷婷网| 五月婷婷在线视频免费观看| 香蕉久久六月| 色青青视频| 亚洲五月色| 欧美 日韩 成人 在线| 99热这里都是精品| 在线看av| 五月天婷婷丁香蜜桃91| 啪啪操超碰| 日本狠狠干| 一区二区三区四区牛| 丁香五月天啪啪| 六月丁香婷婷开心综合基地| 九九综合伊人| 五月做爱| 亚洲丁香五月天在线视频| 六月丁香社区| 国产欧美熟妇另类久久久| 殴美97色| 极品 少妇 内射| 成人在线日韩欧美| 婷婷五月丁香综合亚洲| 五月天婷基地| 婷婷五月天网址| 色呦精品| 丁香六月婷婷综合激情欧美 | 天堂草在线观看| 99爱这里只有精品免费视频| 91久久免费| 五月美女婷婷风骚| 丁香午月AV中文字幕| 99热a片免| 九九激情网| 大伊香蕉玖玖爱| 丁香六月激情综合| 激情九色| 91无码一起草| 日韩黄黄| 狠狠爱综合| 婷婷六月久久| 国产日日操夜夜操的肉棒视频| 丁香六月啪| 色婷婷久久7777| 五月天色婷婷小说| 丁香九月激情| 我爱大香蕉| 日日干天天| 久久婷综| 欧美丁香五月天| 丁香五月婷婷网| 超碰人人干| www.丁香六月婷婷久久天堂影院.con| 99色色爰| 人妻人人操| 天天综合91入口| 狠狠色噜噜狠狠亚洲A∨| 久久精品在线| 九九在线这里只有精品视频 | av免费人人| 成人做爰A片免费看视频| 色五月色五天色情网| 激情五月天电影| www.lchjjc.com| 五月激情综合婷婷| 嫩草AV久久伊人妇女超级A| 天堂爱爱| 精品夜夜澡人妻无码AV| 日韩AAA| 五月婷婷激情综合| 天天舔天天摸天天射| 99热都是精品| 日韩砖区| 免费看欧美成人A片无码| 777丁香六月青青草婷婷综合久月| www,99色| 婷婷亚洲欧美丁香五月| 久久久久久久,99精品视频| 九九爱看亚洲| 五月激情综合婷婷| 激情五月天激情小说| ai97re99一本| 狠狠操狠狠操| 91婷色| 91九色国产在线| 人人性久久| AV操逼网| 99热免费精品热久久66| 开心五月色婷婷综合开心网| 丁香五月成人在线| 1024在线视频| 日韩欧美成人片| 丁香五月久久| 涩涩五月天| 99热日本| 91精品综合久久久五月天| 日欧大屏操| 9热精品| 色五月丁香五月| 成人深爱丁香五月| 色爱爱综合网| 五月丁香啪啪综合| 九热在线这里有精品6| 日本人人超碰| 日本狠狠干| 大香蕉九操| 久久婷婷亚洲| 激情深爱五月| 操久久网| 蜜臀久久99精品久久久久久酒店| 五月婷婷亚洲| 激情视频婷婷五月花| www久久久| 国产熟妇乱子伦hd| 亚洲婷婷五月天激情| 精品爆操| 六月激情网| 五月停亭六月,六月停亭的英语| 成人色五月天| 色色婷婷丁香| www.minyis.com【JT】国内CDN落地页保证转化QQ2101460746 | 色色色免费视频| 五月婷成人网| 淫视馆av三区| 久久九区| 五月天激情视频网站| 91视频久久久| 国外亚洲成AV人片在线观看| 久久这里只有精品热在99| 久久新地址| 日逼免费视频 | 亚洲免费电影2| 成人在线视频网| 深爱激情网婷婷| 牛牛色av| 国产欧美精品AAAAAA片| 婷婷五月色综合| 日本五月婷婷久久久六月丁香| 操比激情五月| 91丨九色丨熟女高潮| 五月天俺去也| 夜夜操夜夜爽| 亚洲色图五月丁香| YW无码| 五月婷婷婷婷| 激情网婷婷五月天| 亚洲婷婷丁香五月视频| 激情综合五月天| 99精品视频播放| 激情综合网五月婷婷| 久久婷婷五月天蜜桃| 久久激情五月| 79精品视频在线观看,| 五月天丁香花婷婷| 国产精品久久久久久久久久免费| 国产免费一区二区三区三州老师F1F1.CC| 色婷婷五月丁香在线观看| 超碰伊人碰婷婷五月| 欧美私人家庭影院| 亚洲色频| 色色色婷婷五月天| 五月婷婷天天| 天天干天天叉| 婷婷涩涩网| 激情五月丁香社区| 五月狠狠| 五月丁香婷婷伊人日韩| 久99久视频| 99热色精品| www.minyis.com【JT】币址百万U预算可预付QQ2101460746 | 99re思思热久久| 丁香五月亚综合图片| 婷婷五月色播网| 五月天婷婷久草丁香| 三级毛片视频| AA片在线观看视频在线播放| 五月香婷婷| 五月丁香爱婷婷深深| 开心五月婷婷在线| 天天色爽| 97九色| 秋霞丝袜啪啪啪| 91碰操| 天天色播| 色偷偷综合| 亚洲成人在线免费| 日日噜噜夜夜狠狠久久丁香六月| 色99色| 午夜丁香婷婷| 五月天网站亭亭| 婷婷五月天综合色| 人人舔人人色人人高潮| 思思热99er在线视频| 免费黄色片子| 天天搞夜夜爽夜夜爽| 男女99免费视频| 涩 五月 婷婷 狠狠| 六月丁香AV| 色婷婷精品视频| 伊人啪啪网| 亚艹艹| 六月丁香影院| 俺去也五月天| 成人五月天丁香婷| 综合婷婷| 99免费视频| 疯狂做受XXXX高潮A片动画| 极品人妻VIDEOSSS人妻| 激情五月丁香五月综合| 久久精品一区二区三区四区| 日韩在线观看网址| 婷婷五月丁香激情图片| 4438成人电影| 99久久99九九99九九九| 久久婷婷成人视频| 狠狠干激情五月| 婷婷五月天男人影院色色网| 涩涩涩五月天| 欧美在线操| AV操操操| 超碰在线观看三级片| 丁香五月停停av| 99久久.www| 欧美日韩成人免费在线| 伊人婷婷青青cao| 狠狠人人| 久久人妻伊人| 亚洲成人网在线观看| 国产成人亚洲综合A∨婷婷| 97精品人人A片免费看| 五月婷久久久久综合| 日韩AV在线免费| 国产.亚洲.欧洲视频在线| 超碰在线成人| 丁香激情六月天婷婷| 婷婷亚洲色| 97色97干| 成 人片 黄 色 大 片| 日韩国产AV播放| 五月天婷婷基地综合网| 激情影院内射| 色婷婷色99国产综合精品| 免费AV播放| AA片在线观看视频在线播放| 91日综合欧美| 色九九综合热99| 888精品福利地址| av五月天婷婷丁香| 99热在线只有精品| 人人操av| 97人人射| 91在线操| 五月天另类小说亚洲| 日本www五月婷婷| 亚洲五月天激情| 色屌丝中文字幕| 超碰97色| 另类综合激情| 色色激情五月| 婷婷五月天A V| 天堂伊人干| 亚洲综合五月天| 亚洲AV日韩在线观看| 婷婷综合精品| 婷婷五月天无码熟女| 五月天久久91| 婷婷深爱五月| 性爱激情小说AV五月丁香花| 婷婷五月天AV激情| 爱久综合| 色综合久久无码| 夜夜涩涩涩| 伊人玖玖婷婷| 日韩人妻在线播放| 26uuu国产色| 五月天婷婷综合网| 婷婷丁香六月天| 99久久综合| 五月丁香婷婷基地| 9视频在线成人网站| 99热九九这里只有精品| 丁香五月色| 97亚洲视频在线| 五月天激情黄色小说在线观看| 六月丁AV| 中文字幕无码AV| 婷婷永久在线| 丁香五月先锋| 丁香久久激情俄| 色五月丁香婷婷综合| 午夜免费试看| 91九色在线视频| 人人看人人要| 亚洲成av人影院| 欧美日本黄色| 99九九在线视频| 天天操天天操天天操天天操天天操| 亚洲第一av| 色五月婷婷啪啪五月| 五月丁香啪啪啪| 99热这里只有精| 色五月激情| 深爱开心激情| 丁香婷婷久| 天天干天天干天天干天天干天天| 亚洲综合五月天| 丁香五月婷婷激情小说| 五月激情在线| 五月天堂色色| 婷婷播5月| 九九久久玖玖爱| 亚洲99视频| 被男人添B超爽视频| 淫视馆AV在线| 亚洲最大在线| 亚洲激情四射| 婷婷五月天亚洲| 日韩啪啪网| 激情av| 久久99久久99精品免视看婷| 九九99免费理论| 日韩99视频| 丁香五月综合激情性爱| 国产97色在线| 九九久久五月天| 91操人视频| 五月丁香色情| 色婷丁香五月| JAPANRCEP老熟妇乱子伦视频| 人妻系列久久久久久久久久久| 操人91| 五月熟妇婷婷久久| 伊人久久大香线蕉精品| 99热这里只有在线| 狠狠干在线| 丁香婷婷九月| 久久黄A片| 久久久久婷婷| 亚洲一区二区无码蜜乳av| 无码字幕中文| 欧美va欧美va差| Www,五月天| 丁香五月成人自拍| 五月婷婷真爱激情网| 97成人超碰免| www婷婷| 五月丁色AV| 久久综合九色综合97婷婷| 欧美精品熟女一区二区| 欧美操逼天堂| 99er国产| 中文字幕成人版| 天天人人人人人人人人人人人| 激情综合网五月丁香| 日本操碰碰| 99热思思久| 欧美情色电影一区二区| 色综合色色| www.色婷婷| 99国产在线精品视频| 直接看的AV| 99热婷婷| 日本三级第一页| 激情综合在线观看| 丁香综合伊人AV| 日韩婷久| 九九aV| 狠狠狠夜夜夜| 色一情一乱一乱一区91| A片试看120分钟做受图片| 精品乱码久久久久| 激情啪啪五月天| 久久天堂女人| 激情开心五月天| 五月天综合影院| 色婷婷电影网| 亚洲啪啪自拍| 996er热| 色屌丝中文字幕| 亚欧州精品视频| 性生生活大片又黄又| 中文字幕激情综合| 五月天婷爱综合| 婷婷综合色图| 青吴乐视频| 99视频在线精品| 激情婷婷五月社区| 激情综合网婷婷久久| 天堂综合久久| 五月丁香六月片| 99熟女啪啪视频| 日韩精品色| 99超级碰免费视频| 六月丁香成人| 久久99国产综合精品免费 | 婷婷丁香五月综合网上| 久久婷婷五月国产激情综合片| 亲子乱av一区二区三区的| 久久久18| 久色网址| 五月婷婷综合视频| 99热这里精| 草综合网| 婷婷香蕉视频| 精品国产AV色一区二区深夜久久| 性爱综合网| 婷婷激情六月| 射久久丁香五月| www.五月婷婷.com| 婷婷综合九月| 九 九九九AV| 青柠影视免费高清电视剧| 丁香六月啪啪| 99精品热视频| 狠狠摸狠狠摸| 天天操狠狠操| 99re热久久| 色色99色色| www.五月天婷婷| 奇米四色五月天| 91妻人人爽人人看片| 操碰97| 五月天久久婷婷| 99爽视频| 日本一毛片| 六月婷婷开心| 九九热只有精品| 这里只有九九精品| 婷婷中文字幕版| 激情精品久久| 性爱动图国产麻豆一区二区三区 | 综合网五月天123| 开心婷婷五月花| 综合五月草| 婷婷视频网| 99热欧美精品| 99综合五月免费视频色婷婷| 涩涩五月天| xfplayav在线| 99久久综合网| 国产美女最新VA在线免费观看| 五月婷婷开心色伊人| 亚洲激情无码久久| 另类综合激情| 色综合日日| 五月丁香啪啪综合| www999日韩精品| 99热久| 色丁香五月婷婷| 99热这里有精品| 亚洲av综合在线| 婷婷五月丁香综合桃花色网| 久久婷五月综合| 九九久久精品| 五月丁香激情综合啪| 七七九九色色| 五月婷婷久久爱| 九热视频这里只有精品| 国产色99| 婷婷欧美| 丁香大香蕉| 国产色色视频| 国产欧美精品AAAAAA片| 五月天丁香婷婷视频网址| 五月丁香婷婷激情图片| 久久嘟嘟丁香| 99ri在线观看视频| 狠狠色五月激情| 狠狠搞综合色| 色婷婷六月丁香综合欲精品| 激情99| 五月丁香啪啪网| 97干欧美| 丰满老熟妇BBBBB搡BBB| 丁香婷婷综合影院| 九色七七| 久鲁鲁色网| 99热这里只有精品2024| 综合网天天| 亚洲高清在线| 色99色| 精品久9| 色婷婷啪啪啪啪啪啪| a九九热www| 天天爱天天日| 视频色色色色色色| 伊人干综合| 五月色情| 婷婷五月永远18免费久久久| 五月婷深深爱激情网| 亚洲av成人在线| 天天搞夜夜六| 色综合另类| 啪啪综合网| 激情综合另类| 免费精品66| 夜夜操狠狠操| 夜夜嗨一区二区三区直播内容 | 五月综合激情婷婷六月色窝| www.AV在线| 色婷婷成人影片| 国产性爱一级| 人妻第九页| 色久九| 色情开心五月| 在线综合婷婷| 欧美性爱五月天| 精品热青草| 九九热只有精品6| 五月天综合久久| 丰满少妇猛烈A片免费看观看| 五月久久婷婷丁香| 欧美3AaAa大片| 婷婷综合激情| 成人美女网| 四月婷婷五月色综合| 丰满人妻一区三区三区| 九热视频| 免费成人网在线观看| 婷婷五月丁香婷婷| 四虎成人精品永久免费AV九九| 久久综合九色综合88i| 人人色性网| 99九九在线精品热动漫| 96色婷婷| 丁香六月色情| 精品人妻伦一二三区久| 五月丁香色停停啪啪啪| 丁香婷婷五月天亚洲| 91操熟女| 色综合久网| 操逼棍操逼| 99性爱视频| 色玖玖综合网| 天天综合影院| 伊人激情AV一区二区三区| 五月婷婷综合激情网| 色久天| 丁香婷婷影院| 色小说婷婷五月天天天| 色婷婷六月| 婷婷五月天久久| 色婷婷成人五月| 久久大国产香蕉| 九九综合精品| 思思99精品视频在线观看| 色播六月| 精品成人在线观看| 色综合九九色综合88| 97操男人的天堂| 国产午夜精品久久久观看| 欧美成人AAA片一区国产精品| 嫩草AV久久伊人妇女超级A| 色五月六月| 成人无码免费一区二区中文| 少妇久久诱惑视频| 婷色五月| 操操操av| 五月激情综合网| 综合激情开心五月| 五月激情啪啪| 五月婷婷在线视频免费观看| 99色色网| 色婷婷综合网| 夜夜谢天天干| 精品一二三区视频立| A久久| 久久综合热17c| 亚洲黄色影视| 丁香伊人激情| 国产99热| 婷婷在线五月天观看| 欧美性做爰大片免费看办公室| 俺来也综合网精品一区| 日本狠狠色| 99这里都是精品| 久草久青福利| 中国女人做爰A片| 色综合五月婷婷狠狠干| 色五月,com| 婷婷五月丁综合| 五月婷婷丁香综合,亚洲天堂| 色婷婷九月| 成人VAV视频在线观看| 九九色图| 婷婷月综合| 国产在这里只有精品| 久久66er久久| 国产真实乱对白精彩| 五月天婷婷青青草| 日韩久久日| 99无码| 97干网站| 丁香六月婷婷| 久久99美女精彩视频| 91日婷婷在线| 123草逼网| 九九色影院| 成人无码精品1区2区3区免费看| 五月丁香婷婷激激激综合网色播| 伊人在线大香蕉网| 天天操婷婷| 天天日天天做天天舔| 成人.在线日韩| 丁香六月婷婷综合缴| 中文色婷婷| 少妇被躁爽到高潮无码文| 婷婷五月丁香图片人人操| 久8色色| 97干视频在线| 欧美黄色AA片哗啦啦啦| 在线观看玖玖资源免费观看| 男人的天堂av俄罗斯热| 碰97久久| www.久久五月天.com| www.夜夜爱.com| 婷婷久热| 精品怡红九九九| 天天综合网~91| 大香网伊人久久综合| 五月丁香婷婷人体| 亚洲AV网站在线观看| 99热国品| 日本色婷婷| 天天摸天天爽| 国产精品丝| 天天干,天天日| 五月婷婷婷婷网| 69精品人人人人人人| 色色a| 丁香六月婷婷综合啪啪| 婷婷激情综合| 最熟少妇乱码| 五月丁香婷婷综合| 九九久久网| 26UUU成人网| 99在线一区| 婷婷五月天影院| 99综合自拍| 色综合久久88色综合天天人守婷| 成人网站av免费网站推荐| 成人午夜视频精品一区| 色婷婷综合影院| 伊人五月人妻精品| 欧洲毛片基地c区| 国产日产成人亚洲欧美国产VA| 丁香激情网| 五月丁香激情综合| 精品一区二区三区四区五区六区介绍| 欧美啪啪五月天| 超碰在线成人| 久久婷婷五月综合激情国产 | 色婷五月天| 色婷婷视频综合| 婷婷五月天天天日日夜夜| 激情文学 综合 九月| 精品一二三区久久AAA片| 久久与婷婷| 色色色欧美色色| 久久久久久久综合狠狠综合| 99资源在线视频| 色五月综合激情网| 九九精品热| 色吧五月| 丁香五月天综合| 六月丁香婷婷在线波多| 久久天天天| 超碰男人色| 久久九九九九| 激婷网| 亚洲综合在线视频| AV电影在线播放| 婷婷五月综合网| 天天做天天爱综合| 欧美五月丁香在线观看| 亚洲成人综合在线| 97九色视频| 九九性爱网| 五月天婷婷色综合| 日韩在线看AV| 久久婷婷五月综合激情国产 | 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 丁香六月综合激情| 国产九九一区二区三区| 五月婷婷六月丁香在线视频| 亚洲欧洲色色| 国产亚洲色婷婷99精品| 超碰精品在线| 五月天丁香成人社| 综合网啪| 日韩一级淫乱片一区二区三区| 天天操综合网| 婷婷五月激情丁香| www.婷婷六月天| 久久草中文日韩欧美| 五月天婷综合| 婷婷六月激情| 丁香六月婷| 97色色色| 日日干天天爽| 五月天婷婷在线播放| 婷婷五月天激情免费在线观看| 五月婷婷丁香av| 综合深爱五月| 五月花亭亭| 插插五月天| 天天综合网亚洲综合网| 无月播播激情在线观看视频| 婷婷激情欧美| 99免费视频在线观看爱| 五月天涩涩| 婷婷激情社区| 另类图片五月天| 激情开心五月天| 婷婷免费视频| 97丁香五月| 色噜噜狠狠一区二区三区| 婷婷激情五月色综合| 精品人妻久久久久久| 亚洲婷婷激情综合激情999精品| 丁香五月激情五月| 久久久久亚洲AV无码网影音先锋| 99久久这里只有精品| 69色婷婷| 超碰97干| 五月丁香六月婷婷姐| 在线天堂9| 色播五月婷婷| 无码人妻电影| 婷婷五月天色色| 久久婷婷五月综合色欧美| 99热97美女| 日韩五月婷婷| 91九色精品女同系列| 色五月涩涩婷婷蜜桃| 婷婷五月开心中文字幕色| 天天色天天色天天色天天色天天色| 情久久综合五月天| 色五月av| 99爱视频在线| 日韩AV免费电影在线播放| 婷婷不卡基地| 黄色精品五月婷婷| 99热这里只有精品在线免费| 五月综合激情综合久| 综合网激情| 天天插综合| A片试看50分钟做受视频| 狠狠色狠狠色综合日日91| 99色中文| 久久五月天精品视频| 丁香婷婷五月激情| 亚洲开心激情网| 99热这里只有精品33| 五月丁香六月婷婷国产视频| 丁香五月天啪啪| 丁香婷婷六月天| 久久精品99国产精品日本| 婷婷干六月综合旧址| 欧美日韩123| 深爱五月中文字幕| 婷婷狠狠97| 亚洲无码99| 激情五月最新网址| 99热欧美| 五月天婷婷色播在线网| 色婷婷激情四射视频| 天天综合色| A片试看50分钟做受视频| 婷婷综合九月| 婷婷天天舔| 亚洲丁香婷婷丁香五月天激情| 91碰碰| 色婷婷激情视频| 玖玖视频福利| 天天五月情| 九九热最新地址| 九一九九黄色| www.狠狠| 玖玖精品视频| www.夜夜| 日韩色五月| 九六五月天婷婷| 综合五月婷婷| 亚洲色频| 五月丁香六月激情综合网| 五月丁香久久丝袜啪啪| 五月亭亭开心网| 九一牛视频探花| 婷婷五月成人色综合| 天天草比天天爽| 99色热| 五月婷婷丁香大陆免费| 99热这里有精品24| 天天干 夜夜爽| 9久久网| 丁香五月婷婷乱| 深夜男女福利刺激影院一区完整| 亚洲狠9| 性色播| 婷婷六月综合基地| 免费在线观看av网站| 99re这里只有精品国产99| 国产成人99久久亚洲综合精品| 99久在线精品99re8| 狠狠色噜噜狠狠| 亚洲最大五月天成人网| 青青草五月天| 久久9久久| 亚洲第一第二网站| 中文字幕丰满孑伦无码专区| 五月丁香六月激情综合网| 婷婷八月丁香激情综合| 色婷婷AV久久| 五月情四婷婷| 丁香五月天婷婷激情| 欧美操人| 伊人超碰在线| 亚洲九九九九| 国产成人AV在线播放| 久久婷婷七月丁香| 五月熟妇婷婷久久| www.五月天婷婷| 中文字幕AV网址| 婷婷爱五月天| 九九久久玖玖爱| 亚洲久久婷婷| 99色在线| 色色操| 久婷| 色色综合网www| 五月激激网w'w'w| www99热| 日本老女人黄页在线播放| 先锋资源婷婷| 久久思思99| 五月丁香六月婷婷欧美综合| 色婷婷AV在线观看| 欧美97p| 97超碰,人人舔,人人操,人人摸| 日韩抽插操逼| 99这里只有精品视频| 99re这里只有精品99| 99久久性爱| av中文在线| 人妻人人操| 伊人久久五月天| 亚洲超碰在线| 精品久久99| 色色五月婷| 日韩色色色色色| 色五月激情五月开心五月| 99九九中文字幕视频| 五月天亚洲色| 久婷久婷激情肉| 影音先锋一区| 91九九精品| 五月丁香六月综合激情| 丁香五月AV| 操碰99| 秋霞性爱AV| 丁香五月激情婷婷| 五月丁综合在线观看| 在线免费视频caop| 这里只有精品免费视频在线观看| 97在线天堂| 五月丁香六月天| 五月丁香久| 婷婷综合精品| 欧洲99视频在线| 国产做A爰片毛片A片美国| 思思re视频在线| 99在线视频网址在线观看| 五月丁香在线综合| 99热热这里只精品996小说| 日本久久天堂| 婷婷成人综合| 人与禽A片啪啪| 开心五月深爱五月丁香五月激情五月| 婷婷婷久久| 亚州操人在线视频| 在线另类视频| 噜噜噜狠狠色综合| 五月香六月婷| 99久久高清视频| 高清视频一区| 天天爱天天做天天舔| 丁香花综合永久入口| 天天日夜夜曹| 久久9视频| 校花娇喘呻吟校长陈若雪视频| 亚洲欧州色情在线观看| 日本在线wwww| 日韩啪啪网| 丁香五月日本| 99资源人人| 五月丁香成人| 六月婷婷狠狠| 丁香五月天激情四射网络不好| 97人人操人人| 色五月成人| 青青草视频免费观看| 99热激情| 久久五月天大美女| 欲色人妻| 日本一道久久| 久久精彩视频99| 9久久久久久久久久久| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 |