99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

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

uC/OS-II互斥信號量與優(yōu)先級繼承:從優(yōu)先級反轉(zhuǎn)實測到OSMutex源碼

uC/OS-II互斥信號量與優(yōu)先級繼承:從優(yōu)先級反轉(zhuǎn)實測到OSMutex源碼 1. 第 8 篇為什么繞不開互斥信號量一次真實的優(yōu)先級反轉(zhuǎn)這個系列寫到第七篇uC/OS-II 里那些看著眼熟、真問起來又說不清的骨架已經(jīng)拆得差不多了目錄怎么分層、上電之后一路走到 OSStart 的啟動鏈、OS_TCB 和 OSRdyTbl 怎么用兩個字節(jié)裝下 64 個優(yōu)先級、OSSched 憑什么用常數(shù)時間找到最高優(yōu)先級任務、PendSV 里那幾行匯編怎么把棧指針換來換去、OSTimeTick 和 OSTimeDly 怎么配合以及第七篇那個只當模板用的 OS_EVENT 事件控制塊。前面攢下來的最大懸念是OS_EVENT 自己什么都不干真正干活的是掛在它下面的具體對象——信號量、互斥量、郵箱、消息隊列。第八篇就從這堆對象里挑一個最容易被低估、也最容易在項目里出事的家伙互斥信號量 OSMutex以及它背后那套優(yōu)先級繼承Priority Inheritance ProtocolPIP。選它不是因為代碼多——整個 uC/OS-II 內(nèi)核骨架算下來六千多行不同版本和裁剪配置會差幾十行os_mutex.c 連注釋一起也就三百行上下——而是因為它解決的是 RTOS 領域最經(jīng)典的實驗室能跑、上壓力測試就炸的問題優(yōu)先級反轉(zhuǎn)。這篇適合三類人看一是剛啃完信號量、正準備把信號量當萬能鎖到處用的新手二是移植過 gd32f103 或者 STM32F103 上的 RTOS、但從來沒認真讀過 os_mutex.c 的嵌入式工程師三是正在準備面試、被uC/OS-II 的互斥量為什么創(chuàng)建時要傳一個優(yōu)先級這類問題卡住的人??赐曛竽銘撃茏龅皆谧约旱陌遄由蠌同F(xiàn)一次優(yōu)先級反轉(zhuǎn)再用互斥量把它消掉并且能用示波器或者串口打點把兩者的差別量出來。1.1 前七篇留下的坑信號量到底解決不了什么二值信號量OSFlag 之前的 OSSem初值為 1是實現(xiàn)互斥最直覺的做法誰要進臨界區(qū)先 OSSemPend 拿一下出來 OSSemPost 放一下語義上完全夠用。問題出在夠用這兩個字上——OSSSem 只管有沒有不管誰拿著。假設三個任務L低優(yōu)先級編號數(shù)值大比如 15、M中優(yōu)先級10、H高優(yōu)先級5。L 先拿到二值信號量進了臨界區(qū)準備訪問一塊共享的 SPI Flash 或者一段共享緩沖區(qū)這時候 M 因為某個外部事件被激活了它不碰這塊共享資源純粹是算一段浮點或者刷一段 UART 緩沖區(qū)。uC/OS-II 的調(diào)度器是搶占式的M 的優(yōu)先級比 L 高所以 M 一就緒就把 L 擠下去了。緊接著 H 也醒了H 要訪問同一塊共享資源去 Pend 那個已經(jīng)被 L 拿著的信號量只能掛起等待。到這一步H 的實際等待時間是L 剩余臨界區(qū)時間加上M 的全部執(zhí)行時間。M 跟共享資源一點關系都沒有卻把最高優(yōu)先級任務堵在后面——這就是無界優(yōu)先級反轉(zhuǎn)。反轉(zhuǎn)本身不可怕可怕的是它不可預測M 什么時候來、跑多久取決于外部輸入最壞情況下 H 的響應時間可以做到完全沒法算。硬實時系統(tǒng)里沒法算等于不合格。1.2 把反轉(zhuǎn)攤開成時間線看光講概念容易飄把它按時間軸鋪開更直觀。下面這張表是一次典型的實測過程時間單位為毫秒與后面第五節(jié)的實驗參數(shù)一致時刻發(fā)生了什么此時 H 的狀態(tài)t0L 拿到鎖進入臨界區(qū)計劃忙等 200ms還沒被激活t50H 被激活嘗試 Pend鎖被占用H 掛起阻塞開始計時t60M 被激活優(yōu)先級 10 高于 L 的 15搶占 L繼續(xù)阻塞t60~560M 跑滿 500ms純計算不碰共享資源阻塞中被無關任務拖延t560M 結束L 恢復運行跑完剩下 150ms 臨界區(qū)繼續(xù)阻塞t710L 放鎖H 被喚醒阻塞結束實測約 660ms用互斥量替換二值信號量之后同樣的三個任務H 的阻塞時間會掉到 200ms 出頭。差別就在 t50 那一刻H 一掛到互斥量上內(nèi)核會立刻把 L 的優(yōu)先級從 15 臨時抬到 5L 一旦被抬到 5M 就搶不過它了臨界區(qū)會一路跑到底然后放鎖H 隨即執(zhí)行。優(yōu)先級繼承的本質(zhì)是讓持有鎖的人暫時借走等鎖的人的優(yōu)先級把不該插進來的中優(yōu)先級任務擋在外面。1.3 這篇要回答的三個問題接下來的內(nèi)容圍繞三個問題展開這也是我讀 os_mutex.c 時反復問自己的一個 16 位的 OSEventCnt 字段怎么同時存下優(yōu)先級上限、可用標志和持有者優(yōu)先級這三件事優(yōu)先級繼承這套動作在 OSMutexPend 里到底是哪幾行寫出來的恢復又是在哪里做的以及最實際的——在 GD32F103 這種 Cortex-M3 的板子上怎么搭一個可以反復復現(xiàn)、能量出數(shù)據(jù)的對照實驗這三個問題答完互斥量這條線基本就通了。順帶還會聊幾個面試高頻問題和幾個只有在真項目里踩過才知道的坑。2. 拆開 OSMutex一個 16 位字段怎么存下三件事第七篇已經(jīng)看過 OS_EVENT 的結構這里再貼一遍因為互斥量的所有秘密都藏在這個結構里沒有任何額外的私有數(shù)據(jù)結構typedef struct os_event { INT8U OSEventType; /* 事件類型信號量/互斥量/郵箱/隊列 */ void *OSEventPtr; /* 類型不同指向的東西也不同 */ INT16U OSEventCnt; /* 計數(shù)器 / 位組合 / 優(yōu)先級組合 */ OS_PRIO OSEventGrp; /* 等待任務組8 位 */ OS_PRIO OSEventTbl[OS_EVENT_TBL_SIZE]; /* 等待任務表8 字節(jié) */ #if OS_EVENT_NAME_EN 0u INT8U *OSEventName; /* 調(diào)試用名字 */ #endif } OS_EVENT;信號量里 OSEventCnt 就是個普通計數(shù)郵箱里 OSEventPtr 直接指向消息消息隊列里 OSEventPtr 指向隊列控制塊。到了互斥量這里劇情變了OSEventCnt 被當成一個位域來用高字節(jié)和低字節(jié)承載完全不同的語義。2.1 OSEventCnt 的位布局以我手上這份 v2.9x 的源碼為例位定義是這樣的不同小版本可能有一點點差異建議對著自己那份 os_mutex.c 核一遍位段含義生命周期bit15 ~ bit8優(yōu)先級上限就是 OSMutexCreate 傳進來的 prio創(chuàng)建時寫入之后不再變bit7 ~ bit00xFF 表示鎖空閑鎖被占用時存的是持有者當前優(yōu)先級每次 Pend/Post 都會變對應的宏也有幾個看名字就懂#define OS_MUTEX_KEEP_LOWER_8 ((INT16U)0x00FFu) /* 取低字節(jié) */ #define OS_MUTEX_KEEP_UPPER_8 ((INT16U)0xFF00u) /* 取高字節(jié) */ #define OS_MUTEX_AVAILABLE ((INT16U)0x00FFu) /* 空閑標志 */ #define OS_MUTEX_EN 0u /* 開啟優(yōu)先級繼承 */ #define OS_MUTEX_DIS 1u /* 關閉優(yōu)先級繼承 */判斷鎖是否空閑的方式非常位運算if ((pevent-OSEventCnt OS_MUTEX_AVAILABLE) OS_MUTEX_AVAILABLE)。低字節(jié)等于 0xFF 就是空閑否則說明低字節(jié)里塞著某個人當前的有效優(yōu)先級永遠小于 0xFF因為 uC/OS-II 最多 64 個優(yōu)先級0~63。這個用一個不可能出現(xiàn)的值做哨兵的小技巧在 uC/OS-II 里到處都是讀源碼時記住它能省下不少困惑。順帶說一句為什么低字節(jié)存的是持有者當前優(yōu)先級而不是是否被占用這樣一個布爾值因為恢復優(yōu)先級的時候需要它。如果只存一個布爾Post 的時候就不知道該把持有者抬回哪個數(shù)值了。2.2 OSMutexCreate 里那個占位動作OSMutexCreate(prio, perr)只接收一個參數(shù) prio很容易被當成隨便填一個而忽略。實際上創(chuàng)建函數(shù)開頭有一段檢查if (prio OS_LOWEST_PRIO) { /* OS_LOWEST_PRIO 通常配成 63 */ *perr OS_ERR_PRIO_INVALID; return ((OS_EVENT *)0); } OS_ENTER_CRITICAL(); if (OSTCBPrioTbl[prio] ! (OS_TCB *)0) { /* 這個優(yōu)先級槽已被占用 */ OS_EXIT_CRITICAL(); *perr OS_ERR_PRIO_EXIST; return ((OS_EVENT *)0); } OSTCBPrioTbl[prio] OS_TCB_RESERVED; /* 用一個特殊指針把槽占住 */ OS_EXIT_CRITICAL();OS_TCB_RESERVED其實就是(OS_TCB *)1這么一個假指針。它的作用是告訴任務創(chuàng)建函數(shù) OSTaskCreate這個優(yōu)先級已經(jīng)被占了你不許用。換句話說uC/OS-II 的互斥量是從任務的優(yōu)先級池里硬生生摳出來一個槽位當上限用的。這個設計經(jīng)常被吐槽但邏輯其實很自洽優(yōu)先級繼承要回答最多能把持有者抬到多高而這個上限必須是一個真實存在、可比較的優(yōu)先級數(shù)值。uC/OS-II 沒有額外開一塊空間存它就直接借用優(yōu)先級池里的一格。注意正因為如此你在 os_cfg.h 里給 OS_LOWEST_PRIO 留的余量必須夠。如果項目里同時用了 3 個互斥量那就要額外準備 3 個優(yōu)先級槽而且這些槽不能再分給任何任務。見過太多次任務數(shù)剛好卡滿 63 個再加一個互斥量就創(chuàng)建失敗的情況。2.3 為什么上限這個參數(shù)不能隨便填一個常見誤區(qū)是既然低字節(jié)存的是持有者的真實優(yōu)先級那高字節(jié)這個 prio 好像只是占位隨便填個沒用到的值就行。這種用法在單層繼承的場景下確實能跑因為 uC/OS-II 恢復優(yōu)先級時抬升用的是等待者的優(yōu)先級回落用的是低字節(jié)里記錄的值加上池里的對照prio 本身參與得不多。但一旦出現(xiàn)多級繼承H 等 LL 又在等另一個互斥量prio 就會參與判斷填得離譜會導致持有者被抬到一個比自己還高的位置或者干脆算錯。穩(wěn)妥的做法是這個 prio 就填所有可能使用這個互斥量的任務中最高的那個優(yōu)先級。比如 H5、M10、L15都會用這把鎖prio 填 5。這個規(guī)則在 uC/OS-III 里被明確寫進了文檔uC/OS-II 的注釋里說得比較含糊所以很多人栽在這里。我在實際項目里養(yǎng)成的習慣是給每把互斥量單獨建一個注釋塊寫清楚使用者TaskH(5)/TaskM(10)/TaskL(15)prio 5占用優(yōu)先級槽 5。半年后回頭看這一行注釋能救命。3. 優(yōu)先級繼承是怎么寫出來的OSMutexPend 逐段過OSMutexPend 的簽名是void OSMutexPend(OS_EVENT *pevent, INT16U timeout, INT8U *perr)比 OSSemPend 多了什么其實沒有多只是內(nèi)部多了一大段。整個函數(shù)可以切成三段來看下面給的是去掉參數(shù)檢查、臨界區(qū)進出和超時處理的精簡骨架主干邏輯都在void OSMutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr) { OS_ENTER_CRITICAL(); if ((pevent-OSEventCnt OS_MUTEX_AVAILABLE) OS_MUTEX_AVAILABLE) { /* ---- 第一段快路徑鎖是空的 ---- */ pevent-OSEventCnt OS_MUTEX_KEEP_UPPER_8; /* 清掉低字節(jié)的空閑標志 */ pevent-OSEventCnt | OSTCBCur-OSTCBPrio; /* 低字節(jié)記下持有者優(yōu)先級 */ pevent-OSEventPtr (void *)OSTCBCur; /* 指向持有者 TCB */ OS_EXIT_CRITICAL(); *perr OS_ERR_NONE; return; } /* ---- 第二段慢路徑鎖已經(jīng)被別人拿著 ---- */ pto (OS_PRIO)(pevent-OSEventCnt OS_MUTEX_KEEP_LOWER_8); /* 持有者當前優(yōu)先級 */ ppto OSTCBCur-OSTCBPrio; /* 我自己 */ if (ppto pto) { /* 數(shù)值越小優(yōu)先級越高說明我比持有者高 */ /* 把持有者抬到我的優(yōu)先級這就是繼承動作 */ pevent-OSEventCnt OS_MUTEX_KEEP_UPPER_8; pevent-OSEventCnt | ppto; /* 同步修改 TCB 里的優(yōu)先級和就緒表里的位置此處省略細節(jié) */ } /* ---- 第三段把自己掛進等待表按優(yōu)先級排序 ---- */ OS_EventTaskWait(pevent); OS_EXIT_CRITICAL(); OS_Sched(); /* ... 被喚醒后處理超時和返回碼 ... */ }3.1 第一段快路徑為什么只動三個字段快路徑干的事只有三件清低字節(jié)、寫持有者優(yōu)先級、把 OSEventPtr 指向當前任務。這三件事的順序不能顛倒尤其是先把低字節(jié)清成 0 再寫優(yōu)先級這一步。如果先寫優(yōu)先級再操作低字節(jié)里就會同時殘留 0xFF 的高位和優(yōu)先級數(shù)值 OS_MUTEX_AVAILABLE的判斷可能出問題。這里還有個小細節(jié)值得留意快路徑里 OSEventCnt 的高字節(jié)完全沒動優(yōu)先級上限還是原樣保留。這印證了前面的說法——上限是靜態(tài)配置持有者優(yōu)先級是動態(tài)狀態(tài)兩者物理上擠在一個 16 位變量里但生命周期完全不同。這種把配置和狀態(tài)打包進一個變量的寫法在資源緊張的年代很常見放到今天的代碼規(guī)范里大概率會被 review 打回來但它確實省了內(nèi)存。3.2 第二段繼承那幾行是整個互斥量的靈魂第二段的判斷條件是ppto pto。uC/OS-II 里優(yōu)先級數(shù)值越小越高所以這個不等式成立就意味著我等待者比持有者優(yōu)先級高應該繼承。這個判斷同時起到兩個作用一是決定要不要抬二是順便擋掉了低優(yōu)先級任務來 Pend 時白白提權的浪費。提權這個動作看起來只有三行實際牽涉的東西不少OSEventCnt 的低字節(jié)要改、持有者 TCB 的 OSTCBPrio 字段要改、持有者在 OSRdyTbl 里占的那一位要從舊位置搬到新位置、OSTCBPrioTbl 里也要跟著換。uC/OS-II 把后面這些打包在內(nèi)部的優(yōu)先級變更邏輯里代碼量不大但很容易讀漏。我建議你在看這一段的時候拿張紙把L 從 15 抬到 5這個變化畫出來標一下 OSRdyTbl 里兩個 bit 的翻轉(zhuǎn)理解會牢固得多。另外還有一個容易忽略的點PIP 是可以通過宏關掉的。os_cfg.h 里OS_MUTEX_EN和OS_MUTEX_DIS決定行為關掉之后互斥量的用法就退化成帶所有權檢查的信號量不再繼承。什么時候會關一般是邏輯簡單、任務數(shù)極少、且能證明不會發(fā)生反轉(zhuǎn)的場景。我個人的建議是別關繼承了不虧關了省不下幾個字節(jié)。3.3 第三段掛等待表之后必須先讓出 CPU第三段是熟悉的套路OS_EventTaskWait把自己從就緒表挪到 pevent 的等待表里然后OS_EXIT_CRITICAL()開中斷最后OS_Sched()觸發(fā)一次調(diào)度。這里有個新手經(jīng)常踩的坑OS_EventTaskWait之后必須在退出臨界區(qū)之后才調(diào)用 OS_Sched如果順序反了會在關中斷狀態(tài)下做一次任務切換棧切換和中斷嵌套會打架表現(xiàn)是偶發(fā)死機很難查。還有個更隱蔽的問題這段代碼執(zhí)行時當前任務的 TCB 已經(jīng)被掛到等待表里了但它仍然占著 CPU直到 OS_Sched 真正切走。中間這段時間里如果有個中斷服務程序調(diào)用了OSMutexPost把鎖放了會不會出問題不會因為此時還在關中斷狀態(tài)ISR 根本進不來。這就是臨界區(qū)存在的意義。提示OSMutexPend 的 timeout 參數(shù)傳 0 表示無限等待這一點和 OSSemPend 一致。如果傳了非 0 值掛起期間時鐘節(jié)拍會把它移到超時鏈表上返回碼是 OS_ERR_TIMEOUT?;コ饬康却瑫r是很危險的狀態(tài)——任務沒拿到鎖卻繼續(xù)往下跑會直接破壞共享數(shù)據(jù)的完整性。如果你用了非 0 超時一定要在所有返回碼分支上都做正確判斷寧可讓任務進錯誤處理也不要假裝成功。4. OSMutexPost 的收尾解鎖、喚醒、恢復優(yōu)先級OSMutexPost 的簽名只有INT8U OSMutexPost(OS_EVENT *pevent)一個參數(shù)因為誰在放鎖這件事內(nèi)核是知道的——它就是當前任務。整個函數(shù)的邏輯主線是確認調(diào)用者是持有者把鎖交給等待隊列里優(yōu)先級最高的那個人如果有恢復被抬高的優(yōu)先級最后觸發(fā)一次調(diào)度。4.1 所有權檢查為什么比信號量多這一道if (OSTCBCur ! (OS_TCB *)pevent-OSEventPtr) { OS_EXIT_CRITICAL(); return (OS_ERR_NOT_MUTEX_OWNER); }這兩行是互斥量和二值信號量在語義上最本質(zhì)的區(qū)別。信號量是票誰拿都能放A 拿了 B 也能放內(nèi)核不管互斥量是所有權只有持有者能釋放。這個約束看起來是多此一舉實際上擋掉了一整類設計錯誤任務 A 因為在臨界區(qū)里出錯提前返回忘了放鎖任務 B 好心幫它放了一把結果共享數(shù)據(jù)在 A 還在寫的時候就被 B 打開了破壞得比死鎖還慘。返回 OS_ERR_NOT_MUTEX_OWNER 的時候很多人會習慣性地忽略返回值覺得反正我知道我在放了。這個假設在調(diào)試期不成立——一旦設計里出現(xiàn)了交叉釋放你忽略的這個返回值就是唯一的線索。我自己的習慣是把它包一層宏失敗時點亮一顆 LED 并記錄任務號和錯誤碼這樣在實驗室里就能發(fā)現(xiàn)不用等到客戶現(xiàn)場。4.2 喚醒等待者直接交接而不是先置空閑放鎖的核心動作是這樣一段如果等待表非空就把鎖直接交給排隊里最高優(yōu)先級的任務而不是先把 OSEventCnt 置成 0xFF 空閑再讓那個任務自己重新 Pend 一次。這個直接交接的設計避免了兩個麻煩一是中間窗口被別的任務插進來搶走鎖二是避免了多一次正常的 Pend 調(diào)用。交接完成之后還要處理優(yōu)先級問題。如果之前為了繼承把某個任務的優(yōu)先級抬高了那么放鎖的時候要把它放回去。這里的邏輯有兩種寫法一種是恢復成創(chuàng)建互斥量時指定的那個上限另一種是恢復成持有者原本的優(yōu)先級。uC/OS-II 走的是相對簡單的路徑而 uC/OS-III 干脆在互斥量里多開了一個字段記錄持有者原優(yōu)先級從根上解決了嵌套場景下恢復不準確的問題。你讀自己那份源碼的時候最快的驗證方式是打開 OSMutexPost看它調(diào)用的優(yōu)先級變更函數(shù)第二個參數(shù)是從哪兒取出來的——是從 OSEventCnt 的高字節(jié)取還是從別的地方取一眼就能看出來。4.3 嵌套與多級繼承的邊界優(yōu)先級繼承不是萬能的它有兩個天然的邊界實際項目里必須知道。第一個邊界是嵌套持鎖。任務 L 持有互斥量 A同時任務 M 也在等 A 并且 M 的優(yōu)先級更高L 被抬到了 M 的優(yōu)先級如果此時 L 又去 Pend 互斥量 B而 B 被另一個低優(yōu)先級任務持有那這個鏈會繼續(xù)傳遞下去嗎uC/OS-II 的處理是有限的鏈長了容易恢復不準確。工程上的對策很簡單不要在持有鎖的時候去申請另一把鎖也就是避免鎖嵌套。真需要嵌套就把幾把鎖合并成一把或者重新設計數(shù)據(jù)訪問路徑。第二個邊界是不參與繼承的等待者。如果等鎖的任務是通過二值信號量或者消息隊列間接依賴共享資源的靠互斥量是感知不到的。也就是說優(yōu)先級繼承只對直接等這把鎖的任務生效間接依賴、跨層依賴統(tǒng)統(tǒng)看不見。真正的解決辦法是設計階段的優(yōu)先級分配時盡量避免長臨界區(qū)把共享資源的訪問時間壓到最短。注意這里說的長臨界區(qū)不是指幾毫秒而是指包含了可能引起阻塞的調(diào)用。臨界區(qū)里絕對不能調(diào)用 OSTimeDly、OSxxxPend、OS_QPost 里帶 Pend 語義的函數(shù)。只要你調(diào)了任何一個會讓出 CPU 的東西臨界區(qū)就不再是臨界區(qū)等于自己拆了保護。5. 上手實操在 GD32F103 上跑一個可復現(xiàn)的優(yōu)先級反轉(zhuǎn)實驗理論講完落到板上。這一節(jié)給出一個完整可復現(xiàn)的實驗設計硬件用 GD32F103Cortex-M372MHz和 STM32F103 引腳兼容移植層可以直接借用軟件是標準 uC/OS-II 加 Cube 風格的外設初始化。整個實驗的目標只有一個量出同一組任務在二值信號量和互斥量兩種保護方式下最高優(yōu)先級任務的阻塞時間差多少。5.1 硬件與工程準備硬件只要三樣一塊 GD32F103 最小系統(tǒng)板、一個 USB 轉(zhuǎn)串口模塊接 PA9/PA10、一根杜邦線把 PA0 引到示波器或者邏輯分析儀上。PA0 用來打點標記臨界區(qū)開始/結束如果你沒有示波器用串口打點也能看只是時間精度差一些。os_cfg.h 里必須確認打開的開關#define OS_MUTEX_EN 1u /* 互斥量模塊必須為 1 */ #define OS_SEM_EN 1u /* 對照實驗要用信號量 */ #define OS_TIME_DLY_HMSM_EN 1u /* 用 OSTimeDlyHMSM 做粗粒度延時 */ #define OS_TASK_STAT_EN 0u /* 實驗階段關掉統(tǒng)計任務減少干擾 */ #define OS_LOWEST_PRIO 63 /* 留夠優(yōu)先級槽 */ #define OS_TICKS_PER_SEC 1000u /* 1ms 一個節(jié)拍方便 OSTimeGet 直接當毫秒讀 */注意 OS_TICKS_PER_SEC 設成 1000 意味著 SysTick 每 1ms 中斷一次。這個頻率在 72MHz 的 M3 上完全扛得住中斷里只做一次 OSTimeTick而且讓后面的時間統(tǒng)計變得極其直觀OSTimeGet 返回的 tick 數(shù)就是毫秒數(shù)。這點小便利在調(diào)時序問題的時候很值。5.2 三個任務的參數(shù)設計任務設計直接照搬第一節(jié)的時間線參數(shù)如下表任務優(yōu)先級行為是否會訪問共享資源TaskH5延時 50ms 后 Pend記錄阻塞時長是TaskM10被激活后忙等 500ms否TaskL15先拿鎖忙等 200ms再放鎖是關鍵點在于TaskM 必須在 TaskL 拿鎖之后、TaskH 之前被激活實驗才有效。實現(xiàn)方式有兩種一是讓 TaskM 自己也延時時間點卡在 60ms 左右二是讓 TaskM 等一個信號量由 TaskL 在進入臨界區(qū)之后 Post。第二種更精確但會引入額外的同步動作可能干擾判斷。我一般用第一種靠粗略的時序?qū)R就夠用了。堆棧大小按 TASK_STK_SIZE 給 256 就夠了Cortex-M3 上 OS_STK 是 32 位也就是每任務 1KB。三個任務加空閑任務一共占用 4KB 左右的 SRAM20KB 的 GD32F103 完全夠。如果開了浮點或者調(diào)用了 sprintf建議提到 512。5.3 核心代碼兩種保護方式的對照先看 TaskL 和 TaskM這兩個任務在兩種模式下代碼完全一樣#define TASK_STK_SIZE 256 #define TASK_H_PRIO 5u #define TASK_M_PRIO 10u #define TASK_L_PRIO 15u static OS_EVENT *pLock; /* 指向信號量或互斥量 */ static volatile INT32U g_h_block_ms; /* TaskH 的阻塞時長 */ static void TaskL (void *p_arg) { INT8U err; (void)p_arg; for (;;) { OSSemPend(pLock, 0u, err); /* 互斥量模式改成 OSMutexPend(pLock, 0, err) */ GPIO_BOP(GPIOA) GPIO_PIN_0; /* 打點進臨界區(qū) */ BusyWaitMs(200u); /* 模擬耗時 200ms 的共享資源操作必須忙等 */ GPIO_BC(GPIOA) GPIO_PIN_0; /* 打點出臨界區(qū) */ OSSemPost(pLock); /* 互斥量模式改成 OSMutexPost(pLock) */ OSTimeDlyHMSM(0u, 0u, 1u, 0u); } } static void TaskM (void *p_arg) { (void)p_arg; OSTimeDlyHMSM(0u, 0u, 0u, 60u); /* 卡在 L 拿鎖之后醒來 */ for (;;) { BusyWaitMs(500u); /* 純計算不碰任何共享資源 */ OSTimeDlyHMSM(0u, 0u, 1u, 0u); } }TaskH 負責測量它的循環(huán)里只做一件事static void TaskH (void *p_arg) { INT32U t0, t1; INT8U err; (void)p_arg; OSTimeDlyHMSM(0u, 0u, 0u, 50u); /* 等 L 先拿到鎖 */ for (;;) { t0 OSTimeGet(); /* 記錄 Pend 之前的時間 */ OSSemPend(pLock, 0u, err); /* 互斥量模式改成 OSMutexPend */ t1 OSTimeGet(); /* 拿到鎖的瞬間 */ g_h_block_ms t1 - t0; /* 阻塞時長單位 ms */ printf(H block %lu ms\r\n, (unsigned long)g_h_block_ms); OSSemPost(pLock); /* 互斥量模式改成 OSMutexPost */ OSTimeDlyHMSM(0u, 0u, 2u, 0u); } }創(chuàng)建部分兩種模式只在初始化那一行不同/* 模式 A二值信號量 */ pLock OSSemCreate(1u); /* 模式 B互斥量prio 取使用者里最高的優(yōu)先級 5 */ pLock OSMutexCreate(TASK_H_PRIO, err);5.4 實測數(shù)據(jù)與觀測要點把兩種模式各跑一遍串口輸出的數(shù)字差別非常明顯保護方式TaskH 實測阻塞時長說明OSSemCreate(1)約 660 msTaskM 的 500ms 被算進了等待里OSMutexCreate(5)約 220 msTaskL 被抬到優(yōu)先級 5TaskM 完全插不進來220ms 這個數(shù)字不是嚴格等于 200ms多出來的 20ms 是幾件事湊出來的TaskL 已經(jīng)跑掉了一部分臨界區(qū)TaskH 是 50ms 才 Pend 的此時 L 大概已經(jīng)忙等了 50ms加上 GPIO 操作、串口打印、調(diào)度開銷。數(shù)量級對得上就說明實驗成功了不用糾結那幾毫秒。用示波器看 PA0 更直觀模式 A 下 PA0 的高電平會被撐得特別長因為 L 被 M 搶占高電平中間還夾著L 被切走的空檔實際上會看到一個高電平被拉長到 660ms 左右模式 B 下 PA0 就是一段干凈的 200ms 高電平形狀非常規(guī)整。這個波形對比比任何文字描述都有說服力面試的時候如果你能把這兩張圖拿出來講基本就不用擔心被追問了。提示BusyWaitMs 必須是自己寫的不讓出 CPU 的空循環(huán)不能調(diào)用 OSTimeDly。這一點是整個實驗成立的前提——如果 TaskL 在臨界區(qū)里用 OSTimeDly 讓出了 CPU那它跟 TaskM 就是普通的優(yōu)先級搶占關系測出來的數(shù)據(jù)毫無意義。我見過不止一個人在這里翻車然后得出優(yōu)先級繼承沒用的結論。6. 常見問題與排查實錄這一節(jié)是我在幾個實際項目里攢下來的都是文檔里不會寫、但碰到一次就記一輩子的東西。6.1 問題速查表現(xiàn)象最可能的原因排查動作OSMutexCreate 返回空指針err OS_ERR_PRIO_EXIST傳進去的 prio 已經(jīng)被某個任務或其他互斥量占了打印 OSTCBPrioTbl 里非空的槽位看誰占了Post 返回 OS_ERR_NOT_MUTEX_OWNER有人替別人放鎖或者任務在 Pend 失敗后仍執(zhí)行了 Post檢查所有 Pend 的返回碼分支優(yōu)先級繼承好像沒生效OS_MUTEX_EN 被關掉了或者 TaskM 的優(yōu)先級其實比 TaskH 低打開 os_cfg.h 確認再看任務優(yōu)先級表系統(tǒng)在臨界區(qū)里死鎖持有鎖的任務 Pend 了另一把被別人持有的鎖用 OSMutexQuery 打印每把鎖的持有者和等待隊列移植后 SysTick 一開就跑飛OS_CPU_SysTickInit 里沒按 72MHz 算重裝載值核對 reload SystemCoreClock / OS_TICKS_PER_SEC - 16.2 三個不太容易想到的坑第一個坑跟中斷服務程序有關。ISR 里能不能 Pend 互斥量不能。OSMutexPend 會掛起當前任務并觸發(fā)調(diào)度而 ISR 上下文里沒有當前任務這個概念OSTCBCur 指向的是被打斷的那個任務但它不是你。ISR 里只能 Post不能 Pend。這個限制對信號量同樣成立但互斥量上更容易犯錯因為直覺上我在中斷里訪問共享資源所以我要加鎖這個想法太自然了。第二個坑是優(yōu)先級上限填錯導致的隱性降級。假設你有三把互斥量prio 全填了 5創(chuàng)建的時候后兩把就會返回 OS_ERR_PRIO_EXIST如果代碼里沒檢查返回值直接往下用pLock 就是空指針OSMutexPend 會返回 OS_ERR_PEVENT_NULL而很多人的 Pend 是不檢查返回碼的——結果就是鎖根本沒生效但程序照跑一直跑到負載上來了才炸。所以我在模板代碼里強制要求所有 Pend/Post 都要判返回碼這點堅持幾年下來救過不少項目。第三個坑是優(yōu)先級繼承和任務優(yōu)先級分配互相打架。如果你的 TaskL 優(yōu)先級本來就比 TaskM 高那反轉(zhuǎn)根本不會發(fā)生實驗也復現(xiàn)不出來。反過來說實際項目里如果發(fā)現(xiàn)某把鎖的繼承動作很頻繁說明任務優(yōu)先級分配本身有問題——可能 L 干了太多本該由更高優(yōu)先級任務干的事。優(yōu)先級繼承是補丁不是設計目標能不動用就不動用。6.3 什么時候不該用互斥量互斥量解決的是任務之間互斥訪問共享資源它有兩個明確的使用邊界。一是任務和 ISR 之間的互斥。ISR 里不能 Pend所以任務和中斷之間共享數(shù)據(jù)時常規(guī)做法是關中斷加內(nèi)存屏障或者用二值信號量做單向通知而不是互斥量。二是純計數(shù)場景。資源池比如三個串口緩沖區(qū)需要的是計數(shù)信號量用 OSSemCreate(3) 配 OSSemPend/Post 更貼切互斥量天然只有一個。硬要用互斥量模擬會白白浪費一個優(yōu)先級槽還丟掉了計數(shù)的表達能力。順帶說一句和 Linux 的對比這個問題面試里出現(xiàn)頻率不低。Linux 內(nèi)核里也有 PI優(yōu)先級繼承相關的鎖比如用戶態(tài) pthread_mutex 配 PTHREAD_PRIO_INHERIT 屬性內(nèi)核里的 rt_mutex 也是按繼承的思路設計的。區(qū)別在于 Linux 面對的是動態(tài)優(yōu)先級、調(diào)度類、CPU 親和性一大堆變量而裸機 RTOS 里的臨界區(qū)通常只有幾十到幾百微秒靜止優(yōu)先級、單核、搶占式調(diào)度所以 uC/OS-II 那個低字節(jié)存優(yōu)先級、高字節(jié)存上限的樸素做法在它的場景里剛好夠用。理解了這個差異也就理解了為什么嵌入式 RTOS 的代碼可以寫得這么摳門。系列寫到這里os_mutex.c 這條線基本通了。下一篇準備啃消息郵箱和消息隊列那邊有個和互斥量完全相反的坑郵箱傳遞的是指針不是數(shù)據(jù)副本一不小心就會把已經(jīng)復用的棧緩沖區(qū)傳出去。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久婷婷五月综合色丁香| 婷婷丁香成人五月天| 丁香五月天综合网| 精品色情一区二区三区四区| 9精品视频在线观看| 久久婷婷五月天| 热无码A∨| 丁香99| 超碰在线9| 婷婷五月天视| 久久久999精品| 成人免费120分钟啪啪| 亚洲五月天另类小说图片| 婷婷六月丁香激情| www久| 五月天丁香婷婷网| 国产精品扒开腿做爽爽爽A片唱戏| 亚洲成人婷婷| 99综合激情久久精品久久| 婷婷综合亚洲| 免费国产视频| 激情AV在线| 亚洲成人AV电影在线| 色五月综合在线| 玖玖热视频| 精品无码色| 手机旧版看人妻1025| 激情性爱五月天网页| 这里只有精品免费| 欧美成人精品A片免费一区99| 五月婷婷丁香大陆免费| www.99婷婷| 99热精品在线播放| 天天狠狠六月婷丁香影院| 丁香婷婷少妇| 涩五月丁香| 欧美五月丁香啪啪响视频| www,com,五月色色| 91狠狠综合网| 丁香六月婷婷| 五月丁香久久久日婷婷久久婷婷日| www.91在线观看| 99热黄| 天天射影院| 日本久久天堂| 人妻av在线| 久热超碰| 亚洲亚洲人成综合网络| 成人五月丁香花| 色五月激情五月| 国产亚洲99久久精品| 97干网站| 99在线精品观看99| 色色五月天 亚洲| 老妇六区| 99手机在线精品视频| 婷婷的色色五月天| 国产伊人五月天| 深爱五月天| 色99色| 夜夜夜夜夜操| 久久丁香综合香蕉| 亚洲欧洲午夜成人精品av| www.com亚洲网站在线免费| 熟妇天天综合| 丁香激情网| 五月丁香琪琪| 五月天久久www| 五月天 另类图片| 五月天婷婷永久免费视频| 五月花亭亭| 丁香五月停停av| 亚洲日日操| 色五月婷婷影院| 99亚洲精美视频在线观看| 色婷婷成人久久| 婷婷色综合网日韩国产| 五月丁香另类图片| 久久午夜理论| 六月丁香婷婷综合狠狠爱夜夜爱| 亚洲亚洲人成综合网络| 青996青| 美女激情综合| 色婷婷色情| WWW.桔色成人.COM| 色婷婷久久| 激情五月天色色| 精品夜夜澡人妻无码AV| 99资源在线视频| 色噜噜狠狠色综合无码久久欧美| 久久成人人妻| 久久婷婷精品| 狠狠色五月| 成人精品一区日本无码网 | 综合激情四射一theav| 97偷拍在线视频| 99视频内射三四| 插插网爽妇五月丁香| 岛国av电影网站| 婷婷玖玖五月天| 色情婷婷| 伊人干综合| 色五月丁香激情视频| 无码人妻一区二区三区免费九色| 久久久久人妻| 97人人看| 99热碰碰| 五月婷综合激情| 久久视这里只有精品| 婷婷激情网五月天| 疯狂做受XXXX高潮A片动画| 免费成人中文字幕| 色噜综| 伊人久久大香网| 丰满少妇猛烈A片免费看观看| 婷婷色五月开心五月| 香蕉久久国产AV一区二区| 碰碰碰97国产| 狠狠干激情五月| www久久久久久久97| 国产午夜成人AV在线播放| 啪色综合| 丁香五月婷婷大香蕉| 亚洲第一成人无码A片| 粉嫩av懂色av蜜臀av熟妇| 五月天婷婷乱| 大香蕉伊人丁香五月| 五月丁香操婷逼| 激情五月婷婷综合色播小说| 天天揷综合网| 四色女婷婷| 99久热| 欧美 日韩 成人| 亚洲9久久精品| 99色色爰| 五月丁香在线观看| 婷婷五月大| 99综合一区| 色久一| 婷婷六月丁香1| www色五月| 色爱综合网| 婷婷五月天播播| 91打屁股免费看| 密着浓厚中出乚交尾GvG935| www.minyis.com【JT】国内CDN落地页保证转化QQ2101460746 | 天天操无码| 99爱视频在线| 久久色五月| 99热这里只有精品免费| 日韩国产在线免费观看| 五月丁香六月成人| 亚州激情网| 91啪啪视频| 亚洲第一黄网| 色综合五月天| 五月天自拍视频| 久久精品99国产精品日本| 久鲁鲁色网| 99热97| 婷婷六月色| 91精品91久久久中77777| 97干在线播放| 九九aV| 五月天无码视屏播放| 久久久久久久人妻| 五月天五月婷五月激情网| 精品夜夜澡人妻无码AV| 玖玖资源站视频| 九九99九九精品视频| 性天天中文网| 色婷婷激情| 中文字幕在线观看视频www| 婷婷五月天堂| 婷婷综合性爱网| 久久久精品人妻录| 中文字幕在线日亚洲9| 久久性爱视频网站| 亚洲va欧洲va国产va不卡| 人操人人| 9久热| 天天射天天射一道本日本社区| 操日挥操日日| 色99网| www色五月| 婷婷5月色| 牛色色碰| www久久99| 婷婷欧美激情综合| 97久久超级| 亚洲在线综合| 免费视频这里只有精品| 六月丁香婷婷五月天| 亚洲狠狠操| www网站在线观看| 国产无人区大片| 久久婷婷青草五月天| 欧美性生交XXXXX无码小说| 日日日日操| 亚洲免费av在线| 丁香在线视频| 香焦网五月天| 五月亭亭综合五码| 丁香五月婷婷婷婷欧美综合| 男人的天堂五月丁香| 婷婷丁香五月综合| 99热综合网| 日日干夜夜撸夜夜骑| 性色综合网| 伊人久久婷婷| 天天射影院| 一区二区三区四区五区| 五月丁香啪啪婷婷| 91性人人| 爱iii做iiii日日| 9色在线| 九九热视频免费| 日本一级一级一级一级| 五月丁香婷婷啪啪综合| 抽插特写| 丁香激情综合| 四川女人毛多水多A片| 婷婷五月丁香综合激情| 青草五月天| 五月花成人网| 免费国产VA国产免费| 91岛国片| 色九九七七| 影音先锋91在线资源站| AA片在线观看视频在线播放| 色情婷婷| 五月天激情小说网| 五月天婷婷成人网| 久久婷婷亚洲| 激情综合五月天| 五月丁香啪啪啪| 五月婷婷婷婷婷| 思思热99er在线视频| AV色婷婷| 五月停停色色丁香| 99激情在线| 九九综合网色全集| 棕合影院色色| 国产成人网站在线观看| 色色丁香五月天| 色色九九五月天 | 92久操视频| 思思久久99热只有频精品66| 国产一级片色色| 丁香婷婷啪啪| 丰满女老板BD高清A片| 久久99热这里只有精品| 九九综合久久| 亚洲网在线观看| 国产看真人毛片爱做A片| 色墦五月丁香| 五月激情综合网| 丁香婷婷啪啪| 九月婷婷在线视频| 操逼五月天| jiujiuxiangjiaowang| 色婷婷基地 | 久99热| 99色色网| 99亚洲精品综合在线| 亚洲黄色网址| 在线99精品| 综合www色| 五月天婷婷色| W色综合| 嫩草AV久久伊人妇女超级A| 丁香六月在线| 欧美69久成人做爰视频| 4399精品一区二区| 亚洲av成人在线| 亚洲综合九九| 日操五月婷| 婷婷五月天激情小说网站| 婷婷五月开心中文字幕在线| 五月丁香婷婷视频| 人妻久久久| 亚洲精品无AMM毛片| 又大又粗九一在线| 色婷另类| 丁香五月婷婷色五月| 九九九午夜影院成人| 久久开心五月婷婷| 97人人超| 97超碰9久热婷婷热| 99视频在线啪| 九九这里只这里只有精品| 啪啪啪五月天| 激情五月色婷婷| 九月色婷婷| 黄色国久久| 9色免费网| 99啪啪视频| 成人超碰AV| 五月丁香欧美在线| 激情综合五| 99热爆在线| 婷婷九色| 99re思思精品在线观看| 思思re99视频在线观看| 丁香婷婷婷婷十二月在线观看视频| 九九人人看| 婷婷丁香社区网| 五月丁香无码| 99精品免费| 99视频综合网| 五月亚洲激情| 婷婷五月天黄色| 婷婷色情 | 六月婷欧美| 五月色欧洲| 九九无码| 丁香伊人五月色婷婷五十路| 欧美va视频不用播放器的va视频网| 成人免费va| 色色色综合网| 婷婷丁五月| 激情五月六月婷婷| 国产在线网| 操B五月天| 久久这里只| 夜精品无码A片一区二区蜜桃 | 31色区视频免费看| 操逼福利视频| 五月婷视频| www.com任你艹| 噜噜噜噜噜日本视频| 五月婷婷六月激情| 丁香婷婷综合影院| 99色 色| 五月丁香狠狠爱| 九洲一级A片| 天天色综合图片| 777精品久无码人妻蜜桃| 成人av观看| 色久激情在线| 99热传媒| 无码人妻一区二区三区免费九色| 国产免费性爱| 99秘 在线| 天天干天天干天天干天天干天天干| 婷婷五月无码| 六月色婷婷| 亚洲区1| 人妻在线中文字幕久久| 成人做爰高潮A片免费视频| 久综合网| 激情丁香五月| 天天弄天天爽| 少妇熟女视频一区二区三区| 五月激情久久综合| 色综合99无码 | 日韩精品一区二区三区,四区,五区视频| 欧洲综合视频| 婷婷五月天色| 欧美美女国产日韩一区二区久 | 超碰在线超碰| 久婷婷婷| 操操操操操操婷婷五月天| www.黄色片-久久成人国产精品在线播放-999AV | 国产成人av在线| 一起肏在线视频| 涩五月婷婷| 97热久久五月婷婷| 久久9视频| 伊人久久婷婷| 国产精品久久久久久久久久免费| 色婷五月| cao久久| 色色五月婷婷久久| 欧美日韩成人在线| 欧美精品在线观看| 五月花激情| 影音先锋综合网| www.狠狠| 深爱五月激情综合| 91综合视频丁香| 久热网在线视频| 欧美超碰亚洲| www久久久| 日日夜夜狠狠婷婷色| 久久婷婷五月天| 婷婷五月天在线观看av| 91 久热| 一本色道久久综合狠狠躁小说| 婷婷的色色五月天| 六月丁丁香| 99热首页在线30| 亚洲色区17| 婷婷五月色综合| 五月天激情综合网俺也去| 九九热精品视频在线观看| 五月婷婷免费| 色五月超碰| 日日日日日| 亚洲男人的天堂婷婷色五月| 狠狠色丁香婷婷久久综合| www.99在线| 久久久er热| 色婷婷影视99| 色欲天天综合网| 影音先锋人妻出差| 99er日韩| 久久久九九视频精品18| 五月激情啪啪| 色综合五月天| 色青青视频| 色色综合激情| 91大屁股在线| 思思99热| 天天肏高清在线| 天天舔天天摸天天射| 婷婷新网址| 狠狠草在线观看| 天天狠狠色| 91超碰九色| WwW色婷婷| 美女网黄| 五月婷婷官网色| 九九家庭影院| 六月丁香综合| 丁香六月激情毛片| 久久91久久精品久久| 色色丁香婷婷| 网站免费一站二站| 成人色色视频| 欧美天天干五月丁香| 伊人九九综合| www99xxxx五月丁| 色99视频| 天天做天天爱| 人人操91| 亚洲网视屏| 激情综合网五月激情网| 99久久婷婷五月天| 国产va在线视频| 超碰三级片| 婷婷色网址| 天天日日夜夜| 激情五月综合| 啪啪91| 九九久久99| 99毛片| 五月丁香婷婷基地| 婷婷色五月天在线观看| 五月婷婷综合精品| 色五月天本日| 99热在线精品观看| 深爱五月日韩| 五月婷婷啪啪啪啪| 深爱激情婷| 精品三区影院| 五月花婷婷丁香| 婷婷激情区| 欧洲激情五月天婷婷| 黄色aaaaa| 色碰碰视频| 九九碰九九爱97超| 啪啪啪综合网| 九九视频精品这里只有| 亚洲成色综合网站免费观看| 五月丁香综合久久| 99久久综合精品五月天| 丁香网五月天激情| 激情五月婷婷五月| 色婷婷国产精品综合在线观看| 四月丁香五月婷婷久久| 色欧美影院| 综激情网| 超碰免费人人| 九九综合九| 久久婷婷五月丁香蜜桃网| 天天色综网| 婷婷五月丁香综合亚洲| 天天透天天干| 精品久久9| 久草婷婷| 5月婷婷六月丁香| 色色亚卅| 人人九色| AA丁香综合激情| 99燥99日| 日本丁香久在线| 91精品无码| 丁香五月天在线视频| 在线五月色播| 五月婷婷六月少妇激情| 色六月婷婷| 五月色丁香| 夜夜嗨一区二区三区直播内容 | av在线激情| 免费黄色片子| 99热精品一区| 激情五月婷婷| 亚洲操人| 97超碰99热99| 五月天婷婷色在线视频免费观看| 日韩按摩二区| 99九九视频| 色婷婷视频在线| 欧美大片| 黄色激情久久| 天天射天天射一道本日本社区| 日韩视频99| 色玖玖导航| 久久99综合| 五月天激情亚洲| 狼友视频在线观看18| 激情六月五月婷婷综合网| 五月婷婷之美女图片| 91狠狠综合网| 国内自拍1区| 久久婷婷五月综合色奶水99啪| 狠狠久久婷五月综合色| 日熟女| 无人区码一码二码三码医生系列| 婷婷激情人妻| 可以免费看的av网站| 亚洲五月天婷婷| 大色鬼综合| 婷婷99中文字幕| 色欲资源网| 久久五月视频| 亚洲色基地| 五月丁香拍拍激情综合| 97干综合网| 国产真实乱了老女人视频| 色婷婷五月影院| 天天操天天爽天天爱| 国产性爱一级| 97成人丁香| 色五月丁香五月激情五月激情| 丁香婷婷婷五月| 婷婷色在线| 午夜爱插插| 精品五月天| 99在线精品免费视频| 激情综合国产| 天天做夜夜爽| www.久操| 丁香五月六月激情久久| 日日做A爰片久久毛片A片英语| 任你擦免费视频| 九九热免费| 久久99热网| 精品视频这里只有精品| 日韩九区| 婷婷综合色图| 婷婷久久免费| 久热久操久热久草国产91| 天天成人丁香美女AV| 亚洲成人免费在线| 综合激情伊人影视在线| 久久怕怕视频| 五月天激情国产综合婷婷婷就去爱| 五月丁香六月玩女人| 激情久久伊人| 婷婷色Av| 亚洲成人丁香花| 九九久久综合网站| 艹B高清无码| 五月情综合| 色婷婷99| 色综合久久88色综合天天人守婷| 精品亚洲国产成AV人片传媒| 五月色导航| 99精品国产在热久久| 熟女重口味αV| 综合久| 国产日批视频| 色色婷婷综合| 日韩在线aaa| 欧亚中文A V| 色五月婷婷激情| 99久久婷婷综合| 欧美一级操逼视频| 99亚洲精美视频在线观看| 五月天天天天天天天天天天天天天天天婷婷婷 | 色啪综合| 国产片天天爽夜夜爽| 五月天激情小说| 五月婷婷狠天天色综合| 大香伊人久色| 六月激情综合| 97av在线视频| 免费看欧美成人A片无码| 亚洲精品性色| 色五月中文字幕| 婷婷丁香亚洲色综合91| 超碰成人免费| 色欲久久久久| 色久女| 五月丁香啪啪啪| 五月天成人在线| 婷婷影院欧美| 综合网五月| 久久机热这里只有 | 天天精品视频免费观看| 国産精品| 国产内射婷婷| 丁香五月手机在线| 五月人妻婷婷| 在线观看免费狠狠色丁香香综合| 亚洲婷婷婷| 大香蕉视频99| 九九久久99| 婷婷五月精品在线| 色欲五月婷婷| 无码一区精品一区视频| 99热综合色图| 九九视频热| 五月五月婷婷| 开心五月色婷婷综合开心网| 天天做天天爱天天玩| 丁香五月婷婷五月天在线| 97亚洲视频在线| 九九热99熟女| 人妻尝试久久久久久久久久久久| 97碰| 狠狠综合久久综合| 丁香六月啪啪| 五月丁香花视频| 九九草热在线观看| 亚洲av成人在线| 天天干天天av天天射| www狠狠| 久久小片| 五月色丁香婷婷中文字幕| 狠狠干在线| 国产精品第一国产精品| 色婷婷小说| 九九在线这里只有精品视频 | 99热这里只有精品99| 激情综合丁香五月| 中文字幕日韩无码制服诱或| 91精品久久久久久久| 91丨九色丨国产打屁股网站| 欧美韩国日本| 丁香六月婷婷综合| 五月丁香啪啪| 久re热视频| 婷婷的五月天另类视频| 五月丁香婷婷综合网| 大香蕉欧美在线| 婷婷丁香五月亚洲综合网在线视频观看| 大香蕉伊人久久| www.com色播五月天| 玩熟女五十AV一二三区| 伊人色综合网| 婷婷五月色播放| 色婷婷综合影院| 亚洲综合色色| 婷婷五月花西瓜| 26uuu国产精品| 五月婷婷 欧美| 婷婷五月电影院| 色婷久九| 激情99热| 色色色婷| 色五月天丁香| 久久婷婷91| 996精品热视频| 五月天基地| 激情丁香五月天图片| 99久久超级| 久久5 9视频免费观看| .精品久久久麻豆国产精品| 色婷五月| 69精品人人人人| 最近中文字幕2019视频1| 色综合99| 色噜噜婷婷| 婷婷伊人綜合中文字幕小说| A片试看50分钟做受视频| 少妇大叫太大太粗太爽了A片| 91色婷婷综合久久中文字幕二区| 99久久久| 日逼影音先锋男人AV资源站| 婷婷丁香18| 成人AV片播放| 亚洲第二AV| 婷色视频| 九九热av| 色五月久久成人婷婷| 天天天天天色| 六月丁香影院| 开心五月激情网| 亚洲网视屏| 日本狠狠色| 久草热久草在线视频| 一区二区三区四日本| AV片在线观看| 色玖玖玖| 天天婷婷综合| 狠狠干伊人| 亚洲五月天另类小说图片| 久久激情五月天| 人妻少妇色综合| 风流少妇A片一区二区蜜桃| 天堂二区| 99九九在线观看免费| 欧亚洲在线高清视频| 激情网站综合五月天| 婷婷视频在线| 日本91在线| 欧美性猛交XXXX乱大交极品| 97热超碰| 人人草公开操| 国产三级秋霞| 综合激情视频| 婷婷热色| 丁香五月综合高清在线| 五月丁香花激情综合网| 日韩成人av在线| 婷婷五月天天| 五月婷婷中文字幕| 婷婷色情网| 操比激情五月| 777色婷婷爱五月| 狠狠色噜噜狠狠狠888了| 日日操夜夜撸| 狠狠精品干练久久久无码中文字幕| 99re视频在线精品| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 99人碰碰碰| 精品综合五月| 狠狠干狠狠色| 色婷婷五月天无码视频| 婷婷丁香77777| 婷婷亚洲综合| 电影91久久久| 综合天天综合| 天天草天天爽| 丁香色婷婷色手机免费在线| 色欲色天天香综合| 天天色色天天| 国产AV一区二区三区最新精品| 日韩精品一品二区三区的使用体验| 天干天天干天天天天天| 九九久久五月天| 99碰碰碰| 99久久成人| 五月天另类视频| 狠狠综合区| 严洲天天插| 色墦五月丁香| 五月大香蕉| 99热亚洲| 久久99jiu9| 色天天综合成人网| 日本乱子人伦在线视频| 婷婷九月激情| 激情久久久久久久久久久| 免费一区二区三区| www.五月婷婷久久.com| 婷婷五月天成人网| 久久99免费视屏| 五月丁香久| 久久在线大香蕉| 伊人啪啪网| 一级片无码| 五月婷婷影视| 三级av在线| 五月婷婷六月丁香激情综合网| 99热国产这里只有精品| 色欲天天综合| 99热99在线| 思思热久久艹| 99热欧美| 日日干五月天婷婷| 五月天国产| 久久久久久久五月婷婷六月丁香综合,开心激情综合网 | 色之综合网| 丁香六月五月天| 综合色播| 天天日天天色| 国产在线6| 九九伊人网| 欧美日韩大黄| 亚洲中文字幕AV在线| 五月社区婷婷激情| 国产AV影片| 五月色婷婷激情| 射满了还射免费在线观看 -午夜版全集-新视觉影院| 五月婷婷六月丁香综合视频在线| 香蕉久久国产AV一区二区| 丁香五月在线伊人| 无码人妻精品一区二区蜜桃色欲| 六月丁香激情最新更新| 91无码一区人妻A片蜜| 久久99久久99精品免观看软件 | 成人电影AV在线观看| 亚洲AV中文在线| 成人看片网站| 99久久这里只有精品免费官网| 99成人| 影音先锋人妻出差| 怡红院91a√| 婷婷激情性爱| 伊人久久激情图区五月| 日韩AV无码影片| 日韩视频99| 五月婷婷色综图片| 99免费在线视频| 手机激情网| 色播五月丁香综合| 精品久久99| 激情婷婷亚洲五月| 丁香五月停停av| 日日夜夜天天| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 五月狠狠| 久热91| 天天干天天射色综合| 中文字幕成人影视| 色婷婷丁香五月天| 婷婷五月天在线观看第二页| 久久婷婷色综合| 婷婷激情五月| 性色五月天| 丁香五月香蕉在线| 99热最新国内| 超碰在线视屏| 人人操超踫| 亚欧州精品视频| 国产成人精品一区二三区熟女在线 | 五月色亭丁香| 天天艹| 这里只有精品视频| 五月开心激情| 梁铮版蜘蛛女在线观看| 久99精品视频| 少妇大叫太大太粗太爽了A片| 亚洲精品永久久久久久| 人人舔人人色人人高潮| www.无码com| EEUSS鲁片一区二区三区| 日本高清综合网五月丁香| 五月色丁香综合| 色色色色色五月| 国产又爽又猛又粗的视频A片| 五月天色五月| 丁香五月亚洲综合| 久久久com| 丁香五月婷婷婷桃花影院| 色色婷婷五月| 婷婷五月天综合久久| A A色色| 综合天天综合| h亚洲| 亚洲超碰青涩| www.久久| 99啪啪| 五月天丁香| 丁香婷婷在线| 2020久久婷婷五月| www.婷婷五月| 97五月婷婷| 色9999综合久久| 少妇2做爰HD韩国电影| 成人AV在线电影| 99热精品在线在线| 情婷婷五月天| 另类激情五月| 77799热| 色色色五月婷婷| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 国产美女视频久| 婷婷五月视频| 亚洲行行色色| 日韩欧美四五区| 五月六月丁香激情视频| 99操碰| 欧美色99| 婷婷五月天Av| 久草a片| 欧美日韩成人在线免费| 丁香五月婷婷少妇| 五月丁香狠狠爱婷婷综合| 国产毛片精品一区二区色欲黄A片| 亚洲国产精品VA在线看黑人| 久久九色| 国产67194| 国产成人综合网| 丁香五月91| www.97碰碰com| 99啪啪网| 色色免费网站| 久操大| 久草A片| 五月丁香婷婷综合| 亚洲综合色色色| 99热这里只有精品5| 激情五月综合网| 日韩视频99| 欧美99热| 91人人人人人| 五月天久久小说| 色婷婷四虎| 亚洲四色五月| 日本在线视频播放91| 亚洲在线综合| 狠狠色丁香久久久婷| 99免费成人网| 六月五月久久丁香| 人妻精品久久久久久| 色色色色色色色色网站| 丁香综合婷婷五月天| 六月婷婷久久| 五月丁香色综合| 国产精产国品一二三在观看| 超级碰碰97在线| 超碰无码老师| 色婷婷五月天成人网| 色婷婷综合视频| 思思热99er在线视频| 激情五月六月丁香| www.com五月天| 亚洲五月天婷婷| www久| 亚洲成AV人片在线观看| 日本黄色在线观看| 日本色频| 久久婷婷一级片| 亚洲综合五月天| 丁香五月影院| 国产高清av黄色看片| 色色色色色色色色色色色色色五月天| 在线天堂9| 精品一区二区三区四区五区六区介绍 | 99久久精| 丁香婷婷色五月天| 超碰93在线观看| 99综合网| 黄色五月婷| 18av天堂| 亚洲热热视频| 无码99| 婷婷欧美| 色婷网| 91久草五月天婷婷| 大香蕉久久| 99re最新地址| 另类在线| 国产原创视频91九色| 亚洲av成人在线| 99re热久久| 夜夜 操无码| 先锋影音av色五月天资源站| 91色在线| 成人性爱精品视频| 婷婷久久久| 色婷婷精品视频在线播放| 国产成人网址| 色五月女| JAPANRCEP老熟妇乱子伦视频| 中文字幕无码成人电影| 丁香六月天婷婷在线| 开心婷婷丁香五月| www.五月天| av在线观看网站| 日本激情五月天‘| 思思热在线观看| 色五月婷婷激情基地| 婷婷玉月丁香五月在线视频| 97在线碰| 色久99| 26UUU精品一区二区c〇m| 亚洲网视屏| 丁香激情五月天| 狠狠搞综合色| 91中文在线| 激情五月色综合网| 婷婷六月天亚州| 玖玖婷婷五月天| 五月丁香激| 亚洲六月色| 影音先锋自拍网| 激情啪啪五月天| 久久六月天| 色婷成人狠干| 免费播放99性爱视频| 天天做天天爱天天爽| 综合久久97| 色五月激情网| 久久38视频| 天天拍久久| www久久久| 婷婷丁香人妻天久久| 丁香 久久| 月色色综合婷婷网| 国产高清精品色| 综合天堂AV久久久久久久| site:hcxsz888.com| PORNY九色9l自拍视频成人| av人人操| 天天舔日日肏夜夜爽| 亚洲亚洲人成综合网络| 狠狠草天天草| 久久怕怕视频| 看婷婷五月天网| 99热18| 97久久视频| 无码任你操| 久久9视频| 五月丁香婷婷综合| 五月丁香六月香香蕉| 激情AV在线| 丁香六月啪啪啪| 久久综合爱| 99自拍网| 激情五月婷婷五月| 激情综合五月激情| 国外亚洲成AV人片在线观看| 色婷婷婷婷成人网| 超碰成人公开| 丁香五月激情综合啪啪| 日韩AV在线免费| 五月天婷婷激情在线色图| 丁香97综合| 亚洲一区二区无遮挡A片| 婷婷六月综合| 亚洲免费看片| 天天舔夜夜操www com| 亚洲妇女熟BBW| 人妻操操色| 奇米影视777在线_在线观看午夜_h小视频在线观看_岛国大片 | 91久久人人操| 天天天天干| 超碰99久久| 婷婷五月天视频| 夜夜噜夜夜奇| 久久亭亭电影| 欧美色宗和激情| 五月丁香激情片| 在线视频区| 五月激情综合美女久久| 91互操| 色婷婷在线视频| 99热这里只有国产精品| 丁香熟女乱| 亚洲永久四色| 69er小视频| 欧美成人日韩| www.夜夜| 色色COm| 六月婷婷av| 国产乱子轮XXX农村| 激情综合色播| 久久停停超碰| 操人妻AV| 九九精品亚洲| 日本色婷婷综合| 日本wwww在线| 午夜丁香| 久色五月| 婷婷九月丁香| 婷婷五月,综合伊人| 婷婷五月天激情电影| 女人天堂av| 免费成人网在线观看| 超碰91在线| 五月激情婷婷丁香天堂| 色婷婷手机在线| 91九九热| www.激情| 少妇综合网| 激情伊人五月婷婷久久| 亚洲色图81p| 51精品国自产在线| 久久9热| 日韩婷婷五月天| 日韩人妻无码精品| 教师性爱毛片| wwwss在线观看| 深爱激情婷| 久久久亚洲成人无码A片| 中文无码婷婷| 五月丁香龟婷婷| 婷婷五月在线综合| 亚洲操B视频| 精品欧美性爱超级爽| 人妻AV在线观看| 狠狠色丁香久久婷婷综合五月| 99热91| 丁香五月最新网址| 超碰国产在线播放| 99网| 96精品久久久久久久久| 亚洲久热无码| 涩涩涩,com| 玖玖无码中文| 青青草网武则天| 婷婷五月天VI| 91狠狠色丁香婷婷综合久久| av在线激情| 99久久极情精品一区| 99久久成人| 做爱夜夜干天天操| 91丨九色丨白浆| 操逼综合网| 七月丁香婷婷 色色| 99性爱视频| 人人摸人人搞| www.五月婷婷久久.com| 丁香婷婷影院| 五月天社区狠狠| 操逼在线视频| 国产阿姨日皮艹逼内射视频| 久久久网站| 任我肏| 色五月婷婷操逼| 激情图片久久| 亚洲久艹| 91 久热| 欧美97超碰| 97爱艹婷婷开心丁香激情综合| 国产精品国产成人国产三级| 欧美色五月| 激情五月影院| 天天操天天干天天日| 久热无码| 九热视频| 婷婷亚洲影院| 大香蕉五月丁香| 丁香色五月 97干| 丁香五月影视| 97操视频| 99视频内射三四| 这里只有精品免费视频| 婷婷五月色| 婷婷九月色| 天天天天天日| 婷婷五月天色播| 九九RE视频在线精品| 可以看的av| 专区无日本视频高清8| 成人做爰A片免费看网站找不到了 噼里啪啦在线观看免费完整版视频 | 色爱99| 99久在线视频| 九九色综合| 婷婷五六月丁香| 79成人网| 五月伊人婷婷| 五月天激情网图片| 99热免费精品| 人妻久久久久久久 | 99久在线| 国庆精品久久| 成人婷婷五月| 色99欧洲色19| 天天干,夜夜爽| 天天操B| 日日夜夜狠狠| 伊人五月婷| 狠狠综合区| 五月婷婷综合激情网| 91精品熟女| 久狠日av| 亚洲天堂大香蕉| AVDV久久| 欧美天堂婷婷日韩| 日韩免费99| 国产亚洲99| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 丁香深五月婷婷| 97五月久久丁香婷婷| 狠狠舔| 五月丁香六月花| 午夜丁香综合婷婷| 99视频这里有精品| 五月婷婷综合精品| site:pzdcoin.com| 26UUU在线观看| 亚洲成人五月| 丁香婷婷色五月| 丁香婷婷五月份| 秋霞AV美国| 日韩黄黄| 丁香婷婷五月| 天天操天天操天天操天天操天天操| 国产人妻人伦精品一区二区| 久久婷婷综合色丁香| 五月天激情黄色小说在线观看| 欧美色色色| 96精品久久久久久久久| 熟妇人妻中文字幕无码老熟妇| 超碰在线播放免费观看| 日日噜人人人做人| 婷婷激情社区| 天天综合网站| 五月情涩综合婷婷| 密黄站| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 另类激情网| 深爱开心激情| 无码一区二区三区四区五区91c| 亚洲成人在线播放| 天天日,天天干,天天操| 五月丁香在线| 婷婷五月天亚洲综合| 色狠狠图片| 天天天天天天操| 狠狠久久婷婷| 开心五月丁香婷婷| 日本一级一级一级一级| 五月天丁香啪啪啪啪| 情欲综合网| 欧日韩成人| 天天综合网~91| 开心深爱五月天| 手机旧版看人妻1025| 色五月色综合| 深爱丁香网| 天天噜日日噜综合无码| 人人操超碰| 欧美天天干五月丁香| 99操视频| 香蕉网久久| 久久一热| 国产操B| 久色姿源| 99热这里有精品| WWW99热| 九九视频在线观看| 影音先锋AV资源男人站| 热久久99视频| 丁香五月欧美| 国产精品久久..4399| 99只有精品| 精品视频网| 亚洲无码九九| 美女婷婷激情亚洲| VA国产在线综合网站| 深爱激情丁香| 丁香大香蕉| 亚洲欧洲国产精品| 成人免费在线电影| 人人播| 五月丁香888| 99er热精品视频| 欧美日韩成人综合9| 婷婷激情五月综合基地| 99只有精品| anquye伊人| 久久九九网| 丁香无五月网| 丁香婷婷色五月| 久久亚洲网| 99国产精品久久久久久久久久久| 五月丁香综合啪啪啪啪啪| 五月天播播| 日日日日做夜夜夜夜无码| 九月婷婷久久| 人妻操逼| 日韩精品AV一区二区三区| 视色网在线播放| 免费看成人AA片无码视频吃奶| 五月天色五月天| www.lchjjc.com| 五月婷婷丁香在线|