99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜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片免费一区99| WWW99热| 噜噜五月天综合| 99热久久最新地址| 婷婷久月| 91视频久久久| 久久99免费视屏| 五月婷婷婷婷| 色宗合,宗合网| 99精品网址| 五月色丁香| 中文字幕色色| 蜜臀AV在线成人| 91碰操| 色人久久| 久久婷婷成人综合色怡春院| 第四色大香蕉| 噜噜五月天综合| 性做久久久久久久免费看| 五月婷婷co.m| 4438激情网| 大地资源色婷婷视频在线| 日日夜夜天天综合| 色婷婷丁香五月综合| 97操碰视频| 国产人妻777人伦精品HD| 91色涩| WWW.开心五月天.COM| 碰97久久| 91丨九色丨白浆| 久久婷婷青青草| 久久这里只有精品热在99| 久久综合网免费视频| 99热国产婷婷| 综合色色综合| 9久操| 成人精品视频99在线观看免费| 狠狠色五月天| 久久亚洲婷婷| 久久久五月天| 五月天伊人久久久久| 少妇久久诱惑视频| 五月婷婷开心色伊人| 久久这里这里有精品免费视频| 五月久久| 熟女人妻一区二区三区免费看| 五月天综合影院| 婷婷五月激情热播| 中文字幕丰满乱孑伦无码专区| 色婷婷在线影院| 久久人妻熟女一区二区| 婷婷五月天免费99| 久久婷婷东京热大香樵| 中文字幕综合| 色婷婷婷av| 日韩无码性爱| 操操自拍| 99碰| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 97香蕉久久超级碰碰高清版 | 国产暴力强伦轩1区二区小说| 婷婷五月天激情丁香| 狠狠色性| 婷婷中文字暮| 超级碰碰91| 五月色综合| 久久视频这里99| 激情性五月天免费小说视频| 日日日日日| 久久亚洲网| 成人五月天婷婷| 丁香五月综合高清在线| 思思热99在线| 丁香成人色情五月天| 色婷婷色五月天| 激情综合五月婷婷六月丁香| 99久.| 婷婷黄色| 丁香五月花| 不卡在线中文字幕无| 丁香婷婷综合激情五月色| 99在线免费视频| 亚洲最大在线| 少妇出轨做爰高潮A片| 久久小说网| 日本精品。999| 激情婷婷丁香色情五月天| 天天干天天操天天干天天操天天干天天操 | 热热久久精品视频| 久热2025无码| 青草激情在线| 操操自拍| 五月婷中文字幕| 五月丁香777| pacopacomama 070722_670 素人奥様初撮りドキュメント 103 大久保純子 | 97碰超级人人看| 色 免费网站视频| 狠狠 婷婷| 日韩久久这里只有精品| 99久在线观看| 夜色五月天| 亚洲激情综| 久久狠色噜噜狠狠狠狠97| 亚洲精品性色| 亚洲五月婷婷| 成人AV中文字幕| 狠狠干天天内射| 狠狠操婷婷| 在线观看的av| 97偷拍在线视频| 亚洲精品视频在线| 超碰国产在线观看| 五月婷婷亚洲综合在线| 99操视频| 99干日本| 玖玖婷婷色| 五月情丁香色| 激情久久久| 色色网站毛片| 99热这是里只有精品| 色丁香六月| 91Chinese在线| 色综合色色色色色色综合| AV中文在线| 99热777| 日韩成人中文字幕| 婷婷色在线播放| 开心五月综合| 国产精品第一国产精品| 国产精品久久99| 五月丁香婷婷成人网| 99免费在线视频| 免费看成人747474九号视频在线观看| 亚州精品久久久久AV无码| 九九这里都是精品| 9l视频自拍九色9l视频自拍九色9l社区| AV79| 99热97美女| 丁香五月天殴美激情| 4399在线日本A片| 啪啪五月婷婷| 天天舔天天摸视频| 婷婷激情综合色五月久久91| 五月天综合婷婷| 老师的粉嫩小又紧水又多A片视频| 色日本综合| 天天狠狠色噜噜| 丁香五月成人网| 一区二区免费看| 欧美激情综合色综合| 亚洲妇女熟BBW| 亚洲色综合| 色99视频| XX久久| 婷婷九月丁香| 日韩AV在线免费观看| 这里只有精品视频在线看| 国产AV一区二区三区最新精品| 日韩成人综合网| 91色五月| 99热99热在线观看| 这里只有精品96| www.99热国产| 五月婷性爱| 激情婷婷五月天在线观看| 日日影院 | 思思久久思思| 综合 蜜月 婷婷| 亚洲色情网站| 狠狠狠狠狠狠色| 欧美在线操| 久久狠狠干| 婷婷午夜精品久久久| 五夜婷婷| 日本女色人人| 久久天天| 久久这里这里有精品免费视频| 婷婷丁香六月天| 人妻性爱av网站| 人妻啪啪啪| 色综合色婷婷色伊人| 激情五月天网站| 激情婷婷人妻| 伊人五月婷婷国产视频| 开心五月网| 色七色九九| 97干干干丁香| 成人在线精品| 五月丁香AV在线| www.婷婷五月天,com| 日本色综合| 色色免费网站| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 久久黄色片| 婷婷终合色图| 香蕉人妻AV久久久久天天| 99秘 在线| 丁香五月婷婷婷桃花影院| 激情婷婷五月天| 婷婷综合久久| 九月性爱网| 日韩成人AV在线播放| 狠狠舔| 99热99艹在线观看| 九九操操| 五月婷婷丁香在线| 五月婷成人网| 日本久久高清| 欧美日韩精品一区二区三区钱| 97碰碰在线看视频免费| wwwC0maV五月花| 国产综合视频婷婷| 99艹精品在线观看| 亚洲视频在线观看| 91日本在线观看| 人人添人人| 激情五月婷婷她| www.色婷婷.com| 六月丁香色婷婷| 久久久思思热| 天天射美女| 国产黄大片在线观看画质优化 | 日日操夜夜操不卡| 久久久久9999| 99久久www| 99激情视频| 五月丁香婷婷成人网| 激情的五月婷婷蜜桃| 综合久久伊人| 日碰日| 亚洲综合五月天婷婷| 日日夜夜天天爽| 天堂AV三级| 婷婷伊人视婷婷婷| 亚洲成人日韩无码精品| www...com黄在线观看| 亚洲a色| 久久丁香五月婷| 色香蕉精品五夜婷| 午夜不卡久久精品无码免费| 97人人操人人干| 激情第四色| 久久九九99亚洲国产久精综合| 五月丁香婷婷基地| 超碰com| 天天日P天天射P| 欧美搡BBBBB摔BBBBB| 亚洲综合视频在线| 丁香婷婷视频在线| 综合网亚洲| 五月婷婷丁香综合| 六月婷婷久久| 综合婷婷都市激情| 久久久久久人妻| 色婷婷裸体色性在线| 天天干肏夜夜| 五月天 另类图片| 精品99爱免费视频在线观看| 秋霞影音91人妻久久| 婷婷六月网| 色之综合网| 啪啪综合| 久青操| 日本成人噜噜噜| 夜丁香五月婷婷| 97丁香婷婷| 99欧美热| 日都一级A片| 婷婷色综合网日韩国产| 蜜臀99久久精品久久久久| 婷婷激情六月中文| 一级二级色大片| 日韩综合久| 玖玖五月丁香| 色色激情五月天| 亚洲超碰在线| 婷婷色五月亚洲| 99热在这里只有免费精品| 精品无码av丁香五月激情| 天天射夜夜爽| 99性爱精品| 九九精品网| 欧美这里只有精品| 婷婷免费视频| 久久99久久99久久99| 665566 无码| 中文字幕av网站| 亚洲综合成人网站| 极品色丁香| 袁子仪视频观看| 26uuu欧美亚洲日韩| 五月丁香婷婷久久| 色欲一二三| 色私五月婷婷| 色五月情| 成人五月天丁香| 26uuu国自产精品| 夜夜操夜夜姧| 91人人人人人人人| ztEJj| 婷婷五月精品中文| 99丁香五月婷| 激情五月婷婷六月丁香| 天天色天天日| 99啪在线| 开心久久爱五月天| 色色五月天丁香婷婷| 婷婷五月天久久| 欧美精品在线观看| 色综合久| 人人摸人人摸| 国产成人精品一区二三区熟女在线 | 亚洲av综合网| 六月婷婷九月丁香亚洲综合| 久久小视频| 99丁香婷婷综合网| 激情久久久| 密乳视频| 天天干天天干天天| 色综合香蕉| 久青青久| 丝袜人妻| 久人人操| 久久99色色| 大香蕉婷婷五月天| 成人一区在线观看| 怡红院院久久| 九九成人视频| 五月婷啪啪| 色五月婷激情| 无遮挡国产高潮视频免费观看| 色五月中文字幕| 超级碰碰99| 26uuu丁香婷婷五月| 超色欲天天| 影音先锋色婷婷| 婷婷色女| 99re思思热久久| 无码色| 伊人久久大香线蕉av最新| 久久久性爱视频| 五月丁香六月婷婷精品| 五月天狠狠草| 夜夜撸天天操| 欲色人妻| 婷婷的激情五月| 懂色AⅤ| 五月丁香激情四射| 黄色热99| www.91九色| 丁香六月天AV| 丁香六月婷婷| 欧美顶级少妇做爰HD| 国产综合A片| 日韩av手机在线观看| 亚洲成人网站在线| 五月丁香综合激情| 激情图片婷婷| 五月婷婷黄色| 欧美日韩成人在线| 日日夜夜狠狠| 天天综合亚洲综合网天天αⅴ| 久操福利| 欧美99| 久久久18| 色七色九九| 久久九九国产精品怡红院| 亚洲成人免费电影| 国产亚洲99久久精品| 亚洲免费看片| 丁香五月偷拍| 天天天日天天天干| 97干在线免费| 国产精品VA在线| 丁香五月天婷婷大香蕉| 婷婷六月天| 9l视频自拍9l视频自拍九色学生| 伊人久久99| 97碰成超视频免费视频| 这里只有精品2| 亚洲视频另类| www.色五月| 亚洲天堂无码| 亚洲天堂99| 79亚洲精品少妇| 五月天激情小说| 人妻五月天激情开心网| 久热天堂| 婷婷社区五月天| 亭亭丁香久久五月| 亚洲9久久精品| 色色色色色色网站| 色999亚洲人成色| 狠狠操狠狠插| 五月婷婷六月丁香在线视频| 五月婷婷啪啪啪| 99色婷婷视频| 欧美激情凹凸丁香网| 欧美激情-区二区三区| 久re热视频| 91久久久久久| 久久受www免费人成| 99视频这里只有精品10| 欧美精品999| 婷婷五月天在线观看| 天天爱天天做天天爽| 97性高潮久久久| 97碰超级人人看| 五月香蕉综合| 日韩无码系列| AA丁香综合激情| 夜夜撸天天日| 免费九九热| 亚洲蜜桃精久久久久久久久久久久| 日韩十国产极品久久| 婷婷少妇激情| 超碰免费人人肏| 婷婷丁香六月| 99这里只有精品在线观看| 97黑人精品区| 久久婷五月影院| 综合婷婷久久| 深爱激情网综合| 黄色片区子| 五月丁香久久综合91| 精品久久久999| 欧美天天五月丁香免费观看| 五月天狠狠色| 丁香五月婷婷影视先锋| 91精品久久久久久综合五月天| 婷婷丁香色情五月天| 久久97| 婷婷黄色网| 色99色| 色五月婷婷九月| 99久热这里有精品| 亚洲精品视频在线播放| 亚洲AV无码成人精品电影| 五月天激情婷婷| 亚洲成人五月天| www.国产亚洲69ty.久久久久久久久久久久| 六月婷婷操逼| 婷婷桃色网| 人人操AV| 99熟女| 丁香色五月 97干| 五月天婷婷爱| www.深爱激情| 九月婷婷在线视频| 丁香六月啪| 婷婷九月亚洲| 亚洲天堂色色| 五月婷在线观看| 包操45分钟网站| 综合网色| 狠狠干狠狠色| 色婷婷丁香五月天| 91久久久久久| 精品久热| 婷婷激情肏屄网| 亚洲乱码w在线观看| 久久精彩视频18| 性做久久久久久久免费看| 丁香五月成人社区| 日本高清久久| 夜夜夜夜夜操| 久久伊人大香蕉| 色五月婷婷综合| 91成人视频| 庭庭久久内射| 91chinese在线| 91色五月| 激情丁香婷婷| 久久综合久色欧美综合狠狠 | 色A网| 五月天狠狠网站| 琪琪色五月天| 99婷婷五月天| 丁香五月网| 精品成人无码A片观看香草视频| 开心四月婷婷在线色播播| 99re这里只有精品视频6| 久久永久视频| 色激情综合狠狠婷婷| 五月天激情小说婷婷| 色色日韩| 五月婷婷伊人久久| 9色免费网| 日韩精品呦呦va| 91九九精品| 亚洲免费av观看| 综合一区二区三区| 天天日日人| 婷婷五月天成人动漫 | 色呦精品| 性爱网六月丁香| 婷婷久久精品| 人人爽人人射-美女久久久久久久久久-成人AV| 性婷婷| 五月花丁香婷婷| 操人妻视频91| 性爱综合网| 天天干天天干天天| 婷婷激情五月天激情小说| 操久久精| 狠狠88综合久久久久噜噜噜| 久久久精品色色色| 亚洲免费看片| 999热在线观看视频| www.91AV.COM| 激情深愛五月視頻| 五月天综合在线观看| 激情婷婷久久| www,黄色在线,con| 99熟女视频| 五月丁香av在线| 丁香五月婷婷影院| 婷婷六月天| 色婷婷精| 亚洲无码成人网| 99久久大片| 六月丁香久久| 日韩操啪| 热的国产,热的综合,热的有码| 这里只有免费精品| 天天爽天天| 精品综合爱| 欧美在线干| 9色小视频在线观看| 国产67194| 六月丁香婷婷五月| 国产亚洲99久久精品| 色婷婷aV四虎| 婷婷六月激情啪啪| 婷婷天堂综合| 久久九九精彩| 亚洲色婷婷五月| 久久人妻久久| 久久久婷婷五月亚洲97号色| 俺去啦综合网| 丰满少妇猛烈A片免费看观看| 色情五月天。| 色小说五月天| 激情婷婷丁香五月| 久久久er热| 玖玖爱资源站| 九色在线观看91av| 色吧五月婷婷| 免费看欧美成人A片无码| 超碰免费观看| 影音先锋 91工厂| 亚洲精品国产成人AV在线| 91国产精品视频播放| 国产日批视频| 色999亚洲人成色| 五月婷中文字幕| 色五月婷婷五月| 大操人妻| 九九色热视频| 色亭亭九月| 婷婷 亚洲图片 丁香| 色婷婷激情| 久久久ww| 操操天堂| 大香蕉人人网| 九九热精品视频在线观看| 亚洲成人AV电影网| 国产精品久久久海的味道| 色色色综合| 五月婷婷综合激情| 色久天| 久久九区| 天天日综合| 大香蕉久操| 五月丁香啪啪网| 色吧五月婷婷| 99精品久久| 97资源碰碰| 九九99在线| 五月天婷婷社区| 99热在线爱| 播五月丁香三月婷婷| www:99热视频| av久热| 色欲久久综合| 91丨九色丨43老版熟女| 综合五月亭亭9| 国产黄色在线| 色爱亚洲| 99网址在线看| 99精品网| 丁香五月亚洲天堂| 人妖色AV色综合| 久久综合影院| 五月婷婷干干干| 亚洲人妻AV| 久久综合伊人综合在线| 665566 无码| 五月丁香六月婷婷综合网站| 久久资源网五月婷| 农村熟妇高潮精品A片| 欧美性色五月天| 欧美啪啪网| 夜夜 操无码| 伊人大香五月天| 丁香六月天婷婷色| 超碰93在线观看| 婷婷丁香射射| 九月性爱网| 91丨九色丨丰满人妖| 丁香六月AV| aaa久久久| 欧美色色色色色色| 开心丁五月| 色婷婷91激情小说| 超碰免费在线| 日夜夜久久| 六月丁香大香蕉| 亚洲精品一区中文字幕乱码| 5月丁香啪啪啪| 99久在线精品99re8| www.五月天婷婷| 天天操天天日天天操| 97香蕉久久超级碰碰高清版 | 国外亚洲成AV人片在线观看| 亚洲va国产va天堂va综合va| 五月天婷婷一起草| 色色九区| 怡红院AV亚洲一区二区三区H| 色五月AV| 天天cha成人综合网| 色哟哟性爱av| 婷婷五月丁香激情| 久久天天| 五月天成人在线视频网站| 五月婷婷综合激情| xxx日本东京热| 人人操人| 97干干干丁香| 99热精品无码| 九九精品热播| 思思热精品在线观看| 天天 青草 制服丝袜 在线| 国产99久9在线| 国产美女无遮挡裸体毛片A片| 在线另类视频| 五月天婷婷综合免费| 青青五月天婷婷| 欧美日朝成人| 99ri在线播放| www.久久色.com| 99热 精品在线| 五月丁香啪啪啪| 五月天激情网图片| 天天狠狠干| 热热久久久久久久久| 九九色热| 操B五月天| av免费在线看不卡无毒| 黄网免费观看| 综合网啪| 六月婷婷综合| 五月天婷婷乱论小说| 男女久久婷婷五月天| 五月天色婷婷激情综合| 久久精品婷婷| 综合色播| 综合色久| 激情色色| 、激情六月天| 伊人网欧美在线男人天堂五月丁香| 婷婷精品综合| 色情五月婷| 99五月婷| 色婷婷五月天偷拍| 99熟女视频| 亚洲 视频 导航 一区| 五月婷久草| 婷婷五月天另类网站| 日本网站久久| 欧美激情综合色综合啪啪五月| 天堂色色色| 日本高清久| 丁香大香蕉| 九九亚洲视频| 五月激情丁香| 久久日九九| 九九综合伊人| 久久综合热17c| 久久精品凹凸分类| www夜夜操| 97影院一级片| 精品一二三区久久AAA片| 精品无码人妻一区| 97成人丁香| 精品久久这里热66| 五月天无码| 色吧婷婷五月亚洲| 丁香五月天社区| www.狠狠| 伊人婷婷福利网| 天天色域综合网| h亚洲| 狠狠综合网| 五月婷婷综合潮喷| 丁香婷婷91在线观看视频| 综合大香蕉| 色婷婷888| 色色色99韩| 区区欧美你爱| 26UUU欧美激情一区二区| 在线看片av| 激情视频网址| 五月天狠狠干| 999激情视频| 激情五月综合网| 国产操B| 91免费看片| 26uuu色噜噜精品一区| 激情涩涩网| 美女美女美女三级色天天天天天| 97极品在线| 丁香五月婷婷五月| 亚洲啪啪精品| WWW色五月天| 丁香狠狠色婷婷久久无码视频| 亚洲熟女色| 免费看欧美成人A片无码| 9999综合99综合人| 久久人妻久久久久| 天天日天天干天天天| 狠狠做深爱婷婷久久综合一区| 丰满少妇猛烈A片免费看观看 | 99re这里只有精品在线观看| 8区视频在线| 秋霞少妇AV网站| 色原狠狠综合| 色色色色欧洲| 久久久久这里只有精品| 超碰成人免费| 九色激情网| 一级AV片| 五月天色五月| 色色日本欧美| 久色国产| 草美女在线观看视频在线播放| 2015超碰| 日本熟女啪啪| 黑人巨粗进入警花疼哭A片| 婷婷五月天激情小说| 婷婷色正月| 99久久成人| 久久婷婷五月国产激情综合片| 98永久精品| 亚洲天堂色| 亚洲成人在线播放| 97天堂| 色色色婷婷| www.深爱激情| 日韩AV成人电影| 97色碰| 丁香五月六月婷婷综合| 在线一起草av| 五月噜噜| 五月婷婷激情| 另类丁香综合| 丁香婷婷老熟女综合网| 《战争与艾拉》完整版| 五月天激情小说| 国产三级片91| 五月婷婷婷丁香播| 欧美日韩中国| 99热.com| 日本97人人| 婷婷五月天综合色| 婷婷五月天小说网| 五月丁香啪啪啪综合网| www.日韩国产| 噜噜操操| 欧美五月婷婷| 六月婷婷激情图片| 婷婷五月色| 免费在线观看AV网站| 激情播丁香| 99精品国产在热久久| 欧美丁香婷婷天天操| 欧美日韩成人在线| 99热99在线| 五月丁香亭亭| 色色网站在线免费观看视频| 五月丁香亭亭| 99色色最新视频| 成人网在线观看视频| 精品少妇蜜臀91| 狠狠ri| 成人电影丁香六月天| 99九九精品视频推荐| 色丁香五月婷婷在线| 97偷拍对白视频| 噜噜色婷婷| 五月综合丁| 天天色天天日天天舔| 97涩婷婷婷婷基地| 亚洲九九视频| 色播婷婷大香蕉| 色色色色色网| 婷婷丁香五月六月激情| 久草 tingting| 五月综合久久| 日韩另类| 99热这里只有精品9| 成人午夜天| 91碰人人| 丁香五月婷婷欧美激情-中文天堂最新版在线观看 | 五月亚洲| www.99热在线观看| 天天干天天做| 香蕉婷婷五月| 人人操人人看97干| 久久婷婷亚洲| 天天日日天天| 日日夜夜久| 婷婷午夜精品久久久| 久久这里只有精品99| 亚洲亚洲人成综合网络| 激情婷婷五月社区| 影音先锋综合网| 99热一本| 五月婷婷综合激情网| 激情五月天综合图片小说网站| 天天做 天天爱| 久色激情| 极品少妇高潮啪啪AV无码| 国产婷婷婷| 久久新地此| 狠狠狠婷婷五月综合| 五月婷婷九月婷婷九月婷婷| 国产日韩欧美| 99久久久精品| 丁香啪啪| 五月丁香六月婷婷亚洲| 91久久综合亚洲噜噜成人在线| 五月丁香花视频| 色婷婷最爱五月| 久碰综合| 国产精品美女久久久久AV超清| 六月丁香五月婷婷| 另类在线| 丁香婷婷色五月合集| 婷婷五月综合中文字幕| 亚洲激情AV| 色丁香影院| 欧美五月丁香啪啪响视频| 激情综合网激情五月丁香五月俺也去| 色综合久久44| 丁香五月天在线| 成人深爱丁香五月| 天天肏天天肏天天肏| 日韩性爱AV| 亚洲成人综合在线| 欧美丁香五月| 六月丁香五月亭亭| 激情五月婷婷| 五月天激情啪啪| 精品一区久热| 激情文学久久| 五月天激情无码高清| 67194国产| 五月天另类图片区99| 黄色录像网点| 高清一区二区三区日本久| 在线网黄| 99热这里只有精品99| 米奇影视五月天| 蜜臀A∨在线水帘洞| 久久婷婷网站| 亚洲婷婷婷| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 色九九九综合| 无人区码一码二码三码医生系列| 日日操日日撸| 五月婷婷偷拍| 狠狠的日| 天天狠狠夜夜狠狠2023| 久久欧洲综合网| 精品99爱免费视频在线观看| 五月六月丁香激情视频| 亚洲另类AV| 日韩啪啪视品| 婷婷综合九色伊人| 少妇性按摩无码中文A片| 天天干夜晚夜操| 亚洲成人综合在线| 97干97色| 丁香五月激情婷婷| 婷婷伊人综合中文字幕| 九九人人精品| 综合性爱网| 午夜九九九九九九九九九九九九九| 26uuu最新地址| 婷婷五月天AV激情| 色久五月| 激情综合亚洲色婷婷五月| 六月丁香深深爱| 欧美黑人巨大猛烈cuckold| 五月天开心成人网| 色综合五月婷婷狠狠干| 99久久综合网| 天天免费日日夜夜夜夜| 五月天综合图片| 小视频久久久aaa| 九九無妻| 丁香五月六月激情久久| 欧美日韩AAAA| 婷婷丁香六月| 丁XX 成人| 天天婷婷| 久久99激情| 第四色激情网| 狠狠操狠狠爱| http://www.com久久久精品一区| 丁香五月天久久| 91fuliwang| 99re免费在线视频| 色啪综合| 激情五月网站| 99热无码| 久热黄色| 丁香五月影院| 老师高潮流白浆喷水的A片| 国产AV网页| 亚洲成人日韩无码精品| 黄色91在线观看| 九九久久五月天| 狠狠草婷婷| 26UUU欧美| 九月婷婷久久久| 色月视频| 五月婷婷激情中心| 五月丁香婷婷深深爱| 亚洲激情网| ..真实国产乱子伦对白在线_欧| 色色图五月天| 九九九九毛片| 六月丁香中文字幕| 色色99色色| 天天摸天天日天天舔| 婷婷五月电影| 少妇人妻人伦A片| 国产色99| site:jszngf.com| 色亚洲激情| 99精品免费| 黄色av高清| 色5月婷婷| 激情网综合| 五月婷婷亚洲色视频| 五月99久久| 青青草免费公开视频| 成人短视频在线免费观看| 丁香五月花婷婷开心| 婷婷五月天免费视频| 五月丁香免费看| 久久五月天 91| 人人干人人干骚美女| 亚洲99精品欧美一区| 丰满人妻一区二区三区| 综合婷| 九月婷婷久久久| 人人摸人人干人人做| 婷婷丁香十月| 五月婷婷六月丁香首页| 五月天色婷婷视频| 九九五月天| 五月丁香色色色| 一区二区中文字幕| www.99日本| 激情精品久久| jiujiu无码五区| 日本女人久久| 婷婷五月天丁香综合网| 操笔无码| 五月婷婷基地| 婷婷久久图片| 伊人丁香花综合影院| 国产激情综合五月久久| 都市激情亚洲| 这里只有精品网| 午夜69成人做爰视频| 99无码视频| 国产97色在线 | 日韩| 97精品人人A片免费看| 国产熟女一区二区三区五月婷| 这里只有精品网站| 99原创自拍视频在线观看| 九月丁香| 91精品国产91久久久久青草| 丁香婷婷五月人体| 婷婷五月骚厕所| 无码激情AAAAA片-区区| 五月丁香在线视频观看| 五月色色激情网| 亚洲精品第一国产综合亚AV | 色欲色香,www,com| 日韩精品无码99| 色婷婷五月天| 久久婷婷草| 五月天开心激情综合网| 丁香五月婷婷色综合| 爱草视频在线观看| 一本大道嫩草AV无码专区| 五月丁香手机在线| pom538精品视频| 激情五月丁香色色去久久| 色婷视频| 激情婷婷黄色五月| 毛片九九九九九九九九18| site:esunnet.com| 狠狠操狠狠插| 人妻videos人妻高清| 国产精品18久久久| 天天成人综合| 狠狠草狠狠草| 五月天色色婷婷| 国产精品成人AV在线| 影音先锋毛片网站| 亚洲av成人在线| 91超级碰| 激情第四色| peg 2区三区四区的| 国产AV国片偷人妻麻豆| 中文aV网| 一点色成人网| 另类色视频| 亚洲经典三级| 婷婷射图五月天| 日韩操啪| 97热在线精品| 91操人视频| 五月天婷婷基地| 五月天成人手机在线视频| 黄色片avv| 综合五月丁香六月婷婷| 99久久婷婷综合| www.夜夜.com| 超碰色碰碰| 性色99| 97操碰人人| 国产亚洲99久久精品| 五月婷婷大香蕉| 99精品在线观看| 人人爱天天摸摸天天爱| 九月丁香八月婷婷加勒比| 色婷婷狠狠18| 色V狠狠的干| 国产精品国产成人国产三级| 五月婷综合网| www、丁香五月天| 色五月天丁香婷婷| 五月丁香亭亭操逼| 夜夜穞天天穞狠狠穞AV美女按摩| 色五月丁香在线| 大香伊人婷婷| 丁香五月性| 色婷婷五月网| 婷婷六月综合| 色婷婷基地 | 色色com| 在线成人网址| 久久天天| 啪到高潮激情丁香五月| 99在线视频资源| 欧洲色区| 激情五月天网站| 激情五月天激情网| 31色区视频免费看| 婷婷五月丁香基地| 操逼棍操逼| 十区AV| 一本大道嫩草AV无码专区| 国产在这里只有精品| 综合激情五月四射婷婷| 4399精品一区二区| 人妻久久久久久| 婷婷五月天激情诱惑| 天天射影| 影音先锋日本三级资源| 五月天激情图片| 午夜婷婷五月天| www.色婷婷| 九色porny在线观看激情四射| 丁香五月成人网| 色播五月网| 色高清无码视频| 99在线视频色版| 国产综合A片| 国产av天堂| 色偷偷色婷婷| 这里只有精品免费视频在线观看 | 5月色亭亭视频| www.射伊蕉婷婷| 婷婷激情久久| 亚洲天堂99| 丁香蜜臀黄色婷婷五月天| 思思热久久爱| 在线VA视频| 丁香色六月| 免费亚洲婷婷中文字幕| 久久玖玖综合| 久热天堂| 国产高潮白浆一区二区| 亚洲在线免费成人| 国产精品人人做人人爽人人添| 九九色热| 丁香五月婷婷啪啪| 久久多色| 天天色丁香| 日本天堂免费99| 久久99网| 99这里只有精品视频| 这里只有精品视频99| 色六月天| A A色色| 天天操天天日天天爽| 天堂五月婷婷| 五月亭亭六月激情| 五月丁香婷婷福利| 影音先锋一区二区三区| 九九十99视频| 欧美日韩国产日本精品四虎网网站物| 综合六月久久| 成人网在线观看视频| 无码激情AAAAA片-区区| 综合久久婷婷| 激情综合一| 亚洲色频| 精品人妻久久久久久| 91啪啪视频| 五月天六月婷婷| 99精品视频在线| 五月激激网w'w'w| 婷婷五月情色| 丁香五月综合在线| 日日天天操| 天天操夜夜夜拍拍拍| 六月亚洲| 婷婷伊人激情婷婷| 少妇久久诱惑视频| 1995年关宝慧版蜘蛛女| 五月激情婷婷开心五月| 大香蕉综合在线| 九九Av| www色婷婷久久综合久色| 五月婷婷深深爱爱| 色欲丁香久久| 婷婷五月天论坛| 天天日天天爱天天噪| 久久99热这里只有精品| 五月天婷婷AV| 9|无码久久久久久| 亚洲碰碰碰| 99综合| 欧美性做爰大片免费看办公室| 日本乱子人伦在线视频| 日韩成人精品中文字幕电影| 99热在线观看成人| 中文字幕五月久久婷婷| 九热久| 午夜色色色极品视频| Av性爱网站| 六月婷婷网站| 五月婷婷婷| www.91久久| 人妻AV在线| 六月丁香婷婷爱| 人人插9| 亚洲VA欧美VA| 日日懆天天懆| 久久色9| 在线看片av| 日韩色久| 亚洲激情久久| 丁香深五月婷婷| 91se在线视频| 狠狠色性| 五月综合激情视频在线| www.91色| 亚洲色就是色色色| 色九九七七| 综合激情在线视频| 香蕉综合在线| 开心五月色婷| 五月久久婷婷天堂视频| 欧美99热| 色婷婷成人久久| 色五月首页| 97五月天婷婷| 日本三级韩三级99久久| 99精品热| 国产做爰视频免费播放| 9伊人网| 色播丁香五月婷婷操:屄| 五月天婷婷在线播放| 丁香五月av| 久久久九九视频精品18| 婷婷丁香五月天综合AV| 26uuu.| 人人摸人人干人人做| 五月丁香六月在线| 欧美久久久久久久久中文字幕| 久这里只有精品99| 99久久综合网| 色女伊人| 丁香五月色情| 99丝袜精品视频网站| 91婷色| 激情五月狠狠| 天天日天天插| 变天就操逼婷婷五月| 色五月丁香伊人五月| 色婷婷电影网| 色婷婷综合亚洲| 五月五婷婷| 国产,欧美,学生妹,视频| 五月丁香日本一抹本| 夜夜久久综合网| 色开心五月婷婷丁香HD| 爱的综合网| 丁香六月婷| 九月丁香婷婷| 天天搡日日搡aaaaⅩ| 色色色色色五月| 亭亭五月天黑人2014| 色婷婷成人做爰A片免费看网站| 99九九在线| 亚洲乱码在线观看| 日本99视频精品免费播放| 丁香六月天之亚州热女| 国产黄色在线观看| 色综久久久| 色色婷婷五月天| 人妻射精AV| 婷婷开心激情| 东京热免费视频| 激情五月婷婷| 婷婷的久久网站| 91九色丨国产丨爆乳| 九九色院| 大香蕉久久婷婷| www.97碰碰com| 97热在线精品| 99在线资源| www.99婷婷| 97碰免费视频在线| 婷婷色丁香五月| 国产成人+综合亚洲+天堂| 日韩啪啪网| 五月六月播婷婷| 日本va欧美va国产激情| WWW五月婷婷| 大香蕉啪啪啪| 99热99免费| 91制片厂久久久国产电影| www.狠狠艹| 色五月婷婷91|