免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

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
返回資訊列表
久久这里只有精品网| 婷婷丁香五月天激情四射| 色9色| 农村熟妇高潮精品A片| 伊人狠狠干| 久久区区一二三av| 五月丁香成人网| 青草久久五月婷伊人| 香港九九六区八区99| 欧美狠狠色| 婷婷久久五月天| 亚洲精品字幕| 丁香激情四射| 五月丁香婷中文| 99小视频在线观看| 粉嫩AV久久一区二区三区| 我要看激情五月天| 97香蕉碰碰人妻国产欧美| 欧美色色色| 日本操逼九九九九58日本操逼| 久久婷婷丁香| 亚洲综合五月天婷婷| 国产欧洲欧洲精品久久| 99国产小视频免费观看| 久久久香港| 丁香色色网| 色情五月天se| 欧美综合五月丁香六月婷| 无码免费人妻A片AAA毛片西瓜| 婷婷激情五月综合| va中文资源在线观看| 中文字幕久久婷九女同| 五月花丁香婷婷| 六月丁香停| 疯狂做受XXXX高潮A片| www.天天日| 激情深爱综合| 欧美日比视频| 禁片二区| 国产精品激情AV久久久青桔| 色婷婷狠狠爱| 亚洲第一综合| 5月丁香六月婷婷| 久久久18| 99热精品10| 国产毛片欧美毛片久久久| 五月婷婷六月丁香在线| 2020夜夜操天天爽| 九九精品在线视频观看| 五月综合视频| 任你操精品免费| 五月色婷婷AV| 天天拍夜夜撸| 色9999日韩国产| 碰碰碰碰碰99| 69凹凸成人综合网| 另类小说五月天| 九九视屏| 26uuu在线观看| 男人综合网| 欧美影院婷婷| 97碰碰碰| 99热97美女| 91久久久久久| 五月婷av| 9热视频在线观看| 亚洲性爱区无码区| 白天AV月月| 日韩性视频| 日韩啪图| 天天搡日日搡aaaaⅩ| 99精品爱| 五月天婷婷色播在线网| 99热热九九| 91丁香五月| 国产欧美大香蕉一区| 超碰人人在线| 夜夜操夜夜操| 涩五月婷婷| 丁香久久久| 91精品婷婷国产综合久久| 99秘 在线| 丁香六月婷| 少妇高潮一区二区三区99欧美| 日韩aaaaa| 一级韩国产精品毛| 26uuu欧美日本| 色色色五月天婷婷| 天天色综合综合| 极品人妻VIDEOSSS人妻| 九九热短视频在线观看| 青青草婷婷五月天| 久久激情五月天| 99热人人艹| 午夜九九电影| www.金莲av| site:publishdd.com| www.婷婷五月天| 久久精品色| 99操久久| 亚洲五月丁香综合网| 久久伊人大香蕉| www.久久久.com| 黄色成人网站在线播放| 色五月综合在线| 国产性爱一级| 婷婷丁香久久| 色综合色色| 久久亚洲婷婷综合色五月| av色色国产| 五月丁香婷婷色| 97碰碰视频在线观看| 91互操| www.五月天婷婷| 99人妻碰碰碰久久久久视| 噜噜国产| 久久久99久久| 国自产拍偷拍精品啪啪一区二区 | 天天噜天天爱| 久久视9精| 色婷五月天| 色99视频| 大香蕉啪啪| 欧美天堂久久| 久久九九热视频| 这里只有精品视频99| 啪啪激情网| 中文字幕综合网| 亚洲综合成人网| 爆乳熟妇一区二区三区爆乳照片| 激情亚洲网| 五月丁香亚洲综合| 成人无码精品1区2区3区免费看| 久久精品99国产精品日本| 亚洲亚洲人成综合网络| 婷婷激情五月呦呦| 久久久久婷| 亚州操逼网| www.婷婷亚洲基地| 玖玖色资源站| 激情网婷婷婷| 激情久久久久久久久久久| 婷婷综合亚洲| 亭亭五月色男人| 五月激情六月婷婷| 婷婷丁香亚洲色综合91| 99久久九九| 狠狠干狠狠干| 91干婷婷| 色婷婷色九月| 天天操夜夜啊| av网站中文| 婷婷五月天视频亚洲| 婷婷丁香五月激情密臀av| 亚洲av成人在线| 99色热| 亚洲无AV在线中文字幕| 国精产品一区二区三区| 97在线精品| 这里只有精品热| 99热精品综合| 激情六月天| 亚洲综合在线视频| 在线视频婷婷| 91九色 婷婷| 九九AV| 天天爱天天做天天舔| 欧美性爱5月天天天看| 97婷婷五月天| 在线播放中文字幕| 久久九九激情五月天| 操操操91| 美女天天艹人人爽| 天天天久久人人人合| 天堂色婷婷| 97操碰| 色婷婷综合亚洲| 色播五月| 丁香97综合| 九九热10| 婷婷伊人五月| 午夜激情婷婷| 日韩在线观看网址| 亚洲视频二区| 丁香五月第四色88| 99热国产精品| 亚洲综合色婷婷文学| 日韩无码专区| 精品久久久999| 五月在在观看| 激情综合5| 丁香九色不卡aaa| 久久曰曰| 亚洲综合成人网| 婷婷五月天电影在线| 丁香五月婷婷超碰在线| 99免费偷拍视频| 无码成人AAAAA毛片AI换脸| www.色婷婷| 五月综合777| 另类精品视频在线观看| 狠狠干狠狠操狠狠爱| 五月天色五月| 亚洲在线成人| 成人五月天在线观看| 激情五月综合网最新 | 丁香婷婷基地| 狠狠色丁香婷婷| VA日本视频| 天天久综合| 99热这里是精品| 成人小说色图婷婷五月| 五月丁香激情五月天| 天天插天天插天天插天天插| 五月婷婷六月激情| 婷婷综合色图| 丁香六月欧美| 超碰狠狠干99| 激情五月天丁香| 欧美国产一区二区三区| 国产欧美日韩综合精品一区二区| 亚洲愉拍99热成人精品| 久久久久这里只有精品| 激情涩播| 五月香蕉婷婷| 1024日韩| 丁香婷婷啪啪| 91精品无码| 五月天影院| 五月色亚洲| 久久婷婷综合拍| 狠狠色丁婷婷日日,伊人激情综合网| 丁香美女五月天婷婷| 日韩中文字幕| 综合五月草| 色色色热| 丁香六月天婷婷| 翔田千里aV中文字幕| 色婷婷在线视频综合| 久久久18| 热九九在线| 五月婷色色| 午夜九九九九九九九九九九九九九| 久久婷婷五月综合网| 国产AV一区二区三区日韩| 亚洲中文乱字字幕在线永久| 色99在线观看| 激情五月天色色| 色色五月天激情| 色爽九九| 五月天啪啪视频| 久碰婷婷视频| 日韩婷婷| 97精品综合久久| 开心激情五月天网| 中文字幕按摩做爰| 一级黄在线| 丰满少妇乱A片无码| 欧美成人一区二区三区在线视频 | WWW.婷婷| 色天堂在线| 色色色色色色色色色色色色色97| 99精品在线观看视频| 日韩精品一品二区三区的使用体验| 五月丁香婷婷基地| 亚洲无码99| 婷婷综合在线视频| 五月天婷婷在线观看| 久草婷婷网 | 色色色色色网站| 精品久久久中文字幕大豆网推荐理由| 六月伊人婷婷| 97在线观视频免费观看| xx综合网| 日韩在线观看网址| 丁香五月亚洲综合| 激情综合色婷婷啪啪五月天| 天天透天天摸天天舔| 亚洲成人在线播放| 国产色婷婷亚洲| 色婷婷激情| 婷婷五月天色| 婷婷在线视频| yazhou seshipin| 婷婷丁香五月天激情| 99在线热| 99热国产免费| 久久在线视频只有这里有精品| 99精品爱| 视频一区二区在线| 激情五月婷婷丁香| 国产精品国产| 久久新地址| 五月婷婷色影院| 狠狠人妻色综合| 久久狠狠干| 99久在线| 五月婷婷激情综合在线| 国产SUV精品一区二区6| www激情网| 婷婷六月色| 五月婷视频| 婷久久高清| 九9九9无码| 91超级碰碰| 五月在在观看| www.射伊蕉婷婷| 激情综合网五月婷婷| 婷婷视频在线| 五月丁香六月婷婷啪啪| 五月婷综合性中心| 99操免费视频| 激情五月婷婷| 九九色之九九色88| 久久五月天激情视频| www.国产色| 啪啪啪大香蕉| AV中文字幕夜夜操b天天摸bb | 做爰丰满少妇1313| 五月天婷婷綜合院| 色婷婷色情| 亚洲无码色| 亚洲激情av| 日美三级| 在线VA视频| 成人va在线播放| 色9999日韩国产| 丁香五月婷婷五月基地| www,五月天com| 激情五月天色婷婷综合| 天天干 夜夜爽| 5月丁香美女影院| 激情综合九月| 99久久激情视频| 激情五月天社区| 在线成人国产| 婷婷激情六月综合| 99色色网| 人碰91| 丁香六月婷婷综合色| 午夜激情五月天| 亚洲综合色色色| 91丁香色五月| 激情五月综合免费| 亚洲精品99| 91免费啪视频| 99这里只有免费的精品| 人人妻人人澡| 六月丁香啪| 99re热精品视频国| 婷婷情色五月天| 亚洲五月六月婷婷| 五月天天丁香婷婷在线中| 五月天色婷婷激情| 人妻丰满精品一区二区A片| 婷婷五月综合性爱| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 国产精品色色666| 成功精品影院| 思思久久久婷婷| 久久久久婷婷| 丁香婷婷六月| 免费无码毛片一区二区A片| 99久久久久久久| 婷婷六月丁香久| 婷婷久久丁香五月| 婷婷五月超碰| 亚洲性图一区二区| 伊人久久婷婷| 大香蕉网站,大香蕉综合| 天天干天天色天天干| 狠狠干五月天| 色色色婷婷五月| 99色爱| 丁香婷婷久久 | va中文资源在线观看| 天堂综合久| 激情6月| 激情五月激情综合俺也去婷婷小说| 91人操人人人操人| 人妻激情网| 五月天欧美 另类小说| 玖玖综合色| 伊人成综合五月婷婷| 亚洲乱码成人| 国自产拍偷拍精品啪啪一区二区| 国产激情久久| 中文字幕不卡+婷婷五月| 狠狠综合久久综合| 色婷婷六月天在线| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 国产成人精品一区二三区熟女在线| 五月婷婷五月天| 五月天啪啪啪| 五月丁香A∨在线| 婷婷丁香成人网址| 超碰日韩人妻在线| 激情五月天开心网丁香无码| 六月丁香网| 色综合久久天天综合网| 狠狠香蕉| 99在线观看视频| 天天做天天爱天天高潮| 五月天婷婷久草丁香| www,99热| 婷婷久久在线| 色婷婷成人| 蜜臀av 粉嫩av 懂色av| 欧美成人A片AAA片在线播放| 婷婷婷久久| 99这里是精品| 人人操碰| 日本欧美成人片AAAA| 九九久久偷拍| 五月色影院| 婷婷婷五月香蕉| 99精色| 丁香色色五月| 玖玖资源在线视频| 99精品女人天堂| 丁香六月婷婷| 免费国产视频| 色婷久久| 五月天天天综合| 超碰在线99| 这里只有精品99视频| a久久| 色狠狠狠干| 色色亚洲| 丁香五月婷婷成人综合| 男人操女人高潮91视频| 甈你aaaaa| 香蕉久操| 婷婷色正月| 婷婷久久色| 天天综合五月天| 色婷婷色九月| 五月婷婷六月丁香| 激情婷婷五六月天| 人人操9| 婷婷丁香五月高清| 97婷婷狠狠久久综合9色| 成人免费高清在线播放| AV操逼网| 开心五月婷婷激情| 婷婷五月色网| 国产综合久久久777777| 亚洲第一成人无码A片| 色欲丁香| 伊人综合网站| 99热无码| 色播色丁香五月| 激情婷婷久久| 六月丁香激情综合网| 五月香婷婷| 激情宗合网激情五月天| 亚洲无aV在线中文字幕| 婷婷婷婷色| 99热日韩这里只有精品| 色99欧洲色19| 操99| 五月婷婷中文网| 日韩小视频在线99| 五月色网| 久色中文| 五月久久婷婷天堂视频| 色5月婷婷| 五月天激情子轮| 67194中文字幕| 老司机伊人| 爱的综合网| 九九久久精品國產| 激情综合网五月| 久久久婷丁香五月| 波多野结衣AV无码Porn| 9色在线| 色久综合天天做视频| 懂色av蜜臀av粉嫩av永陈冠希| 超碰在线国产| 五月婷婷久久综合| 99丁香五月婷婷在线| 91久久久久久久久久久| 五月噜噜| 97人人做| 182tv992tv人之初午夜免费观看| www.精品99| 丁香桃色综合网| 色婷婷精| 久久这里只有精品99| 丁香五月激情图片| 亚洲国产成人在线| 大香蕉婷婷婷| 激情五月天在线视频| 成片免费观看大全| 日本啪啪天堂| 天天色情站| 婷婷五月天福利| 一丁香五月天月AV| 久操热| 99热都是精品| 成人中文网| 一本色道久久88加勒比| 久久婷婷综合五月天| 99九九热在线观看| 九九热内射| 婷婷五月激情在线| 精品一区二区三区四区五区六区| 天堂草在线看www| 9有码中文| 666555。COm毛片| 婷婷久久五月天丁香| 色五月天天| 亚洲婷婷丁香| 色五月在线综合| AV性爱在线| 99re8这里只有精品99re8热视频| 狠狠干在线视频| 日本久久婷婷| 婷婷五月在线| 激情五月丁香五月色| 久激情网| 婷婷天天婷婷天天澡| 梁铮版蜘蛛女在线观看| 9 1超碰九色| 日本网站久久| 香蕉AV777XXX色综合一区| 色综合久久888| 五月天婷婷成人| 538久久| 99久久99九九九99九他书对| 婷婷欧美激情| 国产精品24r| 久草五月| 色五月播五月| 淫视馆AV在线| 深爱综合网| 26uuu91| 久久亚洲色导航| 丁香五月另类色婷婷麻豆| 9999热在线| 香蕉久久av一区二区三区| 日本片日本片祼观看网站在线看中文版网页在线看 | 五月丁香六月片| www.婷婷| 六月婷婷激情| 五月婷婷综合久久| 色婷亚洲| 五月婷婷激情69| 包操45分钟网站| 日本三级大片| 97操在线视频| www.久久爱.com| 婷婷终合色图| 亚洲成人AV在线| 婷婷色资源| 潘金莲AAAAAAAAAA| 疯狂做受XXXX高潮A片| 性爱久久| 丁香五月伊人| 婷婷亚洲色| 超碰碰碰碰| 成人一级片| 久久最新色| 欧美黄色韩日网| 久久丁香久久| 99免费热视频| 午夜激情五月天| 激情综合五月色丁香婷婷| 97精品综合久久| 久操大香蕉| 黄色片区子| 香蕉视频91| 色婷婷五月在线| 黑人无码一区| 国产.亚洲.欧洲视频在线| 色婷婷狠狠18yy| av操B网站| 久久久天堂国产精品女人| 熟女人妻一区二区三区免费看 | www.婷婷激情网.com| 日韩AC在线免费观看| 激情AV综合| 五月丁香六月激情| CAOBIBI| 日韩无码人妻一区二区| 激情文学第四色婷婷丁香五月| 亚州婷婷五月激情综合| 色婷婷瘦婷婷日韩| 五月丁香好婷婷A片网| WWW.久久久久久久| 婷婷五月激情四月综合| xxxx五月| 男人综合网| 婷婷五月丁香久久| 五月花免费视频| 天天做天天爱| 99热这| 六月丁香久久| 国产暴力强伦轩1区二区小说| 熟女强人妻一区二区三区四区无| 久久免费干| 在线超碰91| 天天操天天曰天天射| 色婷婷中文在线| 九九亚洲视频| 丁香五月天天日| 五月天六月婷婷电影| 人妻内射视频| 久99久在线| 丁香五月影院| 91婷婷丁香五月亚洲| 丁香五月天天| 天天激情5月天亚洲| 婷婷AV丁香| 综合色综合| 五月天偷拍| 操99| 成人无码精品1区2区3区免费看| 九月停停| 久久婷婷色情7777网站| 婷婷丁香五月天色播网站| 婷婷五月天首页| 色噜噜五月天| 婷婷五月综合激情| 五月天丁香久久综合 | 精品久久久人妻| 国产毛片欧美毛片久久久| 亚洲视频另类| 99热国产精品| 五六月丁香激情视频| 99视频精品在线| 丁香五月婷婷色情综合| 国产亚洲精品AAAAAAA片| 97久久人人人干| www.AV在线| 热99国产精品| 伊人五月天婷婷| 99视频网址| 五月天激情网图片| 六月丁香啪| 色www.con| 免費亭亭成人| 天天日天天干天天操| 丁香五月中文字幕| 91人久| 91久久久久久久91| 美女婷婷六月色| 亚洲色频| 无码少妇高潮喷水A片免费| 色播五月丁香综合| 色在线五月天免费| 99国产精品久久久久久久久久久| 色99在线观看| 婷婷性爱综合| 天天爽天天日人人爱| 精品乱码久久久久| 国产99热| 婷婷色中文| 99热6这里之有精品| 天天综合网在线| 丁香六月啪啪| 丁香五月电影院在线观看| 婷婷国产日本欧美| 久久伦乱| 九九中文色色| 亚洲色激婷| 色五月婷婷在线| 国精产品一区一区三区免费视频| 久久182| WWW·天天操·视频?| 久久婷婷五月免费视频| 亚洲综合激情五月久久| 午夜丁香综合婷婷| 丁香五月在线观看完整版| 超碰人人色| 涩婷婷视频快播人妻| 丁香激情五月综合网| 久久天天| 97超美国视频在线观看| 亚洲精品乱码久久久久久按摩观| 久久久精品人妻| 欧美成人猛片AAAAAAA| www.99视频| 色色a| 99色热| 97人人操人人爽| 久久九九热视频| 婷婷五月花| 天天肏天天肏天天肏| 五月婷婷视频28| 久色激情| 色婷丁香| 噜噜色五月| 日韩AC在线免费观看| 五月丁香色婷婷伊人| 91日日日| 玖玖五月丁香| 伊人五月丁香| 男同91| 2050人人操免费工开爱| 九九99精品| 成人AV片播放| 午夜丁香六月婷| 丁香五月激情综合| 999九九九久久久99HD| 六月天无码网址| 婷婷激情五月| 五月亭亭六月色| 亚洲操精品| 激情丁香五月AV| 夜夜操激情| 五月婷婷色欲| 成人色五月天婷婷| 丁香婷婷久久| 色一情一乱一乱一区91| WWW.婷婷| 激情骚五月| 五月婷婷开心综合| 激情综合五月丁香六月婷婷| 五月丁香 啪啪啪| 国产精品久久久久久久久久久久| 天天做天天双| 婷婷五月天激情网| 秋霞三级影视资源| 五月丁香影视| 色综久久久| 日本久久天堂| 色欲婷婷夜夜| 99久久婷婷国产综合| 久久多色| 99国产精品久久久久久久久久久 | 婷婷狠狠操| 玖玖婷婷色| 五月婷婷丁香五月天| 中字幕视频在线永久在线观看免费| 深爱激情九九五月天 | 久久精彩视频| 天堂综合久久| 26UUU欧美激情一区二区| 久久久久久18| 色婷婷69| 激情久久五月天| 亚洲操逼片| 91在线日| 婷婷香五月天| www.主妇. com| 激情五月天视频| 日本美女天天日天天爽| 香蕉久久av一区二区三区| 色婷五月丁香久亚洲| 久爱综合| 亚洲色色色色| 亚洲激情六月丁香| 五月亭亭开心网| 六月婷婷久久| 26uuu精品国产| 五月婷婷高清| 97夫妻超碰| 色色综合视频| 婷婷五月中文字幕| 九九九色综合| 色播五月婷婷| 国产精品扒开腿做爽爽爽A片唱戏| 天天开心婷婷丁香五月| 国产肥白大熟妇BBBB视频| 99热精国产这里只有精品| 精品国产a| 亚洲色热| 大香蕉手机视频| 亚洲亚洲人成综合网络| 国产精品日韩十五区| 亚洲无码你懂的| 另类在线| 超碰精品手机在线| 香蕉五月婷婷| 一区二区三区视频| 一区二区三区四区五区| 色色五月天 亚洲| 婷婷五月天美女21p| 九九操操| Blackedraw视频一区二区| 五月花激情| 五月天婷婷社区久久综合| 中文字幕在线观看视频www| se色99| 五月色婷丁香| 97色天堂| 日本的α片xxxwww| 激情五月婷婷色色| 九九色色网| 五月丁香婷婷婷婷综合网| 色色网91| 天堂久久婷婷| 26uu| 婷婷丁香六月天激情四射网| 超碰九九热| WWW色综合| 九月色婷婷综合亚洲| 噜噜国产| 夜夜爽天天| 九九99偷拍视频| 另类专区在线| 激情综合网,婷婷五月天| 五月99久久| 99热综合| 91日视频| ji'qing'luan'ren'lun| 99碰碰碰| 超碰99在线观看| 久久婷婷在线| 在线网黄| 九九99精品免费播放| 日本狠狠色| 99在线观看这里都是精品| 欧美婷婷综合网| 激情丁香五月婷婷| 亚洲精品色| 成人狠狠成人狠狠成人狠狠成人狠狠 | 91婷婷色 | 五月婷婷丁香| 97色伦另类图片小说视频 | 国产69久久久欧美黑人A片| 丁香五月婷婷亚洲色图| 婷婷五月天亚洲天堂| www.亚洲激情.com| 99热这里只有精品4| 久久er99| 亚洲俩性性爱图片久久第六页| 青青草Avb在线| 另类图片五月天| 日韩黄色电影| AV国产有码| 26UUU| 婷婷综合av| 日本女色人人| 99久久极情精品一区| 色婷婷五月天视频在线| 成人超碰AV| 永久免费视频| 91fuliwang| av中文在线| 久草视频一,二三四| 天天夜夜六月丁香五月婷婷老师| 99热在线观看精品| 99玖玖精品| 五月丁香六月婷婷啪啪| 丁香五月婷婷六月丁香| 六月色日韩| XX久久| 九九综合88| 91人人人人人| 亚洲欧洲另类| 91成人品| 99视频内射三四| 婷婷五月丁香五月| 激情综合色| 无码 av电影| 五月天婷婷无码| 久久婷婷六月综合综合| 91九色精品| 婷婷丁香五月综合| 亚色网站小视频| 五月婷婷激情69| 色五月天成人| 五月天丁香网站| www99热| 五月激情天| Aaa久久| 日都一级A片| 久草九九| 99综合视频在线| 九九热思思热| 狠狠的日| 99热这里只| 亚洲色就是色色色| 激情淫乱男女| 大香蕉伊人久久| 激情黄色五月天| 国产综合网在线| 9久久婷婷国产综合精品性色| 思思久久99| 99热8在线| 亚洲色图81p| 国产亚洲色婷婷99精品| 思思热在线精品视频网站| 五月天婷婷丁香| 九九黄色网| 成人无码免费一区二区中文| 人操人人| 天天操天天爱天天日| 99热这里有精品24| 久久久久久久人妻| 99网| 天天插操| 丁香六月色婷婷| 婷婷永久在线| 啪啪操超碰| 伊人激情| 九月婷婷| 欧美A级成人婬片免费看理论| 五月色情精品| 九九久久五月天综合伊人| 就爱啪啪婷婷| 991精品在线视频| 激情深爱五月天| 男人天堂 久久| 俺也去婷婷五月天第五色| 久久久精品色色色| 超碰av在线| av婷婷丁香| 丁香五月婷婷啪啪啪| 欧美成人热| 五月婷婷在线免费观看 | 五月丁香性爱| A A色色| 9久精品| 91人妻九色大屁股| 婷婷五月天色| 天天视频亚洲| 激情综合五月婷婷| 人妻激情久久| 超碰99在线| 思思 热 99| 九九热在线精品视频| 美女被肏网站在线看| 色色色色色色色色五月先| 开心五月婷婷99| 91九色国产| 嫩草视频。| 五月份婷婷| 这里只有精品在线观看视频| 五月婷婷综合视频| 99色视| 停停色综合伊人| 另类 在线| 96自拍视频九色在线观看| 五月丁香六月成人| 五月天婷婷永久免费视频| 特级西西4444www无码| 丁香五月婷综合| 五月婷人妻| 97在线综合| 亚洲99一级无嗎特制在线| 综合丁香婷婷五月天| 五月天婷婷色小说| 丁香五月影视| 最新婷婷五月丁香| 亭亭丁香久久五月| 一级二级色大片| 91久女| 中文字幕丰满乱孑伦无码专区| 99这里有精品| 成人国产欧美大片一区| 337p大胆噜噜噜噜噜91Av| 日日.c| 成人午夜天| 日韩欧洲亚洲| 五月综合激情视频在线| 国产乱人偷精品人妻A片| 中文字幕在线观看视频www| 久久99激情丁香婷婷小说网| 麻豆WWWCOM内射软件| 综合色99| 超碰国产在线观看| 丁香五月亚洲综合| 五月天激情站| 碰碰91| 99@久久@99精品视频| 99热国产这里只有| 婷婷色丁香五月| 丁香色影院| 六月婷婷国产| 亚洲亚洲人成综合网络| 日本久久99| 亚洲日本激情| 九九热九九| 亚洲午夜Av| 天天爽天天干天天| 大香蕉色婷婷伊人在线| 久热无码| WWW.99热| 婷婷六月综合基地| 天天综合影院| 九九操屄| 99热99ai| 91婷婷在线| 久大香蕉| 色久丁香五| 99ri国产精品| 99热这里只有免费| 伊人免费视频9| 伊人婷婷激情| 欧美日韩成人在线| 久久黄A片| 人人操日| 国产婷婷五月天| 天天综合五月天| 亚洲免费在线观看岛国| 狠狠色噜噜狠狠| 免费无码毛片一区二区A片| 天天舔天天插天天爱| 婷婷五月天av| 亚洲综合碰| 综合久| 久久偷拍综合五月天| 五月丁香啪啪网| 大香线蕉伊人| 久久这里只有精品1| 99色色网| 久久国产高清| www.热99热| 五月丁香| 婷婷丁香视频| 97婷婷丁香五月| 另类在线| 天堂网色婷婷| 天天综合亚洲综合| 这里只有精品1| 91啪啪网| 17.c黄色| 成人做爰A片免费看网站找不到了| 97狠狠色| 日本人人xxx| 7777国产盗摄农村女人| 久久婷婷色情7777网站| 亚洲综合热| 超pen个人视频97| 亚洲精品成人| 亚洲中文乱字字幕在线永久| 六月婷婷综合网2| 五月丁香色色综合| 综合色色网| 综合九九久久| 亚洲AV成人无码久久精品老人法拉利| 综合色99| 99热这里只有精品1025| 夜夜爽天天干| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 99热综合网| bukadeavzaixian| 影音先锋人妻出差| 99热久久这里只有精品| 大香蕉婷婷色| 日韩一级网站| 成人 在线观看国产| 五月婷婷六月丁香激情深爱| 午夜一区| 色五月婷婷91| 久久久天天啊| 亚洲黄网在线| 草婷婷在线| 五月丁香在线| 五月天另类小说亚洲| 日韩操逼大片| 天天干,天天操,天天射| 婷婷综合五月天亚洲综合| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 99热爱爱干干日| 日韩在线成人电影| 五月激情婷婷丁香| 欧美三级大片AA在线看| a69在线视频| 丁香激情五月天| 九九视频免费| 色五月婷婷操逼| 亚洲五月激情| 精品人妻一区| 五月丁香趴趴| 天天婷婷色六月| 奇米四色五月天| 国产裸舞表演WWWW| 玖玖九九9999在线观看视频精品| 草操网| 99这里只有精品| 丁香婷婷五月天网站| 狠狠干在线| 丁香婷婷精品视频| 99热这里是精品| 九九99久久| 亚洲五月花| 久久综合激情五月天| 婷婷六月综合激情| 天天日天天插天天操| 丁香五月婷婷视频| 国产无人区大片| 在线成人网址| 婷婷五月天黄色| 综合网亚洲| 天搞天天天天天| 色色色99| 激情丁香五月婷| 亚洲亚洲人成综合网络| 色青青视频| 大香蕉综合视频在线| 激情五月少妇| 亚洲久艹| 婷婷97碰碰| 九九久久五月天| 成人日韩欧美| 欧美va亚洲va| 91Chinese在线| 五月婷婷视频啪啪美女| 国产精产国品一二三在观看| 99热精品少| 野战J办公桌椅H| 久热网在线视频| 免费操超碰| 翔田千里 50岁 无码| 精a品a视a频| 国产毛片欧美毛片久久久| 五月开心激情网| 一区操| 可以免费观看的AV| 色婷婷激情四射视频| 九九AV| www.99热视频在线观看| 一级片操逼视频| 亚洲va在线∨a天堂va欧美va| 玖玖婷婷色| 五月天婷婷在线播放| 插插干干干色| 亚洲精级| 亚洲精品午夜国产va久久成人| 婷婷丁香综合| 亚洲黄色影视| ...婷婷国产成人亚洲日韩| 日本婷婷色| 99只有精品| 丝袜大香蕉| 大色鬼综合| 欧美日韩一区二区三区四区| 欧美日本黄色| 色色色免费视频| 丁香婷五月天| 99久高清视频| 亚洲成人AV在线观看| av婷婷丁香 六月| 九色成人AV在线| 久久丁香五月| 草操网| 久9热插入| 色区久久| 中文字幕簧片| 中文字幕av亚洲| 亚洲免费看片| 99精品22| 伊人激情啪啪| 亚洲无AV在线中文字幕| 激情五月丁香六月| 亚洲人妻av| 2025神马午夜福利| 色婷婷久久| 深爱五月激情网| 婷婷狠狠狠爱| 大香蕉九操| 色丁香在线视频| 99热99美国在线观看| 久久免费精彩视频| 直接看的AV| 人妻久久久久久久久妻久久久久久久久| 色五月婷婷777| 婷婷玖玖五月天| 美女婷婷六月色| 九九青草热| 国产成人一区二区三区在线观看| 激情六月综合| 日韩抽插操逼| 成人VAV视频在线观看| 亚洲六月婷婷| 丁香五月天中文字幕| 丁香五月婷婷久久综合激情网| 肏日网在线看 | 深爱激情久久| a在线观看| 日韩野外 无套| 九九热最新| 丁香五月Av| 伊人五月婷婷| 六月丁香色色色| 五月丁香大香蕉| 婷婷五月花| 婷婷激情网五月天| 五月丁香另类图片| 伊人久久大香| 精国产品一区二区三区A片| 五月天成人免费视频| 人妻videos人妻高清| 狠狠色狠狠| 大鸡巴伊人网| 天天日天天舔| 久热这里只有| 色综合久久88色综合中文字幕| 五月天之色情综合网| 亚洲精品一区无码A片| 无码人妻激情| 色丁香五月综合网| 丁香五月激情宗合| 丁香五月网| 丁香六月婷婷缴情欧美| 99热免费精品| 99综合网| 天天夜夜六月丁香五月婷婷老师| 五月丁香六月色婷婷综合五月天| 九九综合| 婷婷五月天男人影院色色网| 好好干Av| 日本久草福利| 久久97久久99久久综合欧美| 五月婷婷无码| 五月天婷婷激情| 天天狠狠色综合| 婷婷色播六月无码| 五月天色色激情综合| 97婷婷在线| 五月激情婷婷四射| 超碰婷婷色| 99热免费观看| 综合99久久天天综合| 视色综合| 婷婷五月综合欧美在线播放| 黄网网站在线播放| 91亚洲免费片| 亚洲精品第一国产综合亚AV | 天天综合色综合| 五月丁香六月综合情在线观看 | 九月丁香婷婷网| 99在线精品视频| 久久九九99| 日本久久婷| 久青草影院| 五月婷婷婷婷网| 婷婷五月天Av| 去干网av| 性一交一乱一交A片久久四色| 九九九九操逼| 色五月亚洲| 天天射综合网站| 人人摸人人澡人人| 五月丁香亚洲综合| 天天日夜夜爽。| 狠狠干总合| 狠狠久久婷五月综合色| 另类五月婷婷| www,五月天com| 五月天久久久| 五月天社区| AAA久久久| 婷婷色啪| 欧美五月婷婷| 狠狠久久婷| 野外99热| 色都都狠狠色都都色综合色| 熟妇内谢69XXXXXA片| 婷婷综合网| 另类激情综合| 熟女网站久久| 99男人的天堂| 操操人人| 六月丁香社区| 激情久久综合网| 天天做天天爱天天玩夜夜爽 | 久久 中文 日本| 无码一级片| 中文久久婷婷| 第四色五月婷婷| 色呦呦在线|