免费国产精品自在自线-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
返回資訊列表
丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 色欲色欲久久宗合网| 五月天色婷婷av| 国产亚洲99久久精品熟女| 久久精彩视频| 五月婷婷激情综合| 天天日天天色| 99免费在线| 色色丁香婷婷| 丁香婷婷五月色成人网站| 九九热精品| 丁香婷婷成人在线播放| 97色色色视屏| 国产日产成人亚洲欧美国产VA| 香港九九六区八区99| 亚洲精品视频在线| 日韩成人无码人妻| 五月天丁香网| 日本久久精品| 99精品久久久久久久婷婷| 久久久久综合激动五月天| 激情熟女网| 激情婷婷| 天堂成人A片永久免费网站| 9色在线视频| 开心五月天激情| 色欲丁香| 五月婷俺去也| 五月久久五月激情| 五月丁香久久精品在线观看| 青青草原中文字幕| 激情五月天色| 六月激情婷婷色| www,com,五月色色| av在线播放网址| 婷婷五月欧美AA片免费| 亚洲色图日韩网址| 久/久精品99看9| 人妻中文字幕网| 大香蕉220| 天天爽天天| 夜夜资源站| 99综合| 久久这里只有精品16| 婷婷四月 成人 狠狠干| 这里只有精9| 六月丁香久久| 插插干干干色| 五月婷婷六月丁香综合| 狠狠色97| 五月婷婷综合网| 婷婷永久在线| 欧美性猛交99久久久久99按摩| 9 1超碰九色| 丝袜激情网| 五月天综合激情网| 丁香五月婷婷啪啪| 影音先锋一区二区资源站 | 国产古装妇女野外A片| 久久人人看| 色婷婷亚洲精品天天综| 成人AV在线中文版| 亚洲色图81p| 丁香五月WWW| 丁香五月婷婷激情蜜桃| 九九热99视频在线| 久久久妻人人人| 天天做天天爱天天爽在| 亚洲操B| www.五月天| 激情五月丁香社区| 国产偷人爽久久久久久老妇APP| 性做爰A片免费视频A片直播| 色原狠狠综合| 热久久77777| 99在线观看免费精品视频| 丁香婷婷六月天| 丁香五月在线观看完整版| 丁香六月无码| 天天日,天天干,天天操| 国内自拍1区| 五月婷婷九九久久| 狠狠狠狠狠狠狠狠狠狠狠色宗合图片| 激情综合网激情五月天| 亚洲精品一区中文字幕乱码| 开心五月婷婷婷美女| 97干97色| 噜噜网免费视频| 91狠狠色| 91久久九九| 亚洲AV成人精品日韩在线播放| 美女天天久久| 久久五月天网| 淫五月停停| 久99精品视频| 深爱五月婷| 大香蕉五月天婷婷| 99久久高清视频| 久久免费丁香| 涩涩涩.com| 超碰高清在线| 久久伊人日日夜夜| 99超级碰碰| 中文字幕在线免费观看视频| 97se视频在线| 色五月影视| 操骚货在线| 久久婷鲁| 99热这里只有精品2016| 激情综合网五月天| 欧美色色干| 爱草视频在线| 欧美性丁香色色五月天干干| 伊人9在线| 丁香六月天婷婷色| 亚洲精品久久久无码| 人人操人人添人人摸97| 色丁香久久久| 亚洲成人无码专区| 六月婷婷无码观看| 99操碰| 久久99日本精品视频免费观看| 9.1综合网| 丁香五月婷婷影院| 狠狠爱婷婷五月天| 丁香色情五月综合网站| 丰满少妇猛烈A片免费看观看| 97资源碰碰在线| 26uuu国产精品| 婷婷五月花| 色色婷婷丁香五月天| 五月丁香在线精品| 丰满老熟妇BBBBB搡BBB| 久久成人性爱| www.五月天| 快乐激情五月色婷婷| 99视频在线精品| 538在线精品| 91碰碰| 婷婷激情六月视频| 色月九九| 中文av网站| 99网址在线看| www.超碰在线| 99色这里| 专区无日本视频高清8| 欧美一级色| 五月天婷婷爱| 色五月婷婷激情综合网| 亚洲亚洲人成综合网络| 色五狠狠| 男人天堂99| 久狠狠狠| 99成人网一区| 热91久| 丁香综合伊人AV| 成人午夜视频精品一区| 99久久免费精品| 激情久久伊人| 97操碰在线视频| 激情图片99| 九九热99熟女| anquye伊人| 丁香六月激情综合| 五月丁香六月合| 精品人妻午夜一区二区三区四区| 99精色| 亚洲精品成人片在线播| 婷婷丁香五月激情| 狠狠色 综合色区| 日本黄色三级片内射| 色国产五月| 专区无日本视频高清8| 色五月天网| 丁香婷婷影院| 五月丁香六月激情| 九九色综合视频| 久久免费试看120秒| 99成人在线观看| 99热这里都是精品| seuuu婷婷| 丁香五月六月婷婷殴美综合| 久久色情| 色婷婷av综合网| 婷婷激情六月| 中文人妻主播久久| 婷婷九月亚洲| 99视频在线9| 天天插天天干| 久久人人人人妻| 成人VAV视频在线观看| 99精品久久久久| 99开心五月五月丁香激情| 黄色片久久| 国产欧洲欧洲精品久久| 久久99热免费| 久久精品4| 2025超碰| 欧美性爱五月天| 五月婷婷我| 婷婷五月情| 色色色色色色色色色影院| 少妇达人正片在线播放_ikun_福利吧| 婷婷色无码| 婷婷WWW久久| 99热只有| 91Chinese在线| 婷婷激情五月综合丁| 91pornav在线| Www.久久| 天天色综网| 色欧美影院| 丁香五月亭亭六月综合激情网| 久久色午夜在线导航| 99性视频| 婷婷五月激情中文字幕| 五月激情婷婷开心| 婷婷四色五月| 六月丁香婷婷天堂| 婷婷激情五月天天天开心| 国产AV成人精品| 99久在线精品99re8| 99亚洲日韩| 99热香港| 丁香五月六月久久综合| 激情五月综合网| 97人妻碰碰碰久久久久-最近国语高清| www.夜夜操.com| 亚洲99热| 婷婷六月丁香五月| 午夜丁香五月天综合| 亚洲va日| 激情小说五月天社区丁香| 狠狠综合色网| 99热99操| 五月丁香激| 欧美人人草草| 久久五月天 91| 99超超碰| 97啪在线观看视频| 婷婷激情久久| 91a片爽| 久久精品99国产精品日本| WWW.婷婷| 日本狠狠干| 亚洲婷婷免费| 亚洲午夜AV| 五月天综合在线| AV成人在线播放| 亚洲亚洲永久无码777777| 欧美一区二区三区不卡影视| 狠狠色狠狠鲁| 综合久久人妻| 五月天天天天天天天天天天天天天天天婷婷婷 | 99福利导航| 天天婷婷综合亚洲亚洲| www999日韩精品| 五月天婷婷操逼视频| 婷婷五月丁香在线视频| 狠狠干综合网| 99热精品在线| 超碰妻人人| 99精品丰满| 亚洲AV永久无码影院黑人| 丁香五月综合激情久久潮喷| 另类图片五月激情| AV在线观看网站| 99热国产精品| 色婷婷五月综合在线| 亚洲 在线 性爱 | 国产免费AV在线| 另类精品视频在线观看| av大香蕉| 色色色色色色色色色色色色色五月天| 五月丁香自拍| 久久五月丁香伊人青草| 色色色9| 婷婷色色婷婷| 九九黄色网| 丁香六月激情综合| 91N 一起草| 91肏| 色五月婷婷啪啪五月| 色婷婷五月天视频在线| 97人人操人人爽| 国产67194| 无码91中文字幕| 97资源碰碰| www99精品亚| 99小视频在线观看| 梁铮版《蜘蛛女侠》在线| 好吊丝aV| 久久人人九| 夜夜操夜夜爽| 草了bav视频在线观看| 91精品久久久久久综合五月天| 成 人片 黄 色 大 片| 黄色热99| 五月婷婷啪啪| 丁香婷婷深情五月亚洲| 99操碰| 97碰碰草| ...婷婷国产成人亚洲日韩| 激情五月婷婷六月丁香| 欧美日韩成人在线| 色婷天天| 五日激情综合| 淫视馆av三区| 婷婷五月天激情偷拍| 五月激情六月宗合| 婷婷色情 | 亚洲成人在线综合| 日日狠狠久久偷偷四色综合免费 | 九九亚洲天堂| 噜综合| 熟女激情五月天| 天天艹夜夜艹| 亚洲综合无码| 天天日本夜夜谢| 丁香六月婷婷综合| 五月天综合激情网| 99精品视频免费观看| 99自拍视频| 1024成人在线观看| 来吧亚洲综合网| 99婷婷精品推荐在线视频| 中文字幕av在线| 五月婷婷在线观看| 熟女强人妻一区二区三区四区无| 天天爽天天爽天天爽天天爽天天爽| 综合久久五月天| 超碰成人公开| 色色婷婷综合网| 99精品免费视频| 久久亚洲无码| 国产激情在线| w婷婷五月婷婷w| 五月婷婷之综合激情| 99国产精品白浆在线观看免费| 亚州操操| 97精品在线| 碰人人97| 桃色激情网| www.丁香黄色五月天人与| 亚欧州精品视频| 婷婷激情小说| 婷婷网影院| 99热这里有精力| 超碰九热| 六月婷婷九月丁香亚洲综合| 日韩欧美成人网| 综合视频五月| 91国产精品视频播放| 婷五月丁香| 婷婷五月影院| 丁香婷婷人妻综合网| 五月亭亭开心网| 乱码操操| 丁香六月婷婷久久综合| 久久精品小视频| 熟女人妻视频| 79精品视频| 五月丁香婷婷激情爱爱| 国产精品爽爽久久久久久| 91丁香婷婷综合资源| 丁香六月婷婷久久综合| 国产91视频| 久久综合激情| 99在线观看视频蜜臀| 激情AV| 热久久77777| 亚洲日韩一页精品发布| 五月丁香AV在线| 色色色色色日韩午夜激情 | 狠狠色狠狠| 亚洲第一成人无码A片| 92久久| 婷婷视频网| 高清无码视频网址| 色五月成人在线| 艹色18p| 婷婷五月天福利| 日本视频99| 97久久超碰| 激情小说五月丁香在线视频观看视频| 天天色中文字幕女优AV| 色在线99| 久色中文| 黄网免费看| 另类视频在线| 五月婷婷激情五月| 色五月av伊人| 99在线视频免费| 涩五月婷婷| 九九草热在线观看| 婷婷丁香激情综合色情| 一本大道伊人AV久久综合| 日韩五月丁香| 久久er九九| 99精品手机在线视频| 99干日本| 5月丁香六月婷婷| 久大香蕉| 99久久超级| 久草性爱| 亚艹艹| 九九综合精品| 操逼综合网| 狠狠五月天| www,天天干| 成人在线日韩| 五月丁香少妇| 潘金莲AAAAAAAAAA| 婷婷视频网| 五月天婷婷综合网| 这里只有九九精品| 99热这里只有精品268| 超碰国产一区| 中文字幕日产A片在线看| 国产精品色色| 六月丁香VA| 色五月激情问网站| 婷婷色五月激情| 1024人妻无码中文字幕| 日本色色色| 婷婷久久五月天| 日操五月婷| 伊人久久艹| 狠狠色丁香婷婷| 做爰丰满少妇1313| 九九婷婷网五月天| 亚洲综合视频在线| 激情小说五月天| 天天狠狠色综合| 五月天婷综合网站| 天天操夜夜爽天天操| 色婷亚洲五月丁香| 久久婷婷五月综合色天| 1024成人免费看| 五月婷婷五月天| 亚州色婷婷| 亚洲综合五月天婷婷| 激情综合丁| 久久黄色免费视频| 五月激情另类| 国产夫妻操逼内射视频| 伊人婷婷青青cao| 思思99久久| 婷香狠狠爱五月| 免费视频1区| 99re热视频这里只精品| 最近中文字幕大全免费版在线| 丁香六月婷婷久久综合| 九九99精品视频在线观看| 五月天激情网图片| 中文字幕丰满人妻无码专区| 婷婷激情视频| 欧美久热| AA丁香综合激情| 婷婷激情六月| www.色婷婷| 超碰人人色| 婷婷激情四射| 大战熟女丰满人妻AV| 日本欧美成人片AAAA| 久久丁香五月天| 99无码视频| 婷婷五月天久久久| 久久五月婷6 9| 无码 av电影| 五月天丁香婷婷视频网址| 伊人大综合| 丁香五月婷婷综合激情哟哟哟| 色五月丁香五| 99在线一区| 欧美色色干| 成人国产综合| www。五月天。com| 26UUU欧美| 色综合中文| 久久九九国产精品怡红院| 天天射影院| 亚洲亚洲人成综合网络| 九九久久污| www.色9| 日本女va| 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪| 五月丁香六月激情| 丁香九月激情| 综合久久首页| 婷婷色婷婷亚洲成人| 免费日韩99| 婷婷五月天色综合| 中文字幕AV在线| 中文字幕无码人妻少妇免费视频 | 九九热这里精品| 天天干天天 亚洲| 五月天婷婷激情在线色图| 99久久婷| 九九热123| 色婷婷操逼网| 五月婷婷成人w| 五月婷六月| 欧美一级色| 久久人妻少妇嫩草AV| 婷婷色基地在线看 | 天天操五月天| 人妻系列久久久久久久久久久| 五月香六月婷| 91丨九色丨国产打屁股| 美国不卡视频| 综合激情综合啪啪| 在线中文字幕视频| 久久婷婷一级片| 8区视频在线| www.sezonghe| 色五月五月婷婷| Caoporn公开| 91丨九色丨东北熟女| 第四色婷婷色五月| 91丨九色丨大屁股| 国产精品国产| 99热777| 国产精品电影| 欧美精品A片一区在线观看| 激情深爱综合| 五月婷婷中文字幕| 欧洲区自拍| 99亚洲综合| 久色五月丁香视频| av网站不卡在线| 秋霞性爱AV| 99热中文字幕久久| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 熟妇内谢69XXXXXA片| 91狠狠色丁香| 婷婷丁香18| 亚洲情综合五月天| 五月综合激情久久| 99精品在线播放| 丁香五月激情综合婷综| 另类五月激情| 影音先锋男士资源网一区| wWw色五月| 99热日本| 久久久久久激情| 日日操日日撸| 91久草五月天婷婷| 激情五月婷婷五月| 五月丁香中文婷婷中文| 激情五月婷婷色| 黄桃AV无码免费一区二区三区| www婷婷| 在线观看中文字幕亚洲| 一级性感黄色内射视频| 大香蕉中文| 六月婷婷最新网址| 婷婷午夜天| 日韩成人影片在线观看| 久久只有18视频| 色婷婷四虎| 综合五月激情| 日韩一级| 色色色.COM| 开心婷婷五月综合| 天天天久久人人人合| 日本97人人| 99热99re6国产在线播放| 亚洲AV在线免费看| 久热这里只有精品在线| 色开心五月婷婷丁香HD| 能看的av| 国产日产成人亚洲欧美国产VA| 大香蕉520| 97人人干人人操| www久久久| 五月婷婷干干干| 久久婷婷五月综合| 思思综合热| 色色色色色色综合网| 亚洲综合在线丁香五月| 丁香五月天堂亚洲社区| 九九精品免费| 久色网址| 丁香五月花| 色婷婷六月天在线| 九九人人看| 亚洲色图五月丁香| 亚洲视频在线观看99| 国产精产国品一二三在观看| 婷婷天天综合| 91色吧网| 可以免费观看的AV| 天天爱夜夜爽| 狠狠色婷婷7777久| 久久婷婷五月综合色区| 欧美性猛交99久久久99| 在线五月婷婷小电影| 色婷婷成人做爰A片免费看网站| 色五月激情基地| 久久五月天丁香花| 激情五月婷| 99精品爱| 99激情网| 超碰人人插| 婷婷五月激情的图片| 中文精品久久久久人妻不| 日日影院 | www.夜夜| 六月婷婷影院| 99热老网站| 欧美性生交xXxX久久久| 五月丁香婷婷综合久久| 色五月视频无码播放| 久久六月综合| 北京熟妇搡BBBB搡BBBB| 99这里| 第2色五月婷| 九月停停| 人妻久久久久久| 丁香六月婷婷色XXXXX| 99er这里只有精品视频| 九九热91| 国产麻豆视频| 很很干天天干| 五月婷婷六月激情| 激情综合色五月丁香六月亚洲| xx久久| 激情AV综合| 婷婷综合在线| 婷婷色操| 丁香成人色情五月天| 另类在线| WWW.久久久久久久| 五月停停99| 综合婷婷| 狠狠干婷婷| 色色色色综合| 婷婷五月色亚洲| 亚州欧美国产久精国产99综合视频| 久久伊人婷| 国产成人综合电影| 丁香婷婷色五月| 四虎成人精品永久免费AV九九| 天天狠狠色综合| 丁香五月婷婷动漫| 日本99视频| 六月婷婷综合久久| 激情婷婷综合网| 色婷婷8| 国产成人精品亚洲线观看| 激情综合色| 97性视频| 99久久婷婷五月综合| 亚洲视频99| 大陆肏屄视频| 深爱激情网噜噜色| 丁香欧美| 人妻操操色| 99久久思思| 狠狠操天天操综合| 国产精品色色666| 9+1视频网址| 激情综合网五月婷婷| 丁乡久久| 九九99九九99| 欧美三级欧美一级| 久久性爱视频| 婷婷和五月天| 久久99热免费| 五月天婷爱综合| 亚洲99在线视频| 婷婷五月激情欧美大胆视频| 五月婷婷手机在线| 26uuu亚洲精品国产| 亚洲色A| 久热视频这里只有精品| 色色色图| 99综合自拍| 欧美影院婷婷| 丁香六月婷婷久久综合| 98国产精品综合一区二区三区| 日本99视频| 国产又爽又猛又粗的视频A片| 成人做爰高潮A片免费视频| 高清一区二区三区日本久| 五月天色五月| 成人五月天综合网| www.色情五月天.com| 六月丁香婷婷色狠狠久久| 色域五月婷婷丁香| 婷婷五月成人有| 少妇久久诱惑视频| 久久久这里有精品| 色色色综合网| 亚洲国产精品成人午夜| 影院久久久| 9久久久久| 五月丁香美女| 天天摸天天高潮天天爽| 久久婷婷五月天蜜桃| 亚洲情色一区| 九九热超碰| 婷婷综合玖玖五月| 99精品久久| 色婷婷色五月色丁香| 五月丁香花开综合网| www.色婷婷.com| www.99视频| 日韩国产在线精品| 99狠狠色| 久久久久久综合五月婷婷| 天天爱天天操| 成人无码精品1区2区3区免费看| 婷婷色综合中心站| 亚洲综合九九| 中文字幕色色色| 九月综合| 99久久喉9| 香蕉婷婷| 五月色婷婷综合| 五月丁香综合| 91视频综合网| sewuyuejiqingwang| 五月丁香在线| 伊人丁香在线| 欧美激情丁香五月| 丁香五月婷婷在线观看| 97色色色| 色狠狠色综合久久久绯色AⅤ影视| 思思99热在线| 婷婷丁香亚洲色综合91| 蒲京久久无码视频| 凹凸探花电影| 九九碰九九爱97超| 中文字幕人妻AV| 夜夜骑操AV| 激情六月天| 丁香花社区av| 涩涩五月天综合| 丁香五月网址| 久久日韩婷婷五月| 五月色婷婷激情| 青青草成人网| 91九色熟女| 婷婷久久草| 无遮挡国产高潮视频免费观看 | 丁香五月婷婷老师网站| 丁香婷婷六月天| 九九这里有精品| 久综合色| 啪啪啪综合网| 99.色| 亚洲五月花| 99九精品| 亚洲va在线∨a天堂va欧美va| 99色综合| 伊人五月婷婷| 99在线小视频| 啊v视频在线观看| 婷婷五月色惰| 亚洲色图81p| 丁香五月天激情免费在线观看AV777| 99精品国产在热久久| 五月丁香猫咪久久婷婷综合视频激情四射网入口 | 欧美性生交A片免费看| 思思久久网| 久久香蕉影院| 色色色色色色色色五月先| 色综合五月| 97婷婷狠狠久久综合9色| 激情五月婷婷老师| 99热九九九九| 婷婷五月综合亚洲| 久久丁香社| 天天爽天天爽| 91视频一起草| 欧美精品999| 国产成人AV在线| 婷婷综合网| 99re66热这里只有精品| 91丨九色丨东北熟女| 色激情综合| 天天干天天日天天操| 九九国产视频| 天天综合精品| 开心五月丁香啪| 99热最新国内| 五月婷婷在线免费观看| 亚洲无码yw| 久久9视频| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 九色91美女| 99热在线精品观看| 亚洲天堂AV免费片| 五月天婷婷婷| 99热只有| 香蕉久久国产AV一区二区| 九九这里只有精品| 日逼免费视频| 五月伊人婷婷999| 99无码超碰| 激情五月激情综合网一级丸片| 午夜亚洲AV日韩无码| 色日本网| 99欧州偷拍视频| 久久婷婷伊人| 四色AVwww| 99精品在线观看视频| 亚洲九区| 婷婷综合五月天亚洲综合| 激情综合99| 粉嫩AV久久一区二区三区| 日日狠狠久久偷偷四色综合免费| 日本99色| 天天日天天爽| 老司机日日夜夜青草| 国产ava| 青柠影视免费高清电视剧| www.丁香五月| 天天日天天做天天舔| 97啪在线观看视频| 久久永久视频| 丁香五月,激情五月,深爱五月| 激情综合在线播放| 欧美丰满熟妇BBB久久久| 天天狠狠干| 天天色综和网| 丁香97综合| 亚洲中文字幕av| 夜夜操天天干| 色爱99| 五月婷婷成人| 久久精品99国产精品日本| 色五月婷婷在线| 五月丁香亭亭成人电影| 婷婷久久18| 亚洲成av人影院| 99啪啪网| 99热99热不卡| 丁香亭亭久久| 伊人9在线| 国产成人AV不卡| 97人人干| 色偷偷五月天| 欧美va亚洲va在线播放| 操碰97| 久久国产AV| 野战J办公桌椅H| PORNY九色9l自拍视频成人| 国产另类综合| 蜘蛛女免费观看完整版高清电影| 婷婷色五月开心五月| 丁香五月婷婷天激情| 色欲一区二区三区精品A片| 婷婷五月丁香综合激情| 五月丁婷婷| 色婷婷五月天av在线| 亚洲乱啪| 亚洲色图五月丁香五月婷婷| 五月天激情影院| 99操久久| 五月天激情四射网站| 五月婷婷福利| 激情五月天之五月婷婷| 91五月天| 激情综合五月| 综合网啪啪| 色五月婷婷1| 亚洲岛国电影| www.丁香六月婷婷久久天堂影院.con| 91超级碰| 丁香五月综合| 色色色色色色色色综合网| 色五月五月天色婷婷色五月| 欧美草久久五月天91| 丁香婷五月| 激情小说五月天中文字幕| 99色这里| 色七色九九| 激情婷婷五月女| 丁香五月天天哦| 色婷婷五月综合| 国产婷婷色五月| 五月激情丁香五月| 九九热这里有精品视频| 九九激情网| 狠狠色综合网| 激情五月婷婷丁香六月| 五月丁香啪| 久久五月天激情美女| 亚洲五月天色| 色色网站在线免费观看视频| 成人精品一区二区三区四区五区| 亚洲人妻av| 国产乱码久久| 伊人青草成人| 激情婷婷五月天伊人在线观看| 亚州欧美国产久精国产99综合视频| 婷五月丁香俺| 亚洲激情五月婷婷日日| 国产精品噜噜在线视频| 另类国产综合| 五月停停激情网| 噜噜视频| 九九99九九99偷拍视频免费看| 免费观看亚洲AV片| 五月开心久久| 少妇真实被内射视频三四区| 五月婷婷丁香日韩在线| 亚洲天堂青草| 97色97干| 欧洲99视频在线| 九九操综合网| 激情VA视频| 久草A片| 国产做爰视频免费播放| 日韩人妻白浆视频系列| 狠狠色噜噜狠狠亚洲A∨| 色五月婷婷五月天激情综合| 伊人碰碰碰| www久久五月com| 婷婷激情五月综合丁香社| 天天综合中文| 九九综合九九| 欧美搡BBBBB摔BBBBB| 九九99偷拍视频| AV五月丁香| 激情五月天开心网丁香无码| 这里只有精品在线看| 婷婷五月天av| 婷婷色综合| 日都一级A片| www,五月天com| 五月婷婷六月基地| 美女激情综合| 久久久久亚洲AV综合| 国产中文字幕在线视频免费观看| 91九色丨国产丨爆乳| 亚洲九九九九| 九九亚洲综合| 伊人婷婷大香蕉在线| 全高清无码视頻| caopeng97日韩| 久久看婷婷| 亚洲亚洲人成综合网络| 国产操B视频| 热久久视频99| 啪啪啪综合网| 好大好粗嗯啊-一级黄色大片免费观看-成人AV| 日本一道久久| 99性爱视频网站| 99久re热视频精品98| 九九超碰人人| 婷婷五月丁香激情色情| 久久婷婷五月天激情四射| 久久久99精品免费观看| www.91在线观看| 天天干、天天日日| 99热在这里只有精品| AV中文字幕夜夜操b天天摸bb| 青青草性爱视频| 美女五月天| 熟女人妻一区二区三区免费看 | 丁香婷婷五月天网站| 狠狠干五月丁香综合网| 亚洲综合激情五月久久| 99热在线资源| 亚洲激情网站| 狠狠精品干练久久久无码中文字幕| 99ri在线播放| 天天天天天天噜| 国产亚洲成AV人片在线观黄桃 | 亚洲视频丁香网va| 色狠狠色| 97五月天婷婷综合激情网| 亚洲尤物在线| 99热99色| 婷婷99狠狠躁天天| 五月激情影院| www.韩日视频| 99成人精品| 婷婷综合久久| 五月花综合| 久久久中文| 五月婷婷综合影院| 激情综合五月婷婷六月丁香| 人妻丰满精品一区二区A片| 操碰99| 色婷婷A| 91在线日本| 极品人妻VideOssS人妻| 久9热插入| 六月丁香婷婷在线波多| 亚洲精品一区中文字幕乱码| 欧美A级网站| 99ri在线观看视频| 超碰色婷婷| 干一干xxxx| 热热99爱爱| 五月婷婷视频| 国内久久久精品99| 久久久这里有精品| 婷婷伊人五月丁香天堂网| 婷婷开心六月| #NAME?| 思思热国产在线| 99艹精品在线观看| 激情综合网五月天| 99久热精品在线| 美国十月色婷婷在线观看| 激情五月天第四色| 五月天激情综合| 香蕉久久六月| 婷婷综合色| 色五月首页| 婷婷六月丁香五月| www色婷婷久久综合久色 | 99热国产这里只有精品| WWW久久久| 色色色色综合| 丁香五月婷婷动漫| 免费黄网不卡AV| 色婷婷五月天综合网| 婷婷丁香久久网| 天天日本夜夜谢| 欧美日韩成人在线观看| 久久婷五月婷| 婷婷激情五月天综合| 疯狂做受XXXX高潮A片动画| caopeng97日韩| 婷婷五月丁香99| 97色色色| 99色色网| 亚洲国产精品SUV| 天天舔天天摸天天透| 玖色色综合| 国产熟女一区二区三区五月婷| 丁香大香蕉| 五月激情综合网| 丁香婷婷综合激情五月色| 五月激情综合性爱| www.狠狠| 五月天激情国产综合AV| 丁香六月综合激| 久久婷婷热| 色小说婷婷五月天天天| 91人妻人人操| 婷婷六月天天| 色天天狠狠干| 色婷婷玖玖影院| 伊人激情| 五月激情五月婷婷五月天在线| 色五月激情综合| 六月天婷婷| 怡红院视频| 婷婷综合| 午夜]香婷婷深深爱| 亚洲 视频 导航 一区| www.夜夜操.con| 国产操逼视频网站| 五月天狠狠| 五月丁香花激情综合网| 4399亚洲视频| 人与禽A片啪啪| 五月天婷婷AV| 激情五月婷婷网在线观看| 人碰91| 99久久综合网| www夜夜| 丁香婷婷激情五月色| 任你干嘛免费视频播放| 久久激情网| 夜夜爽天天爽| 激情综合网,婷婷五月天| 久草a片| 色色欧美。| 婷婷天堂站| 成 人 色 色| 丁香婷婷五月天色综合| 丁香六月激情综合网| 风流少妇A片一区二区蜜桃| 大香蕉中文| 亚洲 六月 综合| 久热99| 国产操逼网站| 97超碰婷婷五月天| 九九久久99| 五月天色丁香| 激情综合色| 爱爱色五月天| 91九色国产在线| 久久九九re热| 99久久婷婷精品视频| 亚洲色婷婷| 99九九在线精品热动漫| 5月婷婷五月天| 天天操天天操| 大香蕉久久伊人婷婷五月丁香| 日韩淑女人妻luan伦激情精品一区二| 欧美经典片免费观看大全| 丁香五月婷婷色情综合| 人妻操逼视频| 激情网婷婷婷| 99精品在| 夜夜躁狠狠 | 色欲一区二区三区精品A片| 亚洲色婷婷| 91人人网| 亚洲无码色| 五月婷亚洲精品| 激情五月色综合| 狠狠操在线视频| 亚洲射激情| 99re久热只有精品6在线直播| 超碰91av| 亚洲综合视频在线| 人妻aV在线| 99日本视频| www.91AV.COM| 97自拍视频网| 丁香婷婷老司机久操| 9色资源在线| 激情五月黄色| 欧美日韩成卜| 五月天丁香久久综合| 国产肥白大熟妇BBBB视频| 五月天综合在线| 欧美交换配乱吟粗大25P| 亚洲综合99| 综合激情婷婷| 五月激情影院| A片试看120分钟做受视频红杏| 色五月丁香五月| 香蕉久久国产AV一区二区| 欧美色色色色色| 婷婷色导航| 亚洲A片成人无码久久精品青桔| 亚洲国产精品SUV| AV成人在线网站| 久久全意婷婷| 色婷婷丁香AV综合| 天啪色| 色欲影香| 激情综合网五月在线播放| 青草网在线观看| 久久婷婷五月国产激情综合片| 热无码A∨| 五月婷婷手机在线| 丁香六月婷婷色XXXXX| 天天干一干| 婷婷婷婷婷婷婷五月丁香| 色综合激情| 蜜桃成语时李时珍 免费| 97五月婷| 免费成人网在线观看| 日韩AV在线免费观看| 久操大香蕉| 欧美成人热| 26uuu亚洲精品国产| www.色五月| 亚洲操b| 国产成人综合亚洲| 色婷亚洲五月丁香| 9久热| 婷婷丁香六月激情综合| 婷婷五月天综合色| 免费观看的av| 思思久久精品| 99久操视频| 天天视频亚洲| 成人一区在线观看| 亚洲超碰在线| 2025天天爽天天摸| 六月婷婷五月丁香| 99爱在线视频| 婷婷丁香精品视频在线观看| 骚五月婷婷| 快乐婷婷五月天| 日韩在线五月天婷婷| 碰碰女| 五月天激情小说| 丁香五月www| 黄色aaaaa| 天天操夜夜橾| 操碰97| 99re久热| 激情婷婷丁香五月天小说| 五月婷婷五月天亚洲无码| 成人电影AV在线观看| 噼里啪啦在线观看免费完整版视频 | 五月婷婷在线视频| 9 大屁股在线视频精品| 九九热这里只有精品23| 五月天色视频| 婷婷婷婷色| 五月天丁香啪啪啪啪| 久久这里精彩免费在线观看| 色五月婷婷天天操夜夜操| 99热都是精品| 9l视频自拍九色9l黑人| 婷婷色九月| 人妻VideOssS人妻高清| 丁香五月天视频| 婷婷五月天中文字幕| 五月婷在线色视频| 丁香九月激情| 人妻五月天激情开心网| 桃色激情婷婷伊人网| 91久久精品无码一区二区三区| 91精品久久久久久久久久| 婷婷九月综合| 日韩色五月| 国产精产国品一二三在观看| 超碰超碰在线| www.婷婷五月天.com| 熟女人妻视频| 狠狠做五月| www99在线观看视频| 97自拍视频网| 26UUU精品一区二区Com| 婷婷天天日婷婷| 婷婷五月综合啪| 婷婷五月色亚洲| 丁香婷婷综合激情五月色| 久久99婷婷| 婷婷丁香六月| 超碰免费电影| 天天干肏夜夜| 大地9中文在线观看免费高清| 日本色图综合| 五月亭亭性| 精品五月花| 丁香五月六月欧美| 噼里啪啦在线观看免费完整版视频| AV五月丁香| 色欲婷婷五月天丁香| 亚洲视频另类| 丁香五月亚洲| 日本性视频| 亚洲婷婷五月天激情综合| 99热久久这里只有精品| 久久五月天大美女| 日本九九九九| 99久在线精品| 婷婷伊人久久| av国产精品偷| 久久精品五月天| 婷婷综合影院| 91无码高清| 91chinese 在线| 国产色网站| 亚洲综合视频网| 9久久久久久久久久久| 91精品综合久久婷婷九色| 五月天婷婷综合网| 五月婷婷丁香六月| 中文字幕AV网址| 久久婷婷五月天蜜桃| 亚洲激情婷婷| 婷婷九月激情| 五月丁香六月激情在线| 久热这里只有精品性色AV| 亚洲AV免费在线| 一本道综合网| 九月激情婷婷丁香|