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

ARTICLE DETAIL

資訊詳情

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

FreeRTOS Posix仿真環(huán)境搭建與內(nèi)核機(jī)制實驗指南

FreeRTOS Posix仿真環(huán)境搭建與內(nèi)核機(jī)制實驗指南 1. 為什么要在Posix環(huán)境仿真FreeRTOS如果你正在學(xué)習(xí)嵌入式實時操作系統(tǒng)尤其是FreeRTOS那么你大概率會遇到一個經(jīng)典的困境硬件依賴。無論是STM32、ESP32還是其他微控制器你都需要一塊開發(fā)板、一個調(diào)試器以及一套復(fù)雜的編譯、燒錄、調(diào)試環(huán)境。對于初學(xué)者來說這無疑是一道高門檻。編譯一個錯誤可能意味著反復(fù)的硬件連接、IDE配置和漫長的燒錄等待學(xué)習(xí)曲線陡峭挫敗感極強(qiáng)。這時在標(biāo)準(zhǔn)的Linux或macOS即Posix兼容環(huán)境下仿真運(yùn)行FreeRTOS就成了一條被嚴(yán)重低估的“捷徑”。這聽起來可能有點(diǎn)“離經(jīng)叛道”——一個為資源受限的MCU設(shè)計的RTOS跑在功能強(qiáng)大的PC上但這恰恰是深入理解其內(nèi)核精髓的絕佳方式。仿真的核心目的不是替代最終的硬件部署而是創(chuàng)造一個高效、純粹、可反復(fù)折騰的學(xué)習(xí)與開發(fā)沙盒。想象一下你可以用你最熟悉的文本編輯器如VSCode和GCC編譯器在幾秒鐘內(nèi)完成編譯。你可以用GDB進(jìn)行源碼級單步調(diào)試清晰地觀察任務(wù)是如何創(chuàng)建、切換、阻塞的。你可以方便地使用printf打印豐富的調(diào)試信息而不用擔(dān)心串口帶寬或影響實時性。更重要的是你可以脫離具體芯片的復(fù)雜外設(shè)和底層驅(qū)動將注意力100%集中在FreeRTOS內(nèi)核本身任務(wù)調(diào)度、隊列、信號量、事件組、內(nèi)存管理……這些核心機(jī)制是如何運(yùn)作的你的應(yīng)用邏輯在并發(fā)環(huán)境下會有怎樣的行為網(wǎng)絡(luò)上大量的“FreeRTOS學(xué)習(xí)筆記”和“菜鳥教程”往往基于具體硬件穿插著大量芯片外設(shè)的配置代碼容易讓人迷失重點(diǎn)。而Posix仿真環(huán)境剝離了硬件層讓你直面內(nèi)核。當(dāng)你通過仿真透徹理解了調(diào)度器、臨界區(qū)、上下文切換這些概念后再移植到真實硬件上你會發(fā)現(xiàn)自己是在“降維打擊”那些硬件相關(guān)的移植層port.c,portmacro.h代碼也不再是黑盒。所以這篇內(nèi)容就是帶你從零開始搭建一個純凈的FreeRTOS Posix仿真環(huán)境并利用它進(jìn)行一系列內(nèi)核實驗。我們會解決搭建過程中常見的編譯錯誤比如那個經(jīng)典的portmacro.h錯誤并設(shè)計幾個小實驗讓你親眼看到FreeRTOS是如何工作的。這不僅是學(xué)習(xí)更是一種高效的開發(fā)前驗證手段。2. 仿真環(huán)境搭建從源碼到可執(zhí)行文件搭建環(huán)境的第一步是獲取代碼。FreeRTOS的Posix仿真端口是其官方倉庫的一部分結(jié)構(gòu)非常清晰。2.1 獲取FreeRTOS內(nèi)核與Posix移植層代碼最直接的方式是從FreeRTOS的GitHub倉庫獲取。我們主要需要兩部分FreeRTOS內(nèi)核位于FreeRTOS/FreeRTOS-Kernel目錄下包含所有核心源文件tasks.c,queue.c,list.c等和頭文件。Posix/Linux仿真端口位于FreeRTOS/FreeRTOS-Kernel/portable/ThirdParty/GCC/Posix目錄下。這個端口層利用Linux的pthread線程和定時器來模擬硬件中斷和時鐘滴答。你可以克隆整個倉庫也可以只下載這兩個部分。為了簡化我們假設(shè)你已經(jīng)有了一個工作目錄~/freertos_sim。mkdir -p ~/freertos_sim cd ~/freertos_sim # 假設(shè)你已經(jīng)將FreeRTOS-Kernel拷貝到了當(dāng)前目錄 # 目錄結(jié)構(gòu)大致如下 # freertos_sim/ # ├── FreeRTOS-Kernel/ # │ ├── include/ (內(nèi)核頭文件) # │ ├── portable/ (所有移植層) # │ │ └── ThirdParty/ # │ │ └── GCC/ # │ │ └── Posix/ (我們需要的仿真端口) # │ ├── tasks.c, queue.c, ... (內(nèi)核源文件) # │ └── ... # └── demo_app/ (我們即將創(chuàng)建的應(yīng)用程序目錄)2.2 理解并解決第一個編譯坑configTICK_RATE_HZ與portmacro.h這是幾乎所有初學(xué)者在第一次嘗試編譯Posix仿真項目時會遇到的錯誤。錯誤信息通常類似于../FreeRTOS-Kernel/portable/ThirdParty/GCC/Posix/portmacro.h(73): error: #35: #error directive: configTICK_RATE_HZ must be defined.這個錯誤的根源在于編譯順序和頭文件包含路徑。我們來拆解一下portmacro.h是移植層的關(guān)鍵頭文件它定義了與硬件此處是Posix環(huán)境相關(guān)的數(shù)據(jù)類型、宏和函數(shù)。在第73行附近它有一行預(yù)處理指令#ifndef configTICK_RATE_HZ用于檢查這個關(guān)鍵配置是否已定義。configTICK_RATE_HZ是FreeRTOS最重要的配置之一它定義了系統(tǒng)時鐘滴答的頻率Hz即每秒發(fā)生多少次調(diào)度器心跳。它應(yīng)該在用戶級別的配置文件FreeRTOSConfig.h中定義。問題發(fā)生時機(jī)當(dāng)編譯器處理portmacro.h時如果它還沒有看到FreeRTOSConfig.h中定義的configTICK_RATE_HZ就會觸發(fā)這個#error。解決方案不是去修改portmacro.h而是確保正確的包含順序。在你的應(yīng)用程序主文件如main.c中頭文件包含順序必須嚴(yán)格遵守/* main.c */ /* 1. 首先包含標(biāo)準(zhǔn)庫頭文件 */ #include stdio.h #include stdlib.h /* 2. 最關(guān)鍵的一步必須在包含任何FreeRTOS頭文件之前包含你自己的FreeRTOSConfig.h */ #include “FreeRTOSConfig.h” /* 3. 然后包含F(xiàn)reeRTOS內(nèi)核頭文件 */ #include “FreeRTOS.h” #include “task.h” #include “queue.h” /* ... 其他你需要的FreeRTOS頭文件 */ /* 4. 最后包含硬件/移植相關(guān)頭文件如果需要的話對于Posix仿真通常不需要單獨(dú)包含portmacro.h */同時你需要在項目根目錄或者編譯器指定的包含路徑下創(chuàng)建一個FreeRTOSConfig.h文件。這里是一個最簡化的、適用于Posix仿真的配置示例/* FreeRTOSConfig.h */ #ifndef FREERTOS_CONFIG_H #define FREERTOS_CONFIG_H /* 核心配置系統(tǒng)時鐘頻率這里設(shè)為1000Hz即1ms一個滴答 */ #define configTICK_RATE_HZ (1000) /* CPU頻率對于仿真環(huán)境這個值不重要但必須定義??梢栽O(shè)為任意值如100MHz */ #define configCPU_CLOCK_HZ (100000000) /* 內(nèi)核功能配置 */ #define configUSE_PREEMPTION 1 // 使用搶占式調(diào)度 #define configUSE_TIME_SLICING 1 // 使用時間片輪轉(zhuǎn) #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 // Posix端口不支持優(yōu)化選擇 #define configUSE_TICKLESS_IDLE 0 // 仿真環(huán)境不需要低功耗tickless模式 #define configUSE_IDLE_HOOK 0 // 暫時不用空閑任務(wù)鉤子 #define configUSE_TICK_HOOK 0 // 暫時不用時鐘滴答鉤子 #define configMAX_PRIORITIES (5) // 優(yōu)先級數(shù)量夠用即可 #define configMINIMAL_STACK_SIZE (128) // 最小任務(wù)棧大小字 #define configTOTAL_HEAP_SIZE (1024 * 25) // 堆總大小用于動態(tài)內(nèi)存分配 /* 任務(wù)相關(guān)配置 */ #define configUSE_MUTEXES 1 // 使用互斥量 #define configUSE_RECURSIVE_MUTEXES 1 // 使用遞歸互斥量 #define configUSE_COUNTING_SEMAPHORES 1 // 使用計數(shù)信號量 #define configUSE_QUEUE_SETS 0 // 暫時不用隊列集 #define configUSE_APPLICATION_TASK_TAG 0 /* 內(nèi)存分配方案使用FreeRTOS自帶的heap_4.c內(nèi)存碎片整理 */ #define configSUPPORT_DYNAMIC_ALLOCATION 1 #define configSUPPORT_STATIC_ALLOCATION 0 /* 鉤子函數(shù)和調(diào)試配置 */ #define configCHECK_FOR_STACK_OVERFLOW 2 // 棧溢出檢查級別2較強(qiáng)檢查 #define configUSE_TRACE_FACILITY 1 // 啟用可視化跟蹤調(diào)試功能配合Tracealyzer #define configGENERATE_RUN_TIME_STATS 0 // 暫時不生成運(yùn)行時統(tǒng)計 #define configUSE_STATS_FORMATTING_FUNCTIONS 0 /* 與移植層相關(guān)的配置 */ #define configUSE_CO_ROUTINES 0 // Posix端口不支持協(xié)程 #define configUSE_TIMERS 1 // 使用軟件定時器 #define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES - 1) #define configTIMER_QUEUE_LENGTH 10 #define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE * 2) /* Posix/Linux仿真特定配置 */ #define configPROVIDE_vApplicationIdleHook 0 #define configPROVIDE_vApplicationTickHook 0 #define configPROVIDE_vApplicationMallocFailedHook 1 // 提供內(nèi)存分配失敗鉤子 /* 包含移植層特定的默認(rèn)配置如果有的話通常不需要 */ /* #include “freertos_platform_config.h” */ #endif /* FREERTOS_CONFIG_H */2.3 編寫Makefile串聯(lián)編譯與鏈接手動敲編譯命令很麻煩一個清晰的Makefile能極大提升效率。下面是一個針對我們仿真項目的Makefile示例# Makefile for FreeRTOS Posix Simulator TARGET freertos_demo BUILD_DIR build SRC_DIR . # FreeRTOS內(nèi)核路徑 FREERTOS_KERNEL_DIR ./FreeRTOS-Kernel FREERTOS_PORT_DIR $(FREERTOS_KERNEL_DIR)/portable/ThirdParty/GCC/Posix FREERTOS_MEM_DIR $(FREERTOS_KERNEL_DIR)/portable/MemMang # 源代碼文件 C_SOURCES \ $(SRC_DIR)/main.c \ $(FREERTOS_KERNEL_DIR)/tasks.c \ $(FREERTOS_KERNEL_DIR)/queue.c \ $(FREERTOS_KERNEL_DIR)/list.c \ $(FREERTOS_KERNEL_DIR)/timers.c \ $(FREERTOS_KERNEL_DIR)/event_groups.c \ $(FREERTOS_KERNEL_DIR)/stream_buffer.c \ $(FREERTOS_PORT_DIR)/port.c \ $(FREERTOS_MEM_DIR)/heap_4.c # 頭文件包含路徑 C_INCLUDES \ -I$(SRC_DIR) \ -I$(FREERTOS_KERNEL_DIR)/include \ -I$(FREERTOS_PORT_DIR) \ -I$(FREERTOS_MEM_DIR) # 編譯器標(biāo)志 CFLAGS -g3 -O0 -Wall -Wextra -pthread $(C_INCLUDES) LDFLAGS -pthread -lrt # 對象文件列表 OBJS $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c.o))) vpath %.c $(sort $(dir $(C_SOURCES))) # 默認(rèn)目標(biāo) all: $(BUILD_DIR)/$(TARGET) # 鏈接目標(biāo) $(BUILD_DIR)/$(TARGET): $(OBJS) echo Linking $ gcc $(OBJS) -o $ $(LDFLAGS) # 編譯規(guī)則 $(BUILD_DIR)/%.o: %.c | $(BUILD_DIR) echo Compiling $ gcc $(CFLAGS) -c $ -o $ # 創(chuàng)建構(gòu)建目錄 $(BUILD_DIR): mkdir -p $ # 清理 clean: rm -rf $(BUILD_DIR) # 運(yùn)行 run: all ./$(BUILD_DIR)/$(TARGET) .PHONY: all clean run關(guān)鍵點(diǎn)解析-pthread這是編譯Posix仿真程序的關(guān)鍵標(biāo)志因為移植層使用了pthread庫來創(chuàng)建和管理任務(wù)線程。-lrt鏈接實時庫用于clock_gettime等函數(shù)提供高精度定時器以模擬系統(tǒng)滴答。heap_4.c我們選擇了heap_4內(nèi)存管理方案它支持碎片整理是最通用和推薦的選擇。分離build目錄將生成的.o文件和最終可執(zhí)行文件放在獨(dú)立的build目錄保持源碼樹的整潔?,F(xiàn)在在項目根目錄下執(zhí)行make你應(yīng)該能順利編譯出可執(zhí)行文件build/freertos_demo。執(zhí)行make run即可運(yùn)行雖然現(xiàn)在main.c還是空的。3. 第一個仿真實驗創(chuàng)建兩個交替打印的任務(wù)環(huán)境搭好了我們來點(diǎn)實際的。第一個實驗是FreeRTOS的“Hello World”創(chuàng)建兩個任務(wù)讓它們以不同的頻率打印信息直觀地展示搶占式調(diào)度。3.1 編寫實驗主程序創(chuàng)建一個main.c文件內(nèi)容如下#include “FreeRTOSConfig.h” // 必須第一個包含 #include “FreeRTOS.h” #include “task.h” #include “queue.h” #include stdio.h /* 任務(wù)函數(shù)原型 */ static void vTask1_Function(void *pvParameters); static void vTask2_Function(void *pvParameters); /* 任務(wù)句柄用于后續(xù)操作如刪除 */ TaskHandle_t xTask1Handle NULL; TaskHandle_t xTask2Handle NULL; int main(void) { printf(“Posix Simulator: Starting FreeRTOS scheduler...\n”); /* 創(chuàng)建第一個任務(wù)。 * 參數(shù)依次為任務(wù)函數(shù)指針 任務(wù)描述字符串 棧深度字 傳遞給任務(wù)的參數(shù) * 優(yōu)先級 任務(wù)句柄指針。 */ xTaskCreate( vTask1_Function, /* 任務(wù)函數(shù) */ “Task1”, /* 任務(wù)名用于調(diào)試 */ configMINIMAL_STACK_SIZE * 2, /* 棧大小這里是最小棧的2倍 */ NULL, /* 任務(wù)參數(shù)這里不需要 */ tskIDLE_PRIORITY 1, /* 優(yōu)先級空閑任務(wù)優(yōu)先級1 */ xTask1Handle /* 存儲任務(wù)句柄 */ ); /* 創(chuàng)建第二個任務(wù)優(yōu)先級與Task1相同 */ xTaskCreate( vTask2_Function, “Task2”, configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY 1, /* 相同優(yōu)先級將依賴時間片輪轉(zhuǎn) */ xTask2Handle ); /* 啟動調(diào)度器從此控制權(quán)交給FreeRTOS內(nèi)核。 * 這個函數(shù)正常情況下不會返回。 */ vTaskStartScheduler(); /* 如果調(diào)度器因為某種原因退出才會執(zhí)行到這里 */ printf(“ERROR: Scheduler exited unexpectedly!\n”); for(;;); return 0; } /* 任務(wù)1的實現(xiàn)每秒打印一次 */ static void vTask1_Function(void *pvParameters) { const TickType_t xDelay1000ms pdMS_TO_TICKS(1000); // 將毫秒轉(zhuǎn)換為系統(tǒng)滴答數(shù) const char *pcTaskName “Task1”; /* 大多數(shù)任務(wù)都是一個無限循環(huán) */ for(;;) { printf(“[%s] is running. Time since boot: %lu ticks\n”, pcTaskName, xTaskGetTickCount()); /* 調(diào)用阻塞延時函數(shù) vTaskDelay。 * 這會使任務(wù)進(jìn)入阻塞狀態(tài)讓出CPU給其他就緒任務(wù)。 * 這是任務(wù)協(xié)作的關(guān)鍵。 */ vTaskDelay(xDelay1000ms); } /* 任務(wù)函數(shù)不應(yīng)返回如果返回內(nèi)核會刪除該任務(wù) */ } /* 任務(wù)2的實現(xiàn)每500毫秒打印一次 */ static void vTask2_Function(void *pvParameters) { const TickType_t xDelay500ms pdMS_TO_TICKS(500); const char *pcTaskName “Task2”; for(;;) { printf(“[%s] is running. Time since boot: %lu ticks\n”, pcTaskName, xTaskGetTickCount()); vTaskDelay(xDelay500ms); } }3.2 編譯、運(yùn)行與觀察在終端執(zhí)行make clean make run。你會看到類似以下的輸出時間戳?xí)f增Posix Simulator: Starting FreeRTOS scheduler... [Task2] is running. Time since boot: 1 ticks [Task1] is running. Time since boot: 1 ticks [Task2] is running. Time since boot: 501 ticks [Task2] is running. Time since boot: 1001 ticks [Task1] is running. Time since boot: 1001 ticks [Task2] is running. Time since boot: 1501 ticks ...發(fā)生了什么main函數(shù)創(chuàng)建了兩個優(yōu)先級相同的任務(wù)tskIDLE_PRIORITY 1后調(diào)用了vTaskStartScheduler()。調(diào)度器啟動創(chuàng)建空閑任務(wù)優(yōu)先級最低然后開始調(diào)度。由于兩個任務(wù)優(yōu)先級相同且都就緒FreeRTOS會使用時間片輪轉(zhuǎn)調(diào)度前提是configUSE_TIME_SLICING設(shè)為1。在同一個時間片內(nèi)誰先被調(diào)度是不確定的所以你會看到Task1和Task2的第一條打印順序可能每次運(yùn)行都不同。每個任務(wù)打印后調(diào)用vTaskDelay()。這個函數(shù)會將任務(wù)置為阻塞狀態(tài)并指定一個喚醒時間xDelay1000ms或xDelay500ms。任務(wù)阻塞期間CPU會去執(zhí)行其他就緒任務(wù)這里是另一個任務(wù)或空閑任務(wù)。系統(tǒng)滴答中斷由Posix端口模擬的定時器觸發(fā)每1ms發(fā)生一次。當(dāng)中斷服務(wù)程序發(fā)現(xiàn)某個任務(wù)的阻塞時間到期會將其重新置為就緒狀態(tài)。因此Task2每500個滴答500ms喚醒一次并打印Task1每1000個滴答1000ms喚醒一次并打印。你看到了并發(fā)的效果。實操心得1vTaskDelayvsvTaskDelayUntil在這個例子中我們用了vTaskDelay它指定的是“從調(diào)用此刻起延遲多少時間后喚醒”。這會導(dǎo)致任務(wù)的實際執(zhí)行周期等于“處理時間 延遲時間”如果處理時間波動周期就不穩(wěn)定。對于需要精確周期性的任務(wù)如控制循環(huán)應(yīng)該使用vTaskDelayUntil它能保證任務(wù)以固定的絕對時間間隔執(zhí)行。在仿真環(huán)境中你可以輕松測試這兩種API的行為差異。4. 深入調(diào)度機(jī)制優(yōu)先級搶占與共享資源保護(hù)上一個實驗展示了同優(yōu)先級任務(wù)的協(xié)作?,F(xiàn)在我們來探索FreeRTOS的核心特性優(yōu)先級搶占式調(diào)度以及隨之而來的共享資源保護(hù)問題。4.1 實驗二高優(yōu)先級任務(wù)搶占低優(yōu)先級任務(wù)修改main.c創(chuàng)建三個不同優(yōu)先級的任務(wù)#include “FreeRTOSConfig.h” #include “FreeRTOS.h” #include “task.h” #include stdio.h static void vHighPriorityTask(void *pvParameters); static void vMediumPriorityTask(void *pvParameters); static void vLowPriorityTask(void *pvParameters); TaskHandle_t xHighPriorityTaskHandle NULL; int main(void) { printf(“Demo: Priority Preemption\n”); /* 創(chuàng)建低優(yōu)先級任務(wù) */ xTaskCreate(vLowPriorityTask, “LowPri”, configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY 1, NULL); /* 創(chuàng)建中優(yōu)先級任務(wù) */ xTaskCreate(vMediumPriorityTask, “MedPri”, configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY 2, NULL); /* 創(chuàng)建高優(yōu)先級任務(wù)并獲取其句柄 */ xTaskCreate(vHighPriorityTask, “HighPri”, configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY 3, xHighPriorityTaskHandle); vTaskStartScheduler(); for(;;); return 0; } /* 高優(yōu)先級任務(wù)啟動后延遲2秒然后開始瘋狂計算模擬占用CPU */ static void vHighPriorityTask(void *pvParameters) { printf(“[HighPri] Created, delaying 2s...\n”); vTaskDelay(pdMS_TO_TICKS(2000)); // 讓低和中優(yōu)先級任務(wù)先運(yùn)行一會兒 printf(“[HighPri] Starts busy calculation...\n”); volatile uint32_t ulCounter 0; for(int i0; i0xFFFFFF; i) { // 一個很長的空循環(huán)模擬計算密集型任務(wù) ulCounter; } printf(“[HighPri] Calculation finished.\n”); /* 自殺式刪除自己 */ vTaskDelete(xHighPriorityTaskHandle); } /* 中優(yōu)先級任務(wù)每秒打印一次 */ static void vMediumPriorityTask(void *pvParameters) { const TickType_t xDelay pdMS_TO_TICKS(1000); for(;;) { printf(“[MedPri] Running at tick: %lu\n”, xTaskGetTickCount()); vTaskDelay(xDelay); } } /* 低優(yōu)先級任務(wù)每500ms打印一次 */ static void vLowPriorityTask(void *pvParameters) { const TickType_t xDelay pdMS_TO_TICKS(500); for(;;) { printf(“[LowPri] Running at tick: %lu\n”, xTaskGetTickCount()); vTaskDelay(xDelay); } }編譯運(yùn)行觀察輸出。你會看到前2秒只有LowPri和MedPri在交替打印因為HighPri在延時阻塞中。2秒后HighPri就緒由于它的優(yōu)先級最高立即搶占了當(dāng)前正在運(yùn)行的LowPri或MedPri任務(wù)開始執(zhí)行它的長循環(huán)。在HighPri循環(huán)執(zhí)行的整個期間可能持續(xù)數(shù)秒LowPri和MedPri雖然延時已到處于就緒狀態(tài)但無法得到執(zhí)行因為高優(yōu)先級任務(wù)沒有釋放CPU沒有調(diào)用類似vTaskDelay的阻塞函數(shù)。這就是“優(yōu)先級搶占”——高優(yōu)先級任務(wù)一旦就緒會立即搶占低優(yōu)先級任務(wù)的CPU使用權(quán)。HighPri執(zhí)行完畢并刪除自己后調(diào)度器才會重新調(diào)度MedPri和LowPri。這個實驗清晰地展示了不恰當(dāng)使用高優(yōu)先級任務(wù)的危害“餓死”低優(yōu)先級任務(wù)。在實際項目中高優(yōu)先級任務(wù)如關(guān)鍵控制循環(huán)必須設(shè)計為周期性的、短時間執(zhí)行完畢的或者通過信號量、事件等機(jī)制主動阻塞以讓出CPU。4.2 實驗三共享資源沖突與互斥量保護(hù)當(dāng)多個任務(wù)尤其是不同優(yōu)先級的任務(wù)訪問同一個全局變量或硬件資源如串口時就會發(fā)生資源競爭。讓我們模擬一個經(jīng)典的“讀寫沖突”場景。#include “FreeRTOSConfig.h” #include “FreeRTOS.h” #include “task.h” #include “semphr.h” // 信號量/互斥量頭文件 #include stdio.h #include stdint.h /* 共享資源一個簡單的計數(shù)器 */ static uint32_t ulSharedCounter 0; /* 用于保護(hù)共享資源的互斥量 */ static SemaphoreHandle_t xMutex NULL; static void vIncrementTask(void *pvParameters); static void vReadTask(void *pvParameters); int main(void) { printf(“Demo: Shared Resource Protection with Mutex\n”); /* 創(chuàng)建互斥量 */ xMutex xSemaphoreCreateMutex(); if(xMutex NULL) { printf(“ERROR: Failed to create mutex!\n”); for(;;); } /* 創(chuàng)建兩個任務(wù)一個寫增加一個讀 */ xTaskCreate(vIncrementTask, “Increment”, configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY 2, NULL); xTaskCreate(vReadTask, “Read”, configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY 1, NULL); vTaskStartScheduler(); for(;;); return 0; } /* 寫任務(wù)循環(huán)增加計數(shù)器 */ static void vIncrementTask(void *pvParameters) { const TickType_t xShortDelay pdMS_TO_TICKS(10); for(;;) { /* 獲取互斥量如果已被占用則阻塞等待 */ if(xSemaphoreTake(xMutex, portMAX_DELAY) pdTRUE) { /* 進(jìn)入臨界區(qū)安全地操作共享資源 */ uint32_t ulLocalCopy ulSharedCounter; vTaskDelay(xShortDelay); // 模擬一個耗時的操作增加沖突概率 ulLocalCopy; ulSharedCounter ulLocalCopy; /* 離開臨界區(qū)釋放互斥量 */ xSemaphoreGive(xMutex); } vTaskDelay(pdMS_TO_TICKS(100)); // 每100ms嘗試增加一次 } } /* 讀任務(wù)循環(huán)讀取并打印計數(shù)器值 */ static void vReadTask(void *pvParameters) { const TickType_t xDelay pdMS_TO_TICKS(250); for(;;) { uint32_t ulValueRead; if(xSemaphoreTake(xMutex, pdMS_TO_TICKS(50)) pdTRUE) // 等待互斥量超時50ms { ulValueRead ulSharedCounter; xSemaphoreGive(xMutex); printf(“[Read] Safely read counter value: %lu\n”, ulValueRead); } else { printf(“[Read] FAILED to get mutex within 50ms! (Counter may be inconsistent)\n”); } vTaskDelay(xDelay); } }運(yùn)行這個程序你會看到“Safely read”的輸出?,F(xiàn)在讓我們故意制造一個Bug注釋掉vIncrementTask函數(shù)中獲取(Take)和釋放(Give)互斥量的兩行代碼模擬一個不保護(hù)共享資源的寫任務(wù)。// if(xSemaphoreTake(xMutex, portMAX_DELAY) pdTRUE) // { uint32_t ulLocalCopy ulSharedCounter; vTaskDelay(xShortDelay); // 模擬耗時操作 ulLocalCopy; ulSharedCounter ulLocalCopy; // xSemaphoreGive(xMutex); // }再次編譯運(yùn)行。你可能會看到類似這樣的輸出[Read] Safely read counter value: 0 [Read] FAILED to get mutex within 50ms! (Counter may be inconsistent) [Read] Safely read counter value: 1 [Read] Safely read counter value: 1 [Read] Safely read counter value: 2 [Read] Safely read counter value: 2 ...或者更糟讀到的值出現(xiàn)錯亂比如從1直接跳到3或者連續(xù)兩次讀到相同的值但寫任務(wù)明明增加了。這是因為讀任務(wù)在讀取ulSharedCounter的瞬間寫任務(wù)可能正執(zhí)行到ulLocalCopy和ulSharedCounter ulLocalCopy之間導(dǎo)致讀到的數(shù)據(jù)是不完整的、中間狀態(tài)的。實操心得2互斥量的使用陷阱——優(yōu)先級反轉(zhuǎn)互斥量是保護(hù)共享資源的利器但使用不當(dāng)會引發(fā)優(yōu)先級反轉(zhuǎn)。假設(shè)有三個任務(wù)L低、M中、H高。H和L都需要訪問同一個互斥量保護(hù)的資源。如果L先獲取了互斥量然后H就緒試圖獲取H會被阻塞。此時如果M優(yōu)先級介于L和H之間就緒它會搶占L并執(zhí)行導(dǎo)致高優(yōu)先級的H在等待中優(yōu)先級的M而M并不需要那個資源。這就是優(yōu)先級反轉(zhuǎn)。FreeRTOS的互斥量具有優(yōu)先級繼承機(jī)制當(dāng)高優(yōu)先級任務(wù)H等待被低優(yōu)先級任務(wù)L持有的互斥量時L的優(yōu)先級會臨時被提升到H的級別使其盡快執(zhí)行完釋放互斥量從而緩解反轉(zhuǎn)。在仿真環(huán)境中你可以設(shè)計任務(wù)來復(fù)現(xiàn)和觀察這一現(xiàn)象。5. 高級調(diào)試與問題排查技巧在Posix環(huán)境下仿真我們擁有在真實硬件上難以企及的強(qiáng)大調(diào)試工具。5.1 使用GDB進(jìn)行源碼級調(diào)試在Makefile的CFLAGS中我們已經(jīng)添加了-g3調(diào)試符號。我們可以這樣調(diào)試cd ~/freertos_sim make clean make gdb ./build/freertos_demo在GDB中(gdb) break main # 在main函數(shù)入口設(shè)斷點(diǎn) (gdb) break vTask1_Function # 在任務(wù)函數(shù)入口設(shè)斷點(diǎn) (gdb) run # 運(yùn)行程序 (gdb) info threads # 查看所有線程FreeRTOS任務(wù)在Posix下對應(yīng)為線程 (gdb) thread 2 # 切換到2號線程可能是某個FreeRTOS任務(wù) (gdb) next # 單步執(zhí)行 (gdb) print ulSharedCounter # 打印變量值 (gdb) backtrace # 查看調(diào)用棧你可以單步跟蹤任務(wù)的創(chuàng)建、切換觀察變量在并發(fā)環(huán)境下的變化這對于理解內(nèi)核行為和排查復(fù)雜并發(fā)Bug至關(guān)重要。5.2 棧溢出檢測實戰(zhàn)FreeRTOS提供了強(qiáng)大的棧溢出檢測機(jī)制configCHECK_FOR_STACK_OVERFLOW。我們在FreeRTOSConfig.h中將其設(shè)為2。當(dāng)任務(wù)棧溢出時鉤子函數(shù)vApplicationStackOverflowHook會被調(diào)用。我們需要實現(xiàn)它/* 在main.c中添加 */ void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName) { (void)xTask; // 消除未使用參數(shù)警告 printf(“!!! STACK OVERFLOW in task: %s !!!\n”, pcTaskName); /* 在實際系統(tǒng)中這里可能需要系統(tǒng)復(fù)位 */ for(;;); // 死循環(huán)便于觀察 }然后我們可以故意制造一個棧溢出static void vStackHungryTask(void *pvParameters) { printf(“[StackHungry] Starting...\n”); /* 在棧上分配一個非常大的數(shù)組 */ char hugeBuffer[configMINIMAL_STACK_SIZE * 10]; // 遠(yuǎn)大于創(chuàng)建任務(wù)時分配的棧大小 /* 使用一下緩沖區(qū)防止編譯器優(yōu)化掉 */ for(int i0; isizeof(hugeBuffer); i) { hugeBuffer[i] i % 256; } printf(“[StackHungry] This line may not be printed if stack overflow occurs.\n”); for(;;) { vTaskDelay(pdMS_TO_TICKS(1000)); } }創(chuàng)建這個任務(wù)并運(yùn)行你很可能看到棧溢出鉤子函數(shù)被觸發(fā)。注意棧溢出檢測不是100%實時它通常在任務(wù)切換時檢查棧指針是否越界。級別2的檢測比級別1更嚴(yán)格但仍有漏檢可能。在仿真環(huán)境中你可以安全地測試這些邊界條件。5.3 追蹤與可視化可選如果你有Percepio Tracealyzer之類的工具可以配置configUSE_TRACE_FACILITY為1并在代碼中插入追蹤點(diǎn)然后將生成的追蹤文件導(dǎo)入工具進(jìn)行可視化分析查看任務(wù)狀態(tài)遷移、內(nèi)核對象交互的時序圖。這在分析復(fù)雜的多任務(wù)交互問題時非常有用。在Posix仿真環(huán)境下配置追蹤比在真實硬件上簡單得多。6. 從仿真到真實硬件思維與代碼的過渡在Posix環(huán)境下玩轉(zhuǎn)FreeRTOS內(nèi)核后當(dāng)你回歸真實硬件如STM32你會發(fā)現(xiàn)大部分應(yīng)用層代碼任務(wù)邏輯、隊列通信、信號量同步是完全可以直接復(fù)用的。需要改變的只是底層移植層將portable/ThirdParty/GCC/Posix替換為對應(yīng)芯片的移植層如portable/GCC/ARM_CM4F用于Cortex-M4。啟動文件與時鐘配置由芯片廠商的HAL庫或標(biāo)準(zhǔn)外設(shè)庫提供。FreeRTOSConfig.h需要根據(jù)硬件調(diào)整如configCPU_CLOCK_HZ設(shè)為真實的系統(tǒng)時鐘頻率configTICK_RATE_HZ根據(jù)需求調(diào)整通常100或1000可能還需要配置低功耗選項。外設(shè)驅(qū)動串口打印要換成HAL_UART_TransmitGPIO操作要換成HAL庫函數(shù)等。仿真經(jīng)歷帶來的最大優(yōu)勢是思維上的你不再懼怕并發(fā)因為你親眼見過任務(wù)如何切換你深刻理解了阻塞與非阻塞API的區(qū)別你知道了保護(hù)共享資源的重要性你習(xí)慣了使用調(diào)試工具觀察系統(tǒng)運(yùn)行時狀態(tài)。這些經(jīng)驗讓你在面對真實的、資源受限的嵌入式環(huán)境時能更專注于硬件特性與性能優(yōu)化而不是被困在內(nèi)核的基本概念里。最后別忘了清理你的實驗環(huán)境。make clean可以幫你清除所有生成的文件讓你的項目目錄保持整潔準(zhǔn)備開始下一個更精彩的FreeRTOS仿真實驗。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
丁香五月狠狠在线观看| 色婷婷亚洲精品天天综| 精品久久婷婷| 五月成人丁香av91| 天天插天天爽| 99热精品在线观看| 色偷偷色婷婷| 99色视频在线观看| 五月婷婷综合激情网| 99国产精品白浆在线观看免费| 天天爽天天摸| 五月天中文网| 五月五丁香婷婷| 玖玖婷婷婷丁香五月| 久久五月视频| 日日操夜夜爽| 久久婷婷伊人| 中文资源在线a | 另类精品视频在线观看| 九月激情综合婷婷| 青青草五月天| 婷婷五月丁香综合桃花色网| www超碰com| 夜夜撸夜夜骑| 九九热只有精品| 五月天婷婷社区| 色五月丁香一区在线| 综合视频久久| 九九AV| 91大神在线免费看视频全集男男一起操| 亚洲天堂99| 日本欧美国产| 五月花激情| www.99热这里精品| 婷婷综合在线| 婷婷综合视频| 99色网站| 欧美S码亚洲码精品M码| 五月婷婷丁香91| 99精品国产在热久久| 五月天丁香网站| 桔色成人在线| 影音先锋偷偷色男人站| 性一交一乱一交A片久久四色| 丁香久月| 大香蕉婷婷| 开心五月婷婷| 五月丁香999| 国产精品色色| 色色色色色色色色综合网| 国产亚洲色婷婷久久99精品91| 俺也去在线视频| 激情婷婷亚洲五月| 9久热这里只有精品| 熟女五月天久久综合| 婷婷五月天激情四射五月天激情| 色婷婷狠狠色| 色五月丁香五月| 99在线观看精品视频| 99爱视频免费| 亚州色色色| 99爱爱| 99热这里只有精品2| 91狠狠综合久久| 国产三级片91| 亚洲精品V天堂中文字幕| 被强行糟蹋的女人A片| 少妇AB又爽又紧无码网站| 婷婷五月色| 国产一级片| 天天综合网站| 亚洲一级 片内射网站在线观看| 97在线视频 欧美| 亚洲图色五月天| 婷婷丁香成人五月天| 丁香婷婷五月综合影院| 青草久久五月婷伊人| 五月丁香激情综合网官网| 99热只有精| 欧美性爱五月天| 色色综合激情| 亚洲乱码日产精品BD| 岛国AAAV| 性爱先锋AV| 五月天亚洲最大成人| α久久| 99综合色| 中字幕视频在线永久在线观看免费| 疯狂做受XXXX高潮A片动画| 综合在线观看99| AV变态另类一区二区| 色情婷| 五月开心婷婷极品激情| 亚洲日日日| 狠狠操综合| 另类少妇人与禽zOZZ0性伦| 丁香六月丁香婷婷激情| 激情美女五月天| 91人妻视频| 成人视频在线免费播放| 九月丁香网婷婷| 国产精品人妻在线网址| 五月天六月婷婷电影| 91人人网| 欧美啪啪五月天| 亚洲操操| 变态另类9| 五月天婷久久| 97五月天婷婷午夜| 亚洲黄色影视| 欧美色99| 丁香五月婷婷激情尤物| 成人网站高清无码| wwwwww.色| www.久热| 色丁香五月天| 99玖玖在线视频| 日韩在线观看网址| 欧美性丁香色色五月天综合爱爱| 丁香五月播播| 91碰碰碰| 丁香色婷婷五月天| 久操操| 丁香六月久久| 久久区区一二三av| 久久人妻伦理| 97色五月丁香婷婷| 婷婷情色激情| 97涩婷婷婷婷基地| 色婷婷视频综合| 色婷婷色99国产综合精品| 在线综合91| www.日日夜夜| 色色色激情网| www,av好吊操| 99资源人人| 激情五月天www| 丁香激情五月| 91操操操| 色爱爱综合网| 久 久9 9 热 视 频| 五月婷婷六月激情| 五月丁香婷婷人体| 97婷婷五月丁香| 欧美天天干五月丁香| www.夜夜| 五月色情网| www99热| 婷婷色网站| 人妻少妇色综合| 1024久婷| 五月丁香久人妻中文| 日本久草福利| 六月色色| 5月丁香婷婷| 99热6这里只有精品| 一级性感黄色内射视频| 另类激情综合| 五月婷六月天| 中文字幕性爱视频| 大香蕉综合| 99ri久久| 欧美性猛交99久久久久99按摩 | 婷婷五月免费视频| 久月婷婷| 色色色五月天婷婷| 少妇搡BBBB搡BBB搡毛茸茸 | 久久婷婷五月天| 深爱激情五月网| 亚洲国产精品五月天| 99这里| 天天摸天天舔天天爽| 国产乱妇无乱码大黄AA片| 丁香六月婷婷综合色| 久久香蕉影院| 狠狠操狠狠干综合| 99久久99九九99九九九| 免费超碰在线观看| 五月丁香琪琪| 激情综合色| 午夜色丁香| 九九性爱网| 色优久久| 特黄三级又爽又粗又大| 日韩婷婷| 丁香五月在线播放| 欧美久久五月婷婷| 99在线观看精品| 九九热最新地址| 婷婷五亚洲| 97资源碰碰| 日日操日日撸| 色五月天综合| 黑人熟妇一区二区三区| 久久97| 丁香六月天之亚州热女 | 日日夜夜狠狠| 天天日综合| 爱久综合| 日韩精品电影| 婷婷丁香六月| 无码色色色| 夜夜涩涩涩| 亚洲一区二区色图-亚洲精品国产精品乱码-成人AV | 九九色天堂| 欧美成人va| 久久只有这里精品免费| 99综合自拍| 另类小说五月天| 久久精品视频在这里有| 丁香五月视频在线观看| 噜噜色五月| 九九综合| 婷婷中文字幕| 久99在线视频| 思思热视频在线观看| 亚洲五月丁香综合网| 99热欲| 五月婷在线观看| 女人天堂 AV| 99热99成人| 97超碰99热99| 男人大jjc女人免费视频| 99热这里只有精品4| 天天干狠狠艹| 亚洲bt丁香五月天婷婷激情小说| 激情综合五月.....| 九九狠狠干| 91婷婷丁香五月亚洲| 激情亚洲网| 色播五月婷婷| 99热无码首页| 久播影院免费观看电视剧大全最新网| 99亚洲大片精品永久在线观看| 九九九九国产| www.99热视频| 亚洲精品亚洲人成人网| 99人人干| 狠狠色丁香五月婷巨| 色五月自偷自拍婷婷婷婷| 香蕉久久av一区二区三区| 成人丁香色| 一二线视频 另类| 99在线精品视频| 久久久91| 97人人操在线| 淫视馆aV二区一区| 六月 丁香 视频| 在线观看的av| 激情色色| 伊人婷婷五月天| 色色色综合色| 久久婷婷五月| 五月天激情丁香| 亚洲成人影视在线观看| 色婷婷香蕉| 丁香婷婷色情| 99性视频| 99噜噜噜在线播放| 超碰永久在线| 亚洲AV网址| 91嫩草久久| 激情婷婷综合网| 97亚洲精品| 人妻有码乱操| 99人人精品| 久久综合天天综合| 五月天婷婷人妻| 狠狠色激情综合| 99热精这里只有精品| 婷婷五月精品在线| 六月婷婷五月天| 色播五月天激情| 色色com| 久久婷婷婷| 婷婷五月天小说| 一区视频网站| 九九成人视频| 精品自拍99| 色婷在线视频| 天天做天天爱天天日| 婷婷五月成人有| 五月丁香激情婷婷综合字幕| 99热久| 久色激情| 国产69久久久欧美黑人A片| 婷婷色五月大香蕉在线| 操日视频| 五月婷婷丁香五月亚洲色| 99性爱无码| 婷婷va| 丁香五月首页| 久久九久久| 丁香五月激情性色郤| 九九机热| 色偷偷五月天| 91超级碰人人操| 97热在线精品| 五月婷婷综合色啪首页| 婷婷色九月| 综合激情五月丁香| 97超级碰碰碰| 婷婷五月天天| 操碰99| 成人做爰高潮A片免费视频| 欧亚中文A V| 久久大香蕉同僚| 五月丁香五月丁香| www..999热久| 玖玖伊人网| 91碰在线| 99乱视频| 亚洲传媒在线观看| 色播五月丁香婷婷| 亚洲第一成人无码A片| 另类天堂| 人人97碰| 色情五月综合婷婷| 色综合视频在线| 国产1区2区3区| 色噜噜在线| 天天肏在线观看| 婷婷丁香五月社区亚洲| www.99热最新视频8| 直接看的AV| www.夜夜| 天天爽爽日日做做| 狠狠色噜噜狠狠狠狠综合| 婷婷五月天最新综合你懂的| 五月丁香六月婷婷在线观看| 97超碰免费超级在线观看| 婷婷成人AV| www.色五月天.com| 被强行糟蹋的女人A片| 伊人www22综合色| 狠狠五月天婷婷激情网。| 丁香五月播播| 中文字幕av在线| 婷婷综合五月天亚洲综合| 五月天社区| 人伦30P| 99综合色| 激情AV中文| 婷婷涩涩网| 26UUU欧美| 97干视频在线| aa久久| 激情五月天99色| 天天天天天天噜| 日本精品人妻无码77777| 丁香五月网站| 色五月成人| 久久色区| 狠狠狠狠狠狠狠狠| 开心五月激情| 成人做爰A片免费看网站找不到了| 色综合久久综合中文综合网| 粉嫩av懂色av蜜臀av熟妇| 激情av网| 青青草99热久久精品国| 五月婷婷五月丁香| 国产一区18| 婷婷草| 五月丁香激情综合网官网| www.minyis.com【JT】国内CDN落地页保证转化QQ2101460746 | 久久xx| 五月婷婷黄色| 婷婷五月激情丁香| 天天噜天天爱| 无码字幕中文| 夜夜干夜夜操| 九热...av| 亚洲第一成人无码A片| 99热精品10| 人人综合久| 色五月天堂| 超碰在线99| 婷婷激情丁香五月婷婷激情丁香五月婷婷| 2018国产大陆天天弄| 色婷婷六月综合| 色五月综合激情网| 五月天婷婷小说| www.日本91| 99在线免费视频| 99久re热视频精品98| 五月天婷婷久久视频| 99婷婷| 久青草影院| 五月婷婷激情色情网| 亚洲色图欧美色图日本视频| Www.激情| 五月天激情综合网俺也去| 少妇人妻人伦A片| 人妻肉射免费观看| 性色av大香综合| 日本一级特黄大片AAAAA级| 超碰成人在线观看| 91se视频| www久久99| 五月婷婷天天色| 激情六月五月婷婷综合网| 天天色粽合合合合合合合| 五月综合在线婷婷图片| 亚洲一区二区无遮挡A片| AV人人操| 色色com| 蜜臀A∨在线水帘洞| www久久久久久久| 国产精品成人AV在线| 婷婷五月天最新综合你懂的 | 九九成人电影婷婷| 国产免费一区二区三州老师F1F1| 人妻操操色| 九九99在线| 久久99网站| 五月天狠狠| 婷婷丁五月| AV操一操| 人妻丰满精品一区二区A片| 人妻久久久久久久 | 99这里只有| 欧美英丁香开心快乐六月天网| 玖玖五月丁香| 色婷青青| 秋霞AV淫| 北条麻妃伊人| 五月开心网| 思思热在线观看| 色婷婷电影网| 色婷婷色| 亚洲欧美综合7777色亭亭| 丁香五月色五月| 婷婷五月天视频小说| 岛国操B不卡在线| 狠狠操狠狠爱| 激情综合网五月激情| 日日操日日射| 亚洲成人色五月婷婷综合| www.久久久久久久久久久| 国产成人一区二区三区在线观看 | 另类丁香五月天区图| 天天插综合网| 色五月丁香婷婷| 玖玖婷婷五月天| 天天爽天天日人人爱| 超碰高清在线| 天天日P天天射P| 91九色网| 9色在线| 超碰免费99| 五月天婷婷在线播放| 婷婷综合成人五月天| 六月丁香av| 天天操精品| 免费无码毛片一区二区A片| 色色婷婷丁香| www.超碰在线| 五月婷婷色播| 99re视频在线播放| 婷婷午夜精品久久久| 久久色亭亭五月天| 丁香五月综合| 亚洲精品影视| 五月婷婷中文字幕| 亚洲天堂99| 亚洲综合色网| 大地9中文在线观看免费高清| 99视频在线| 伊人婷婷五月天| 天天日夜夜拍| 精品人妻午夜一区二区三区四区| 丁香五月花影院| www久久久久久久久久久| 乱岳熟女50岁| 91趴趴| 婷婷欧美激情| 综合网色| 玖玖精品视频99| 久久机热这里只有 | www色五月| 99精品无码| 97人人干| 婷婷激情五月天激情小说| 热99热久| 日本久久婷| 色色精品色| 77799热| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 激情综合区| 色欲丁香| 天天色天天操天天射| 亚洲九九99精品视频在线播放| 91人人爱| 久九色| 婷婷色五月亚洲| 天天爽夜夜爽夜爽精品| 久久伦乱| 男人的天堂婷婷色五月| 99日精品视频| 思思热思在线精品视频| 激情综合网五月天| www久| 九九精品9| 九九色大香蕉| 99热这里只有精品69| 婷婷五月花丁香| www.91操| 五月婷婷婷色| 99热这里只有精品国产免费| 国产密乳av一区二区三区四区| 色五月综合激情| 成人做爰黄A片免费看直播室男男| 九色综合五月天婷五月| 婷婷五月av| 天天爱天天做天天舔| 思思热再线视频| 色久丁香五| 丁香五月天激情视频| 超碰国产一区| 伊人影音无码一区二区三区| 99亚洲精品视频| www色婷婷| 九九九九无码| 九九一综合精品| 综合色影| 五月婷九九草| 最新精品视频99| 日韩人妻无码精品| 91精品91久久久久77777| 日本精品干| 色婷婷小说| 日韩无码AV电影网站| 伊久久婷婷| 成人色色视频| 国产欧美精品AAAAAA片| 久久9视频欧美| 五月婷婷人妻| www.99热国产| 色色99色色| 99久久久久久| 热九九九九| 99er在线观看| 少妇被躁爽到高潮无码文| 99九九玖玖| 思思久久99热只有频精品66| 99网| 婷婷六月丁香激情综合| 色综合久久久久| 久久久99视频| 99人妻碰碰碰久久久久视| 欧美十二区| 色国产五月| 婷婷五月天丁香| 91人碰| 五月丁香免费看| 1024操逼| 伊人深爱综合| 欧美一级a | 一区中文字幕电影| 五月婷婷人妻| 色约约视频一区二区三区四区五区| 国产精品噜噜在线视频| 婷婷色婷婷| VA日本视频| 99视频只有精品| 日本综合色图| www.99热| 色婷婷视频| 这里只有精品视频在线| 日日色五月天| 91人妻人人操| 人人草人| 九九干视频| 天天色噜| 久久与婷婷| 91狠狠色色丁香婷婷综合久久| 五月天色站| 婷婷五月天成人小说| 97婷婷五月| 亚洲天天| 996er热| 色色激情| 五月婷婷和六月| 蜜乳av一级av| 亚洲这里只有精品| 欧美精品啪啪| 伊人99热| 丁香五月色欲| av在线中文| 性爱视频久久| 九九热中文| 色色免费网站| 天天爽天天| 狠狠狠狠狠狠狠狠草| 亚洲精品国产A久久久久久| 丁香五月第四色88| 丁乡久久| 五月激情视频| 婷婷激情社区| 色五月大香蕉| 五月天丁香婷婷网| 婷婷久久精品| 婷婷日| 97操碰在线97| 色噜噜婷婷| 日韩六十路91性交电影| 日韩淑女人妻luan伦激情精品一区二| AV电影在线播放| hd五月婷婷在线| 亚洲视频久久| 五月综合色| 天天精品视频在线观看视频| 五月丁香六月成人| 思思9久久| 天天日 天天草| 九九色图| 有码一区二区三区| 国产日比| 亚洲99热| 色六月丁香婷婷狠狠干| 亚洲黄3级片网站欧美| 亚洲天堂99| 欧美色爱五月天| 五月天丁香网| 亚洲免费视频网站| 成熟妇人A片免费看网站| 五月婷婷五月天| 婷婷五月天va| 色五月成人| 老师高潮流白浆喷水的A片| 91操片| 丁香六月视频免费观看| 女性自慰系列第五页| 欧美日韩色色| 欧美大肥婆大肥BBBBB| 天天干天天拍| 亚洲婷婷激情五月天| 好好干Av| 色噜噜狠狠色综合成人99| 久久婷婷青青草| 婷婷五月激情五月激情| 九九无码| 丁香五月婷中字幕| α久久| 五月丁香六月婷婷,婷| 激情五月婷婷视频一区二区三区| 丁香综合日产精品久久| 免费看欧美成人A片无码| 丁香色六月婷婷| 99在线精品在线视频| 狠狠干2007| 成人精品在线| 久久婷婷91| 99九九热视频免费| 色综合久久无码| 丁香五月婷婷图片综合| 国产肥白大熟妇BBBB视频| 激情五月婷婷网| 日韩久热| 国产99久久久| aaa久久| 六月婷婷色综合| 婷婷色色欧美| 综合色五月| 中文字幕久久一区二区三区| 99热精品9| 深爱激情五月天色婷婷| 日日爽日日操| 五月丁香网站在线播放| 国产五月天激情小说| www。88热在线视频免费观看| 97人妻碰碰中文无码久热丝袜| 99九九中文字幕视频| 成人在线视频男人的天堂4399| 日本成人内射| 人妻五月天激情开心网| 色情开心五月| 久久婷丁香五月| 色色五月天丁香| 91偷拍视频| 丁香婷婷五月天激情四射| 开心五月综合激情网| 99综合在线| 2015好吊操| 开心婷婷五| 婷婷五月俺要去| 久久只这里有精品| 五月婷婷综合在线视频小说| 开心婷婷中文字幕| 中文字幕在线免费观看视频| 涩五月婷婷| 六月成人网| yirenjiqingshiping| 男人天堂AV在线一区二区| 98永久精品| 久热婷婷| 日韩AAA| 性色视频| 婷婷色播婷婷| 色婷婷五月影视| 婷婷激情小说网| 狠狠干五月丁香| 丁香五月冃欧美| 五月丁香五月婷婷| 精品久久人妻| 久久久亚洲成人无码A片| 美欧成人视频| 六月丁香基地| 综合久久五月天| PORNY九色9l自拍视频成人| 激情综合亚洲| 97操男人的天堂| 黄网网站在线播放| 亚洲精品性色| 成人一级片| 中字幕视频在线永久在线观看免费 | 欧亚洲在线高清视频| 五月丁香婷婷激情在线| 99色在线视频| 久热9| 国产美女主播vip| 五月天日日操夜夜操| 天天肏天天爽夜夜爽| 六月久久婷婷| 九九婷婷五月天| 综激情网| 五月丁香亚洲婷婷| 日韩色色视频| 婷婷五月18永久免费网站| xxxx五月激情| 99热资源在线| 久久艹 五月天| 色婷婷综合综合网| 五月天婷婷青青| 色99色| 日本婷婷五月天| 久久蜜臀婷婷| 色播五月| 色拍九九九| 人人玩人人橾| 丁香五月天堂网| 尤物一区二区| 色噜噜狠狠色综合伊人| 我去色色网五雨天| 啪啪日本欧美| 亚洲激情高潮| www.激情| 婷婷五月天AV在线| 五月婷婷二月丁香| 国产精品第一国产精品| 九九国产视频| 欧美三日本三级少妇三99| 狠狠狠狠狠狠草| 怡红院院在线导航网| 亚洲天堂99| www.精品久9| 久久成人天| 色色99| 久久XX| 九热精品| 天天干天天操天天射| 亚洲 五月 婷婷 成人| 九九久久综合| 99er这里只有精品| 亚洲激情av| 丁香五月停停基地| 久久这里只有精品8| 精品热九九| 天天干天天操天天上| 99操逼| 久久这里只有精品5| 激情综合九月| 五月天丁香成人社| 97精品自拍视频| 午夜日日| 激情亭亭五月| 99ri在线播放| 色噜噜97视频在线观看| 中文AV在线观看| 五月天婷婷丁香导航| 在线看av| 欧美色色日韩| 婷婷五月激情视频在线| 综合久久六月| 操逼巨乳91| 14色综合婷婷| www.婷婷| 丁香婷婷五月天校园春色| 六月丁香五月婷婷| 日本熟女三区| 天久综合91综合首页| 丁香五月天激情小说| 人妻丰满精品一区二区A片| 婷婷成人综合免费视频| 五月天婷婷影院| 久久久月丁香| 伊人九九68| 99re这里| 婷婷狠狠18禁久久| 超碰人人在线| 色必久悠悠影院| 亚洲精品又粗又大又爽A片| 伊人丁香婷婷东京| 婷婷丁香五月视频| 日本女人久久| 日夜操B| 玖玖婷婷五月天| 五月色丁香国产在线视频| 91婷婷视频| 五月丁香在线观看| 亚洲综合九九| 亚洲A片成人无码久久精品青桔| 久热这里只有精品66| 狠狠色噜噜色狠狠狠综合色 | 四色女婷婷| 99啪视频在线观看| 婷婷色情网| 欧美日韓成人亚洲精品另类| 91九九九色在| 色播婷婷大香蕉| 怕怕av| 欧美一级a | 丁香花社区av| 欧美色久| 丁香五月激情六月| 亚州精品成人片| 亚洲无码色色| 五月丁香花婷婷玉莉AV| 99久久久免费| 色五月丁香A欧美com | 91狠狠色色丁香婷婷综合久久| 久热9| 五月停视频天堂| 中文字幕,综合,91| 性婷婷| 久色五月天| 被强行糟蹋的女人A片| 开心深爱激情网| 亚洲va日| 99色日本| 日韩AV在线影片| www色五月| 色操b| 天天日日夜夜爽| 伊综合蕉| 六月天婷婷| 影音先锋91| 五月婷婷激情四月| 五月天日日操夜夜操 | 丁香五月色| 97色五月天| 99热在线中文字幕| 国产免费av网站| 久久久18| 色婷婷免费观看| 婷婷六月色播| 婷婷五月天另类视频| 激情人妻综合| 亚洲电影中文字幕| 婷婷在线播放| www99热| 婷婷狠狠操| 天天射综合网夜夜操| 婷婷激情伍月网| 99热精品观看| 丁香五月熟女| 欧美精品中文字幕亚洲专区| 色爱亚洲| 九九热精品在线| 日日舔夜夜操| 6080av| 婷婷欧美激情综合| 五月婷精品| 婷丁香五月天| 婷婷综合av| 182无码| 青青草视频免费观看| 99热这里只有精品青草| 97碰人人操| 五月天久久婷婷| 9久热这里只有精品| 综合xx网| 亚洲精品操一操、噜一噜、摸一摸、爽 | 色综合久久五月| 中美日韩成人在线| 探花搜索结果 - 黄上黄| 九九在线91| 亚洲色99综合天堂| 精品热九九| 日韩性爱AV| 91 影音先锋| 99燥99日| www,99热在线观看| 五月综合激情久久| 99在线视频操999| 五月丁香花成人社区| 婷婷香蕉精品| 激情五月天婷婷播播久久综合91| 激情性爱五月天网页| 香蕉婷婷五月| 任你弄在线视频免费| 色婷婷很很丝袜| yw国产AV| 激情丁香五月| 婷婷丁香五月天影院| 激情久久久久久久久久久| 美女黄频aⅴ视频| 婷婷伊人久久| 丁香六月AV| WwW天天干| 五月丁综合在线观看| m色激情网| 可似看的AV| 婷婷色五月婷| 色玖玖综合网| 9久视频| 狠狠干综合| 成人国产欧美大片一区| 91re色综合视频| 壅壅儕家a| 九九99热| 久久精品色| www.热99热| 婷婷淫淫狠狠六月| 婷婷天堂综合| 99亚洲天堂| 亚洲精品一二三| 五月丁香婷婷激情四射迷人| 99re视频在线播放| 五月天婷婷黄色视频| 狠狠操在线视频| 日本狠狠网| 99视频在线精品免费观看2| 国产精品一区在线观看你懂的| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 婷婷亚洲五月| 亚洲综合99| 在线看的免费网站| 激情熟女网| 五月丁香激情片| 26uuu亚洲欧美| 久草性爱| 精品国产AV色一区二区深夜久久| 色99视| 天天爽夜夜爽夜夜爽精品| 久色五月婷婷综合| 激情五月天婷婷| 亚洲色五月| 69精品人妻不卡视频| 99视频超级精品| 99热这里只有精品官网| 九九久久综合| 婷婷五月综合基地| 丁香五月婷婷激情小说| 综合久久人妻| 婷婷五月婷婷| 色婷婷最新域名 | 色噜噜狠狠色综合网| 中字幕视频在线永久在线观看免费| 99热久久日本| 亚洲视频丁香网va| 天堂中文国产| 五月天色软件| 99热免费网站| 狠狠干,狠狠操| 欧美性生交XXXXX无码小说| 9久久婷婷国产综合精品性色| 九九热中文| 四色五月婷婷| 丁香六月色婷婷欧美| 亚洲精品色| 97超碰婷婷五月天| 激情久久久| 久久精热| 99操九九网| 婷婷六月激情小说网| 天天澡天天狠天天天做| 中文字幕网伦射乱中文| 久久精品99| 五月激情天| a免费在线| 色综合色欲综合天天免费| 91精品无码| 久久婷婷激情四射五月天| 婷婷色系婷色| 99色色| 激情久久久久久| 婷婷深爱五月| 色欲AVV| 色五月婷婷在线视频| 天天艹夜夜艹| 男人天堂99| 99精品在线| 婷婷五月丁香成人网| 狠狠狠狠狠狠狠狠草| www.激情五月| 婷婷色色网| 久久9视频欧美| www.maotanji.com| 天天干,天天日| 狠狠 久久| 五月天另类图片| 婷婷五月天综合亚洲| 婷婷丁香一月| 日本乱子人伦在线视频| 98毛片| 五月天婷婷基地| 99热国产| 五月婷婷香| 婷婷伊人綜合中文字幕| www.久久| www.久久久久| 色香欲综合| 丁香五月天在线观看视频| 99免费在线| 丁香五月1页| 99色视频| 另类五月婷婷| 婷婷五月天激情网| 亚洲综合五月天综合| 免费看欧美成人A片无码 | 婷婷五月丁香色情| Av狠狠色丁香婷| 91精品久久久久久综合五月天| 婷婷九月久久| 九九热99热| 九九无码视屏| 丁香花操逼| 台湾无码A片一区二区| 91碰在线| 91狠狠综合久久久| bbwcuckold精品熟妇| 99精品视频在线观看| 婷婷玉月丁香五月在线视频| 色狠狠色综合久久久绯色aⅴ影视| 五月天激情AAAA| 特黄三级又爽又粗又大| 中文av网站| 婷婷四色五月| 俺去也婷婷| 丁香五月冃欧美| www.激情五月天.con| 97色片| 亚洲99激情| 激情五月婷婷综合网| 五月天亚洲综合网| 色综合久久天天综合网| 丁香五月天啪啪| 色色综合视频| 婷婷激情四射网| 久久精彩视频| 亚洲综合狠狠艹| 色九月欧美| 色情五月丁香| 欧美狠狠地| 激情婷婷丁香五月天| 久久99综合| 婷婷色正月| 色三级色三级| 热91久| 久久色五月| 开心五月婷婷六月丁香| 五月九九综合| 久99视频| 五月天精品综合| 丁香婷婷黄网站| 九九九九操逼| 色碰碰| www,婷婷五月天777me,com| 黑人无码一区| 国产精品激情AV久久久青桔| 色婷婷六月| 亚洲丁香五月美女| 91打屁股视频网站| 思思9久久| 五月色网| 天天爽天天草| 五月天婷基地| 9热在线观看| Blackedraw视频一区二区| 久久五月激情| 日本成人小说婷婷六月| 狠狠干综合| 人人操91色| 最近中文字幕在线中文视频| 久久婷婷五月天| 五月丁香综合伦理片| Www99热| 精品热九九| 丁香五月天激情| 久久免费操| 五月激情久久综合网| 再次出发二| www.婷婷六月天| 九九综合九色欧美狠狠| 婷婷色丁香五月| 婷婷五月天性爱视频| 性生生活大片又黄又| 99热这里只有精品66| 五月婷婷在线视频| 天天爽夜夜爽| 天天做天天双| www.天天色综合| 久99热在线观看| 五月激情综合婷婷| 另类少妇人与禽zOZZ0性伦| 激情久久综合| 色五月婷婷老师| 十月丁香九月婷婷综合| 久久性爱视频免费| 激情AV| 日韩高清成人| 蜜乳人妻一区二区三区| 99热每日| 婷婷六月激情综合| 午夜69成人做爰视频| 第五色婷婷| 99热碰碰热| 久久亚洲无码| 激情五月天在线免费美女视频| 综合视频五月| 性 色 婷婷| 天天插天天插天天日| 五月天啪啪视频| 色婷婷五月综合在线| 99免费偷拍视频| 超碰在线资源| 另类亚洲电影| 午夜激情四射影院| 五月婷护士| 久热99视频在线观看| 丁香六月婷婷色XXXX| 国产古装妇女野外A片| 极品人妻VIDEOSSS人妻| 成人无码髙潮喷水A片| 五月天婷婷久久| 任你草| 国产欧美熟妇另类久久久| 天天色情站| 8090在线影视少妇| 成人午夜视频精品一区| 国产亚洲成AV人片在线观黄桃| 色综合色| 一起草AV入口| 91高潮喷水久久久久久久久 | 色约约视频一区二区三区四区五区 | 婷婷五月天视频亚洲| 开心深爱激情网| 99热| 内射综合网| 色播五月网| 激情婷婷五月天| 九九婷婷激情综合网| 91精品久| 日本人人干| 色噜噜狠狠色综合无码久久欧美| 丁香亭亭久久| 丁香六月婷婷高清| 丁香久久久| 久久色亭亭五月天| 色综合九九| 国产99热| 五月丁香亚州综合网| 五月丁香啪。| 日本熟妇精品99| 99久久国产宗和精品1上映| 国产热精品| 亚洲精品大片| 婷婷天堂综合| 九九热精品视频在线观看| 九九精品9| 亚州操逼网| 人人爱干人人爱草| 色综合久久久久久久久五月| 五月丁香六月玩女人| 成人视屏在线观看| 搡BBBB搡BBB搡18| 四川操逼站| 97九色| 激情五月天婷婷视频| WWW.桔色成人.COM| 色综合五月| 七七色综合| 超碰av在线| 五月天婷婷色小说| 26uuu欧美| 俺也去色| www.91AV.COM| 深情六月婷婷综合久久| 久色欧美| 婷婷五月天亚洲| 国产精品成av人在线视午夜片| www99久久| 婷婷五月天视频小说| 综合久久高清| 中文字幕日本最新乱码视频| 婷婷久久影院| 丁香五月激情婷婷激情| 婷婷五月精品中文字幕| 免费无码毛片一区二区A片 | 青青草原福利在线| 久久五月综合| www.玖玖婷婷在线| 久热2025无码| 99色综合| 色综合久久久无码中文字幕999| 丁香五月激情棕合| 久久九精品| 这里只有精彩视频| 很很色丁香久久停停| 六月亚洲| 超碰在线成人| 操逼五月天| 妻久久久久| 九九久久五月天| 九月停停| 激情欧美婷五月| 久久在这里99| 国洲夜色亚热在线久久| 69五月天视频| 大香蕉综合| 国产小网站| 国产成人va在线| www.夜夜操| 色婷婷丁香综合中文字幕| 五月天久久丁香| 99这里有精品| www.zbzhongsen.com| 成功精品影院| 26uuu成人网| 日本在线视频手机播放五月婷| 视频免费精品免费精品免费精品免费精品免费精品免费精品免费99 | 99久久玖玖| 少妇被躁爽到高潮无码文| 婷婷五月花| 五月丁香婷婷综合| 久操香蕉| 婷婷丁香视频| 性爱综合网| 爱性综合网| 五月婷婷欧美| 五月丁香六月婷婷久久肏| 丁香五月天在线| 69凹凸成人综合网| 色综合色欲综合天天免费| 99热在线观看| 丁香五月,开心五月,成人婷婷| 成人婷婷| 六月婷基地| 丁香五月六月婷婷综合| www.九九婷婷| 人妻久久久久久久久久久| 丁香五月色情av| 国精产品一区二区三区| 日韩精品视频中文字幕| 狠狠操天天操综合| 熟女人妻一区二区三区免费看| 婷婷 久综合| 婷婷五月天电影网| 看黄的网站18禁| 这里只有精品视频免费在线观看| 91Chinese在线| 99热亚洲精品| 欧美丁香婷婷天天操| 亚洲久热| 99热只有国产在线精品|