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
返回資訊列表
欧洲激情五月天婷婷| 亚洲中文字幕网| 99热伊人综合| 极品人妻VIDEOSSS人妻| 五月天激情小说| 开心激情久久久久久久| 婷婷久草| 秋霞成人毛片一级A片| 丁香五月激情婷婷| 色婷婷成人| 色欲色香伊人| 999影院成人在线影院| 亚洲五月天色| 日本色色色| 欧美精品狠狠色丁香婷婷| 六月婷婷激情| 综合狠狠干| 很很干在线视频| 国产激情在线| 国产精品国产| 91久久电影| 亚洲精品久久久无码| 五月丁香色婷婷久久| 婷婷五月天激情综合| 91色色色18| 九九婷婷五月天| 99精品自拍| 亚洲va欧洲va国产va不卡| 丁香五月六月久久综合 | 香蕉AV777XXX色综合一区| 久久丁香五月天| 天天射色五月天| 五月婷婷高清| 99热久久这里只有精品| 色情丁香五月天| 亚洲综合草草| 久久婷狠狠色| 欧美色色色| 激情啪啪五月天| 婷婷欠久少妇| 亚洲在线成人| 丁香九月激情久久| 99狠狠操一| 色吊丝中文字幕| 99热在线观看| 丁香狠狠色婷婷久久无码视频| 丰满老熟妇BBBBB搡BBB| 国产又色又爽又黄又免费| www.久久久久| WWW色五月| 嫩草AV久久伊人妇女超级A | 婷婷久久18| 玖久久网站| 99精彩视频网站在线| 中字幕视频在线永久在线观看免费 | WWW五月天| 丁香综合婷婷开心激情网| 99啪99| 丁香久久五月婷综合| 婷婷丁香五月天色色| 琪琪色网在线| 九九av在线| 免费看成人747474九号视频在线观看| 亚洲午夜av| 任你爽视频| 人伦30P| 日日干天天射| 天天操夜夜夜拍拍拍| 中文字幕av在线播放| 五月丁香六月激情视频| 久久五月丁香| 视频1区2区| 老妇操B| 99精品一二三四视频| 2017狠狠干| www.91操| www.成人婷婷综合| 思思热在线观看| 九九色色| 色99婷婷五月天| 99热99久久| 人人干天天舔| 开心五月网| 99九九在线精品热动漫| 国熟女视频| 俺也去综合| www.亭亭五月天| 天天爽夜夜爽夜夜爽精品视频| 婷婷五月,偷窥偷拍网| 人人操99| 日韩欧美婷婷丁| 91久久九久久九久久九久久九久久| 91九九| 深爱激情四射| 色五月婷婷操逼| 开心五月天激情网| 久9热视频在线观看| www.粉嫩av.com| 激情开心五月亚洲| 五月色网| 51XX午夜影福利| 丁香五月婷婷色综合基地| 激情五月天伊人影院| 狼人狠狠操| 欧美搡BBBBB摔BBBBB| 久久久噜噜噜操操操| 婷婷丁香宗合888| 欧美色骚婷婷五月天| www.99成人视频| 五月天社区| 色婷青青| 五月丁香婷婷五月色| 激情五月丁香六月综合AVXXXX| 久热9| 婷婷五月18永久免费网站| 播五月婷婷开心| 五月天成人网在线观看| 大香蕉色婷婷伊人在线| 天天草天天爱| 五月天激情综合网| 他改变了拜占庭| 婷婷性色| 综合www色| 六月婷婷私欲| 99燥99日| site:ornaments52.com| 噼里啪啦完整版中文在线观看| 91 原创 在线 九色| 丁香网五月网| 亚洲xx在线| 激情六| 日日夜夜天天| 4399亚洲视频| 色狠狠色| www.粉嫩av.com| 另类图片五月天| 97超级碰人人| 激情五月天无人视频在线| 51精品国自产在线| 26uuuu精品一区二区| 婷婷五月天丁香| 成人网站av免费网站推荐| 色欲资源网| 色色操| 啪啪91| 日本三级中国三级99| 婷婷丁香五月天色色| 丁香五月六月激情| 色综合色综合色综合| 婷婷五月天激情AV影院| 色五月噜噜| 婷婷成人五月天一区| 色婷婷狠狠| 99精品视频免费在线播放| 熟女激情网| 蜜臀av粉嫩av懂色av| 人人爽欧美婷婷久久久五月丁香| 第1影院之五月婷婷| 曰日爽日日操| 亚洲av网站在线观看| 2020日日干| 久久综合五月| 五月丁香人妻| 天天干天天 亚洲| 欧美S码亚洲码精品M码| 开心色五月天久久久久久久| 精品亚洲国产成AV人片传媒| 色色色免费视频| 久久狠狠欧美| 69热91天堂| 99日韩网站| 婷婷色狠狠| 久久金品黃色| 丁香六月婷婷激情综合| 婷婷影院A成人| 99热99热99热99热| 五月丁香久人妻中文| 色婷婷av在线观看| 伊人午夜综合色啪| 色婷婷六月天| 婷婷五月色播天| 婷婷色正月| 五月丁香综合影院| 一点色成人网| 久热 91| 99综合网| 午夜]香婷婷深深爱| 99re鈥哸鈥唙| 99色看这里只有精品| 日本色色色色色色色色一色二色| 另类激情五月| 91主播在线| 五月婷婷九九热| 啪啪啪大香蕉| 色色色色色色色色色色色色色五月天| 色五月婷婷久久| 婷婷五月天在婷| 色五月欧美| 婷婷久久综合| 五日激情综合| 精品51XX| 99无码免费视频| 婷婷五月丁香人妻无码高清| 九九热最新| 国产精品色婷婷AV综合色色| 激情美女五月天| 色综合网页| 久久久999精品| www.夜夜操.con| 天天久久九九| 亚洲国产精品二二三三区| 丁香六月综合| 亚洲色模骚货| 第四色婷婷色五月| 人人人操Av| 婷婷丁香五月天色色| 婷婷丁香五月亚洲17cao| 啪啪激情网站| 国产精品噜噜在线视频| 玖玖在线视频| 激情久久肏屄视频| 色玖玖综合| 精品国产一区二区三区四区阿崩| 夜夜撸夜夜骑| wwwss在线观看| rr天天操| 五月天婷婷人妻| 老司机午夜福利视频金瓶梅| 99ri在线| www.zbzhongsen.com| 91久久国产自产拍夜夜91久久精品文字>91麻豆精品国产 | 深爱激情av| 亚洲六月婷婷| 日韩综合久久| 91久久综合亚洲鲁鲁五月天| 成人在线视频一区| 久99精品视频| 国产色99| 色色色色色综合| 五月四色激情| 丁香五月婷中字在线| 亚洲色视频| www.9797国产| 亚洲在线操| 五月婷婷亚洲| 五月婷婷六月天| 亚洲成人五月天| 另类图片婷婷五月天| 天天爽天天弄| 色五月婷婷视频| 婷婷五月天美女| 久久停停超碰| 五月天婷婷黄色视频| 99色热视频| 26uuu亚洲欧美| 中文久久久人妻| 久去色色| 丁香成人综合| 日日夜夜爽爽| 99爱在线免费视频| 狠狠爱婷婷爱| 天天爽夜爽| 激情色色| 极品人妻VIDEOSSS人妻 | 欧美婷婷五月无砖| 激情五月com| 六月婷婷影院| 五月亭亭网成人在线视频| 国产色色色色| 97人人看| 色激情五月天| www.韩日视频| 99综合网| www夜夜操| 成人免费120分钟啪啪| BBWCUCKOLD精品熟妇| 拍真实国产伦偷精品| 69精品人人人人| www色婷婷| 农村熟妇高潮精品A片| 国产精产国品一二三在观看| 中文字幕av久久爽| 九九RE视频在线精品| 久久久思思热| 午夜激情五月天| 五月天四色房丁香亭亭| 五月婷婷大香蕉| 婷婷亚洲天堂| 中文字幕天天干| 玖玖99免费视频| 色色丁香| 激情五月综合网最新| 能看的av网站| 欧美色色色| 久久九九99视频| 婷婷久久影院| 五月丁香成人日| 亚洲经典小视频| 国产.亚洲.欧洲视频在线| 91色综合| 久久九九99.www| 91.com男女操| 丁香六月婷婷色XXXX| 天天插综合网| 丁香五月花| 99热九九九九| 色婷婷五月天激情久久| 精品99在线| 成人综合网站| 久久久激情| 日韩小视频在线99| 天天色天天操天天射| 热99视频精品在线| 色色色欧美| 狠狠色噜噜狠狠| 五月丁香啪啪激情| 野外99热| 日韩乱玛久久| 国产日产亚系列精品版优势| 美女网黄| 婷婷久久五月天| 最近韩国日本免费高清观看| 中文资源在线a | 久久精品五月天| 五月丁香六月婷婷色| 丁香激情五月| 91人人爽人人操| 色色色在线免费视频| 四月婷婷五月丁香| 狠狠综合久久综合| 丁香五月六月婷婷殴美综合| 国产AV一区二区三区最新精品| 丁香六月激情四射| 色五月婷婷五月天| 亚洲另类av| 五月丁香久久久| 五月天激情综合| 91碰碰视频| 亚洲亚洲人成综合网络| 夜夜干夜夜操| 激情综合色网| 91操网| 久久全色| 99精品在线观看视频| 高清资源站日A美A欧亚…| 97人凄人人操人人爽| 精品人妻久久久久| 日本道久久91| 成人五月天视频播放| 午夜69成人做爰视频| 亚洲中文av| 综合色影| 99热久草| 性视频久久| 98永久精品| www,99热| 激情婷婷五月少妇| 在线观看av网站| 色五月婷婷天堂| 亭亭五月天成人| www.金莲av| 婷婷六月激情丁香| 综合五月激情| 思思热在线播放| 我淫我色婷婷五月天激情四射| 激情婷婷人妻| 麻豆AV一区二区三区| 色婷婷婷婷成人网| 色99最新网址| 五月天激情视频| 天天se在线视频| 热99在线精品| 色综久久AV| 超碰99在线| 亚洲综合网激情小说| 激情五月激情综合网| 日本色噜| AV亚洲在线| 26uuu国产激情视频| 丁J香六月首页| 综合网亚洲| 99热在线资源| 99ri视频| 99av视频| 大香蕉综合在线| 精品久久人妻| 操啊操av| 激情伊人| 六月婷婷色色网| 午夜五月天| 久久久久98| 亚洲五月天激情| 这里只有精品99www| 665566 无码| 日本色爽| 天天日综合网射| 婷婷99视频在线| 五月婷婷无码| 久久99这里只有精品| 在线成人va| 婷婷在线激情| 欧美天天干五月丁香| 九色激情| 丁香六月啪啪| 激情爱爱网站| 99热这里有精品2| 97碰成超视频免费视频| 国产亚洲精品久久久久久豆腐 | 色五月婷婷婷婷| 五月天另类图片区99| www.色婷婷| 久热这里只有精品视频免费观看| 人人爽在线视频综合网| 色五月婷婷1| 九九AV| 激情五月影院| 天天综合天天玩夜夜玩天天玩夜夜玩 | 伊人婷婷激情| 久碰久操| 国产在线视频1234| 中文字幕有多少字| 色吧五月婷婷| 久久伦乱| 五月丁香啪啪网| 亚洲激情淫网| 大香蕉久艹| 99热色综合| 天天爽天天干| 啪啪激情综合| 五月天网站免费欧美| 深爱丁香网| 五月婷婷导航| ady狠狠入| 大香蕉人妻| 99超级碰碰| 久久网思思| 他改变了拜占庭| 视频1区2区| 天天插操| 五月天色小说| 亚洲精品无AMM毛片| 久久久中文| 色久丁香五| 五月丁香激情在线| 五月婷婷综合色拍| 婷婷丁香六月激情综合| 玖月婷婷爱丁香| 91丨九色丨熟女|老版| 丁香六月成人| 国模狼狼| AV网在线观看| 综合激情四射一theav| 中字幕视频在线永久在线观看免费| 久九色| 亚洲六月婷婷| 在线天堂9| 五月天六月婷婷| 久热A| 丁香五月天激情小说| 天天爽天天爽天天爽天天爽天天爽| xxxx久| 日熟女| 亚洲黄3级片网站欧美| 日本色超碰| 97偷拍对白视频| 免费日本aⅴ中文字幕 | 欧美六月婷婷| 五月狠狠| 亚洲精品亚洲人成人网| 丁香五月婷婷深爱综合激情| 丁香五月激情天AV无码| 亚洲 激情 中文| 精品无码av丁香五月激情| 五月婷婷色播视频| 春色激情第四色| www·五月天| 人人看人人草人人摸| 中文字幕色色色| www色五月天| 婷婷色爱| 欧美三日本三级少妇三99| 婷婷娌伦网| 26UUU欧美激情一区二区| 丁香婷婷色| 97人人干人人操| 91丨九色丨43老版熟女| 免费在线观看av网站| 天天综合色99| 婷婷伊人中文字幕| www.日韩艹| 综合激情网激情五月。| 97干在线观看视频| 亚洲激情综合| 99热全是精品| 婷婷日在线观看| 天天模,夜夜模夜夜爽| 夜夜撸日日骑| www.99热视频| 久热婷婷综合| 9久国产| 9色在线视频| 国产毛片精品一区二区色欲黄A片| 五月丁香影视| se99热久久一本| 婷婷亚洲天堂| 99亚洲无码| 九九人人精品| 影音先锋91在线资源站| 五月久熟女| 婷婷激情五月天在线视频| 日本激情五月| 人妻无码精品一区| 五月丁香婷婷老司机| 人妻视频在线| 色婷婷AV五月天| 亚洲成人中心| 久久久久久久久久久久久9| 大香蕉九九操| 亚洲一区二区无码蜜乳av| www.色婷婷| 欧美经典片免费观看大全| 免费操超碰| 久激情网| 91九色成人原创视频| 天天玩天天摸| 五月婷婷成人| 在线五月婷| 五月婷婷开心深| 播播网色播播| 99久久婷婷精品视频| 9 1超碰九色| 激情五月婷婷六月丁香| 熟女人妻视频| 激情五月综合视频| 91超碰人人操| 激情久久 婷婷| 色婷婷五月天堂资源| 五月天激情电影| 亚洲成人无码片| 日日干夜夜撸夜夜骑| 美欧日韩国产成人在战| 久久精品天| 五月综合激情视频| 免费无码毛片一区二区A片| 色五月天堂| 婷婷丁香小说| 9久热在线视频| 五月综合激情图片 | 色五月婷婷五月天激情综合| 久久9热好| 亚洲五月天第一综合干| 狠狠综合| 色碰碰视频| 五月丁香婷草| 欧美大香蕉视频| 五月婷婷在线免费| 婷婷狠狠爱| 久久这里有精品99| 成人AV播放| 伊人丁香婷婷东京| 亚洲精品又粗又大又爽A片| 五月天激情播播网| 久色网| 人人色人人摸人人看| 中文字幕AV在线播放| 激情图片久久| 久久婷婷色色| 超碰在线成人| 丁香婷婷色五月激情综合| 激情综合区| 殴美日韩成人| 色综合色五月| 六月天婷婷| 婷婷五月天激情文学小说| 婷婷金品综合视频| 26uuu四色| 狠狠狠狠狠| 激情的五月| 久久AAAA片一区二区| 亚洲视频丁香网va| 影音先锋秋秋五月婷婷| 天天草比天天爽| 亚洲视频1区| 亚洲精品婷婷| 操逼毛片国语对白| 久久久久婷婷| 九九热视频免费的| 91视频久久久| 六月丁香激情网| 99在线视频免费| 99久久66综合| 一本色道久久综合狠狠躁小说| 亚洲无码黄色| www.激情| 天天综合网网欲色| 玖玖爱伊人| 九九色色| 久久色情综合免费网站| 日韩性视频| 五月丁香综合啪啪| 亚洲天天综合| 欧美久久婷婷| 久久五月婷6 9| 色综合天天综合成人网| 大香蕉综合| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 婷婷五月激情五月激情| 综合色色婷婷| 久久久国产精品黄毛片 | 亚洲V国产V欧美V久久久久久| 精品一区二区三区木瓜| 七七九色| 婷婷色五月综合| 色五月成人| 欧美大奶熟女噜噜噜噜| 超级碰碰99| 色婷婷久久| 狠狠干 狠狠操| 日本人人干| 成人国产欧美大片一区| 婷婷综合一二三| 亚洲AV激情五月综合网| 久久精品91视频| BBWCUCKOLD精品熟妇| 婷婷五月六月丁香| 人妻肉射免费观看| 婷婷五月天黄色| 五月婷婷亚洲天堂97色婷婷| 综合激情五月天| 婷婷丁香五月综合网上 | 伊人久久大香线蕉精品| 99性色| 午夜丁香婷婷| 桔色成人官方网站| 九月婷婷久久久| 日本99婷婷| 色一情一乱一伦一区二区三区| 综合久久99| wwccc久久久| 97干97色| 欧美性久| 久久丁香网| 欧美成人AAA片一区国产精品| 棕合影院色色| 91干网站| 免费无码毛片一区二区A片| 一区二区乱码视频| 天天插天天射| 深爱激清网| 五月丁香亚洲五月| 激情深爱综合| 综合亚洲色色| 九九激情综合| 激情av在线| 亚洲无码猫咪| 色五月 婷婷, 大香蕉| 久久女婷| 成片免费观看视频大全| 狠狠干,狠狠操| 婷婷色影院| 超碰免费人妻| 色婷婷综合久久久久| 激情五月婷黄版| 性色五月天| 久久人妻视步| 天天插综合| 91成人性爱视频| 欧美va在线| 99色亚洲| 天天舔天天摸| 伊人网大香| 亚洲六月色婷婷| 99九九在线精品热动漫| 九九热99视频| 99精品无码| 久99| 国产成人综合电影| 色五月婷婷丁香凹凸| 麻豆忘忧草午夜| 超碰国产av| 极骚大香蕉伊人| 婷婷五月激情四射手| 婷婷五月激情黄色| 亚洲色区17| 丁香五月电影院在线观看| 91在线日本| 激情六月丁香| 亚洲激情丁香五月天色| 天天碰天天插天天操| 激情小说 五月天| 亚州操人在线视频| 久9久成人精品视频| 九九黄色网| 图片区 小说区 区 亚洲五月| 日日躁夜夜躁狠狠久久AV| 久久久91精品| 97欧美在线| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 玖玖爱资源站| 婷婷五月天影院| 91操黄| 日韩成人电影av| 激情五月丁香社区| 激情婷婷五月天网址| 开心五月色婷婷综合开心网| 超碰爱爱爱| 五月丁香婷婷综合| 91操女| 五月丁香婷婷色色色| 99丁香五月婷| 99精品小视频| 色色激情| BBWCUCKOLD精品熟妇| 在线观看中文字幕| 97人人超| 色婷婷AⅤ| 狠狠爱激情网| 五月婷婷丁香在线视频| 操操操Av| 欧美人与性动交CCOO| 一起草日本| 丁香婷婷色九月| www.狠狠狠狠| 丁香五月情| 深爱五月婷婷| 久久狠婷婷| 丁香五月天人体| 。久久久久久久久久久久久久人妻| 日韩 中文 欧美| 五月天大香蕉av| 日本44久久在线| 大香蕉av在线| 玖玖资源在线视频| 99热久久这里只有精品| 丁香婷婷久久综合在线| 五月视频日本免费观看| 超碰日日操| 欧美 日韩 人妻 高清 中文| 日本一级一片免费视频| 五月丁香激情婷婷| 超碰人人色| 热久免费视频9| 深爱 五月天| 六月丁香激情网| 久久久国产精品黄毛片| 99超碰人人| 五月四色婷婷| 色五月成人| 国产麻豆视频| 成人电影一区| 99久久久久久www| 夜精品无码A片一区二区蜜桃| 中文字幕97超级碰| 激情婷婷五月色| 欧美日韩91| 丁香五月黄色| 婷婷五月天电影区小说区| 97碰碰视频在线观看| 日本三日本三级少妇三级66| 色久在| 日本狠狠色| 国产一区18| 女人天堂 AV| 色综合色色| 久久综合九九| 色色日本欧美| 99人人操人人操人人精| 婷婷综合在线观看视频| 人妻丰满精品一区二区A片| 色情久久久| www..999热久| 久久五月情| 色综合色综合色综合| 99精品视频播放| 侠女刀之记忆电影在线看免费| 色婷五月天| AV在线观看网站| 婷婷五月激情网| 大香网伊人久久综合| 91ncom.色| 强伦轩人妻一区二区电影| 成人网丁香五月| 色五月婷婷亚洲最大| 色婷在线视频| 一起草无码| 另类视屏| 激情久久久久久| av免费在线网站| 日韩 中文 欧美| 琪琪色影音先锋| 色色AV色色色东莞| 黄色一级影片| 六月激情综合| 日韩操人| 天天干狠狠| 91操色| 99在线资源| 欧美激情丁香五月| 五月天婷婷色| 久草狼人| 日日操天天操| 婷婷色在线| 99精品视频在线观看| 丁香六月色香蕉视频| 最近中文字幕大全免费版在线 | 99在线看视频| 色99综合视频| 五月天堂六月丁香亚州中文字幕久久 | 人人舔天天| 99re视频在线精品| 狠狠色综合精品视频在线| 91嫩草久久| 综合网五月| 亚洲日本激情| 亚洲av电影网站| 五月天激情AV| 操操人人| 伊人五月综合网| 热99这里只有精品视频| 秋霞九九无码| AV在线大香蕉| 久久精品性爱视频,| 色五月婷婷成人| 26uuu另类| 综合AV在线| 亚洲色另类| 99热在线这里| 婷婷五月天影院| 天天综合网、天天综合色| 96丁香六月婷婷蜜桃综合久久| 天天插天天很| 99ri在线播放| 五月激情影视| 色婷婷成人五月| 色色色综合网| 五月久久| AV在线观看网站| 色婷婷六月综合| ′久久99一| 九九精品热| 国产午夜精品一区二区| 伊人婷婷色激情丁香| 丁J香六月首页| 99热日本| 五月婷婷影视| 91人妻PORNY九色大屁股| 激情五月婷| 91青娱乐青青草| 深爱激情五月天婷婷网| 91艹人| 激情五月婷婷视频| 色色色五月婷| 人妻VideOssS人妻高清| 激情六月丁香| 丁香花狠狠婷婷亚洲中文字幕| 丁香婷婷色情| 人妻肉射免费观看| 日本高清久| 天天揷综合网| 五月天色官网| 久久99综合| 97香蕉人人在线观看| 91狠狠综合久久久久久| 久久激情五月| 成人欧美一区二区三区在线观看| 丁香五月中文字幕| 日日做A爰片久久毛片A片英语| 激情开心五月天| 六月婷婷中文字幕| 婷婷性爱五月天| 亚洲婷婷在线播放十月| 成人欧美日韩| 五月天伊人综合| 五月丁香综合激情| 婷婷色五月天在线观看| 色综合色色| 色丁香婷婷| 嫩BBB槡BBBB搡BBBB视频| 久久久久婷婷| 色情综合| 成人色图情色成人网 www.5b5b5bcom 五月天 | 99热这里只有精品22| 妻久久人久久| 96人人操人人操人人| 日韩成人AV在线| 狠狠色综合久久久久| 欧美顶级少妇做爰HD| 五月天狠狠| 国产精品视频| www婷婷| 综合五月婷婷| 婷婷五月丁香在线视频| 99精品视频在线| 99色热视频| 亚洲第一色色色| 玖月婷婷爱丁香| 五月激情丁香六月狠狠干| 激情视频91| 在线天堂9| 亚洲视频码| 超碰成人在线免费观看| 天天日天天肏天天奸| 丁香五月婷中字在线| 丁香五月停停av| 国产婷婷色综合AV蜜臀AV | 清色五月天| 婷婷九月激情| 伊人丁香婷婷东京| 五月色情婷婷开心五月色情| 婷婷五月天成人动漫 | 99热九九在线| 婷婷综合另类| 182TV大香蕉| 亚洲人妻AV| AV五月丁香| 五月婷婷无码| 婷婷99狠狠| 丁香丁香激情网| 免费视频WWW在线观看网站| 91丨九色丨大屁股| 99操逼视频| 热久久这里只有精品| 天天操天天插| 国产精品美女| 久久人人看| 日日爽日日爽| PORNY九色9l自拍视频成人| 深爱婷婷网| 思思热视频在线| 在线看片h站| 九九成人电影婷婷| 2022人人操人人看| 色五月天.con| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 玖玖热视频| va亚洲中文在线| 狼人婷婷综合| 五月丁香六月香香蕉| 超碰免费在线| 五月婷婷电影院| 六月婷婷九月丁香| 五月五婷婷网| 【乱子伦】黄色| 人妻操逼视频| 国产午夜精品一区二区| 狠狠色色| 久久六月天| 26uuu最新地址| 1024AV视频| 操人精品| www.狠狠操.com| 五月婷婷视频ab| 九色婷婷| 激情婷婷99| 五月婷婷色综图片| 色五月婷婷在线视频| 99色在线观看视频| 日本色色色| 99热偷拍| 热99热久| www。88热在线视频免费观看| 久久伊人日日夜夜| 人妻综合网| 国产毛片精品一区二区色欲黄A片 国产人妻777人伦精品HD | 久久五月丁香综合17C| 99爱精品| 亚洲综合五月天婷婷| 久久区区一二三av| 99操视频| 另类激情码| 久久婷婷丁香五月一二三| 欧州色色| 538在线精品| 色婷婷综合丁香五月天| 色 五月俺去也| 五月丁香中文| 天天综合网站| 91久久久久久久| 五月天久久丁香| 偷偷与邻居做爰完整视频| 亚洲精品国产成人AV在线| 五月婷久久| 狠狠色婷婷| 国产欧美大香蕉一区| 五月丁香六月婷婷中合网| 91超碰在线观看| 91碰免费视频| 99热在线99| 丁香五月天啪啪a日本| 激情文学综合婷婷五月天丁香花| 无码se| 婷婷五月天日本无码| 野战J办公桌椅H| 婷婷的99视频网站| 成人一级片| 久久性刺激| 日日夜夜爽| 国产精品男人AV不卡| 无码激情精品色婷婷久久久久| 另类激情五月| 123草逼网| 日韩欧美成人片| 亚洲av另类在线观看| 亚洲激情五月丁香久久久久| 色九九综合| www.99婷婷| 色情五月丁香| 丁香五月婷婷Av| 五月婷婷五月天| 久久综合色五月| 六月合五月婷| 丁香五月天激情四射网络不好| 一区二区三区四区五区| 成人做爰A片免费看视频| 中文字幕丰满乱孑伦无码专区| 五月丁香婷婷网在线在线| 999久久久国产精品| 五月天激情四射网站| 99视频综合网| 欧美色性色好| 人人妖人人97| 开心五月深爱婷婷| 琪琪色影音先锋| 五月天五月天成人网亭亭成人色网站| www.ywav| 五月丁香六月色| 综合色七七| 激情综合五月婷婷六月丁香 | 久九九热| 啪啪激情网| 亚洲另类婷婷综合| 久久曰曰| 久久久久久综合五月婷婷| 99视频在线观看地址| 天天日日综合| 99热新网址| www.综合久久.com| 综合网五月| 天天爽曰日爽| 国产麻豆视频| 丁香婷五月天开心六月| 日本A片一区| 影视av久久久噜噜噜噜噜三级| 五月六月播婷婷| 欧洲色| 丁香婷婷在线| 久久久宗合| 五月丁香婷婷在线| 五月天a婷婷伊人| 亚洲 成人 电影av在线观看| jiqingliuyuetian| 激情久久久久久| 国产乱妇乱子在线播视频播放网站| 成人婷婷深爱综合网| 五月婷久草| 激情伊人五月天| 这里只有精品,日韩视频| 在线中文字幕免费视频| 五月丁香av中文| 啪啪色激情五月天| 婷婷不卡基地| 丁香色五月 97干| 欧美色播综合在线观看| 色五月,婷婷大香蕉| 色播播五月天| 精a品a| 日本三级韩三级99久久| 五月停停大香蕉| 日韩久久视频| 五月婷婷视频啪啪美女| 九九人人自拍| 久久电影4399| 天天干肏夜夜| 久久停停超碰| 久久久香| 97五月天婷婷| 婷婷八月激情| 欧美色激情四射| 亚洲综合五月天婷婷丁香| 思思热再线视频| 丁香六月婷婷色播| 国产毛片精品一区二区色欲黄A片| 小视频久久久aaa| 欧美色色色色色色色色色色| 国产精品久久久爽爽爽麻豆色哟哟 | 五月丁香婷婷成人伊人网| YW无码| 亚洲精品色| 91婷色| 五月天自拍网| 五月天激情小说| 色综合色婷色基地| 激情综合网色播五月| 激情久久丁香| www,26uuu,c0m,色情| 91大神操美女| 五月丁香视频色色| 91男同视频| 免费AV在线| 九九99视频| 大香蕉院线| 亚洲另类婷婷综合| 五月婷婷九九久久| 91久久网站| 国产成人AV在线| 婷婷五月天激情小说| 五月婷婷狠狠干| 欧美日韩成人在线| 69久久99精品久久久久婷婷| 中文字幕在线人妻| 99热欧美| 99久久这里只有精品| 99在线资源| 色五月婷激情| WWW.开心五月天.COM| 婷婷五月天va| 停停六月 综合| 开心激情站| 色情五月综合婷婷| 丁香五月电影| 色五月AV| 五月天婷婷视频| 79色色色色| 五月丁香久久久日婷婷久久婷婷日| 五月天激情国产综合婷婷婷就去爱| 另类专区在线| 综合 蜜月 婷婷| 国产亚洲av片| 男人天堂 久久| 丁香六月婷婷操逼网| 激情婷婷综合| 色情丁香五月天| 婷婷五月天丁香社区| 久久综合9| 五月婷婷丁香五月| 人妻操日日| 人人操人人妻| 五月天色色色网| 丁香五月综合激情久久潮喷| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 国产精产国品一二三在观看| 99精品偷自拍| 五月天大香蕉| 99婷婷精品推荐在线视频| 婷婷五月丁香综合网| 久9热插入| 五月天婷婷青青草| 99在线综合视频| 综合色网站| 嫩草视频观看| 婷婷丁香在线| 五月婷婷新网站| 99视频在线观看视频| 五五月五月| 色五月婷婷内射| 99色 | 五月婷久久| 丁香久久AV| 丁香美女主播视频在线观看| 五月丁香六月停停| 久久美女五月天| 成人亚洲精品| 婷婷激情综合网| 欧美五月婷婷| 亚洲中文字幕网| 亚洲无AV在线中文字幕| 激情综合五月丁香六月婷婷| 亚洲成人网站在线| 色五月激情视频在线综合| 中文字幕在线播放视频| 九九精品片一| 99热这里只有免费精品| 婷婷五月丁香综合激情| 99在线精品视频| 日本久久色| 超碰激情五月| 九九碰九九爱97| 99热777| 天天搡日日搡aaaaⅩ| 狠狠色色| 欧美婷婷丁香五月| 五月综合激情视频| 性色九九| 狠狠色噜噜狠狠| 综合激情五月丁香9999久久精| 六月五月久久丁香| 五月婷婷综合在线| 婷婷六月色| 另类少妇人与禽zOZZ0性伦| www.91AV.com| 激情五月天婷婷直播| 开心五月色婷| 五月婷色激情五月| 九色婷婷| 狠狠婷婷日韩| 亚洲综合在线伊人婷| 思思99精品视频在线观看| 五月激情综合美女久久| 亚洲高清在线| 97超级碰人人| 亚洲综合激情五月久久| 五月天综合图片| 高清无码网址| 亚韩精品视频1区| 婷婷九月丁香| 六月婷婷在线| 1000部毛片A片免费观看| 中文字幕在线视频播放| 色色激情网| 思思久热6| 丁香五月婷婷偷拍| 欧美日本韩国亚洲| 99色在线| 亚洲精品无AMM毛片| 伊人青涩网| 色播五月天天| 五月天色社区| 最新日韩久热免费视频看看| 久久综合激情五月天| 99视频激情四射| 人人操人人妻| 九九综舍久久| 91久久婷婷人人澡草| 婷婷五月天在线观看| 久久婷婷婷| 伊人久久五月天| 五月天偷拍| 久久香蕉网| 亚洲人人操| 中文字幕有多少字| 香蕉婷婷色五月| 婷婷五月丁香综合| 五月丁香在线观看99| 色五月天天| 超碰人人在线| 六月婷婷色综合| 色综合中文| 95精品区一区二| 一本道综合网| 丁香六月婷婷综合| 久久激情五月| 婷婷五月天第三页| 日本色超碰| 亚洲性图一区二区| 亚洲深喉aV| 亚洲日韩国产黑丝黑丝AVAV一区二区三区| 色婷婷色综合久久精品V| 天天狠天天狠| 色婷婷在线视频| 婷婷色偷拍| 九九热精品视频| 欧美久人人| 五月激情婷婷国产精品久久久久久| 538在线精品| 五月天激日本色情在线| 色婷婷六月天| 婷婷丁香五月天婷婷| 99热这里只有精品22| 婷婷狠狠97| 9久热在线视频精品| 婷婷久久五月天丁香| 色色丁香婷婷综合| 激情99热| 99精品免费视频| 五月婷婷亚洲色图| 这里只有精彩亚洲视频推荐|