日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

韦东山freeRTOS系列教程之【第五章】队列(queue)

發布時間:2023/12/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 韦东山freeRTOS系列教程之【第五章】队列(queue) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 系列教程總目錄
  • 概述
  • 5.1 隊列的特性
    • 5.1.1 常規操作
    • 5.1.2 傳輸數據的兩種方法
    • 5.1.3 隊列的阻塞訪問
  • 5.2 隊列函數
    • 5.2.1 創建
    • 5.2.2 復位
    • 5.2.3 刪除
    • 5.2.4 寫隊列
    • 5.2.5 讀隊列
    • 5.2.6 查詢
    • 5.2.7 覆蓋/偷看
  • 5.3 示例8: 隊列的基本使用
  • 5.4 示例9: 分辨數據源
  • 5.5 示例10: 傳輸大塊數據
  • 5.6 示例11: 郵箱(Mailbox)

需要獲取更好閱讀體驗的同學,請訪問我專門設立的站點查看,地址:http://rtos.100ask.net/

系列教程總目錄

本教程連載中,篇章會比較多,為方便同學們閱讀,點擊這里可以查看文章的 目錄列表,目錄列表頁面地址:https://blog.csdn.net/thisway_diy/article/details/121399484

概述

隊列(queue)可以用于"任務到任務"、“任務到中斷”、"中斷到任務"直接傳輸信息。

本章涉及如下內容:

  • 怎么創建、清除、刪除隊列
  • 隊列中消息如何保存
  • 怎么向隊列發送數據、怎么從隊列讀取數據、怎么覆蓋隊列的數據
  • 在隊列上阻塞是什么意思
  • 怎么在多個隊列上阻塞
  • 讀寫隊列時如何影響任務的優先級

5.1 隊列的特性

5.1.1 常規操作

隊列的簡化操如入下圖所示,從此圖可知:

  • 隊列可以包含若干個數據:隊列中有若干項,這被稱為"長度"(length)
  • 每個數據大小固定
  • 創建隊列時就要指定長度、數據大小
  • 數據的操作采用先進先出的方法(FIFO,First In First Out):寫數據時放到尾部,讀數據時從頭部讀
  • 也可以強制寫隊列頭部:覆蓋頭部數據

更詳細的操作入下圖所示:

5.1.2 傳輸數據的兩種方法

使用隊列傳輸數據時有兩種方法:

  • 拷貝:把數據、把變量的值復制進隊列里
  • 引用:把數據、把變量的地址復制進隊列里

FreeRTOS使用拷貝值的方法,這更簡單:

  • 局部變量的值可以發送到隊列中,后續即使函數退出、局部變量被回收,也不會影響隊列中的數據

  • 無需分配buffer來保存數據,隊列中有buffer

  • 局部變量可以馬上再次使用

  • 發送任務、接收任務解耦:接收任務不需要知道這數據是誰的、也不需要發送任務來釋放數據

  • 如果數據實在太大,你還是可以使用隊列傳輸它的地址

  • 隊列的空間有FreeRTOS內核分配,無需任務操心

  • 對于有內存保護功能的系統,如果隊列使用引用方法,也就是使用地址,必須確保雙方任務對這個地址都有訪問權限。使用拷貝方法時,則無此限制:內核有足夠的權限,把數據復制進隊列、再把數據復制出隊列。

5.1.3 隊列的阻塞訪問

只要知道隊列的句柄,誰都可以讀、寫該隊列。任務、ISR都可讀、寫隊列。可以多個任務讀寫隊列。

任務讀寫隊列時,簡單地說:如果讀寫不成功,則阻塞;可以指定超時時間。口語化地說,就是可以定個鬧鐘:如果能讀寫了就馬上進入就緒態,否則就阻塞直到超時。

某個任務讀隊列時,如果隊列沒有數據,則該任務可以進入阻塞狀態:還可以指定阻塞的時間。如果隊列有數據了,則該阻塞的任務會變為就緒態。如果一直都沒有數據,則時間到之后它也會進入就緒態。

既然讀取隊列的任務個數沒有限制,那么當多個任務讀取空隊列時,這些任務都會進入阻塞狀態:有多個任務在等待同一個隊列的數據。當隊列中有數據時,哪個任務會進入就緒態?

  • 優先級最高的任務
  • 如果大家的優先級相同,那等待時間最久的任務會進入就緒態

跟讀隊列類似,一個任務要寫隊列時,如果隊列滿了,該任務也可以進入阻塞狀態:還可以指定阻塞的時間。如果隊列有空間了,則該阻塞的任務會變為就緒態。如果一直都沒有空間,則時間到之后它也會進入就緒態。

既然寫隊列的任務個數沒有限制,那么當多個任務寫"滿隊列"時,這些任務都會進入阻塞狀態:有多個任務在等待同一個隊列的空間。當隊列中有空間時,哪個任務會進入就緒態?

  • 優先級最高的任務
  • 如果大家的優先級相同,那等待時間最久的任務會進入就緒態

5.2 隊列函數

使用隊列的流程:創建隊列、寫隊列、讀隊列、刪除隊列。

5.2.1 創建

隊列的創建有兩種方法:動態分配內存、靜態分配內存,

  • 動態分配內存:xQueueCreate,隊列的內存在函數內部動態分配

函數原型如下:

QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize ); 參數說明
uxQueueLength隊列長度,最多能存放多少個數據(item)
uxItemSize每個數據(item)的大小:以字節為單位
返回值非0:成功,返回句柄,以后使用句柄來操作隊列
NULL:失敗,因為內存不足
  • 靜態分配內存:xQueueCreateStatic,隊列的內存要事先分配好

函數原型如下:

QueueHandle_t xQueueCreateStatic(UBaseType_t uxQueueLength,UBaseType_t uxItemSize,uint8_t *pucQueueStorageBuffer,StaticQueue_t *pxQueueBuffer); 參數說明
uxQueueLength隊列長度,最多能存放多少個數據(item)
uxItemSize每個數據(item)的大小:以字節為單位
pucQueueStorageBuffer如果uxItemSize非0,pucQueueStorageBuffer必須指向一個uint8_t數組,
此數組大小至少為"uxQueueLength * uxItemSize"
pxQueueBuffer必須執行一個StaticQueue_t結構體,用來保存隊列的數據結構
返回值非0:成功,返回句柄,以后使用句柄來操作隊列
NULL:失敗,因為pxQueueBuffer為NULL

示例代碼:

// 示例代碼#define QUEUE_LENGTH 10#define ITEM_SIZE sizeof( uint32_t )// xQueueBuffer用來保存隊列結構體StaticQueue_t xQueueBuffer;// ucQueueStorage 用來保存隊列的數據// 大小為:隊列長度 * 數據大小uint8_t ucQueueStorage[ QUEUE_LENGTH * ITEM_SIZE ];void vATask( void *pvParameters ){QueueHandle_t xQueue1;// 創建隊列: 可以容納QUEUE_LENGTH個數據,每個數據大小是ITEM_SIZExQueue1 = xQueueCreateStatic( QUEUE_LENGTH,ITEM_SIZE,ucQueueStorage,&xQueueBuffer ); }

5.2.2 復位

隊列剛被創建時,里面沒有數據;使用過程中可以調用xQueueReset()把隊列恢復為初始狀態,此函數原型為:

/* pxQueue : 復位哪個隊列;* 返回值: pdPASS(必定成功)*/ BaseType_t xQueueReset( QueueHandle_t pxQueue);

5.2.3 刪除

刪除隊列的函數為vQueueDelete(),只能刪除使用動態方法創建的隊列,它會釋放內存。原型如下:

void vQueueDelete( QueueHandle_t xQueue );

5.2.4 寫隊列

可以把數據寫到隊列頭部,也可以寫到尾部,這些函數有兩個版本:在任務中使用、在ISR中使用。函數原型如下:

/* 等同于xQueueSendToBack* 往隊列尾部寫入數據,如果沒有空間,阻塞時間為xTicksToWait*/ BaseType_t xQueueSend(QueueHandle_t xQueue,const void *pvItemToQueue,TickType_t xTicksToWait);/* * 往隊列尾部寫入數據,如果沒有空間,阻塞時間為xTicksToWait*/ BaseType_t xQueueSendToBack(QueueHandle_t xQueue,const void *pvItemToQueue,TickType_t xTicksToWait);/* * 往隊列尾部寫入數據,此函數可以在中斷函數中使用,不可阻塞*/ BaseType_t xQueueSendToBackFromISR(QueueHandle_t xQueue,const void *pvItemToQueue,BaseType_t *pxHigherPriorityTaskWoken);/* * 往隊列頭部寫入數據,如果沒有空間,阻塞時間為xTicksToWait*/ BaseType_t xQueueSendToFront(QueueHandle_t xQueue,const void *pvItemToQueue,TickType_t xTicksToWait);/* * 往隊列頭部寫入數據,此函數可以在中斷函數中使用,不可阻塞*/ BaseType_t xQueueSendToFrontFromISR(QueueHandle_t xQueue,const void *pvItemToQueue,BaseType_t *pxHigherPriorityTaskWoken);

這些函數用到的參數是類似的,統一說明如下:

參數說明
xQueue隊列句柄,要寫哪個隊列
pvItemToQueue數據指針,這個數據的值會被復制進隊列,
復制多大的數據?在創建隊列時已經指定了數據大小
xTicksToWait如果隊列滿則無法寫入新數據,可以讓任務進入阻塞狀態,
xTicksToWait表示阻塞的最大時間(Tick Count)。
如果被設為0,無法寫入數據時函數會立刻返回;
如果被設為portMAX_DELAY,則會一直阻塞直到有空間可寫
返回值pdPASS:數據成功寫入了隊列
errQUEUE_FULL:寫入失敗,因為隊列滿了。

5.2.5 讀隊列

使用xQueueReceive()函數讀隊列,讀到一個數據后,隊列中該數據會被移除。這個函數有兩個版本:在任務中使用、在ISR中使用。函數原型如下:

BaseType_t xQueueReceive( QueueHandle_t xQueue,void * const pvBuffer,TickType_t xTicksToWait );BaseType_t xQueueReceiveFromISR(QueueHandle_t xQueue,void *pvBuffer,BaseType_t *pxTaskWoken);

參數說明如下:

參數說明
xQueue隊列句柄,要讀哪個隊列
pvBufferbufer指針,隊列的數據會被復制到這個buffer
復制多大的數據?在創建隊列時已經指定了數據大小
xTicksToWait果隊列空則無法讀出數據,可以讓任務進入阻塞狀態,
xTicksToWait表示阻塞的最大時間(Tick Count)。
如果被設為0,無法讀出數據時函數會立刻返回;
如果被設為portMAX_DELAY,則會一直阻塞直到有數據可寫
返回值pdPASS:從隊列讀出數據入
errQUEUE_EMPTY:讀取失敗,因為隊列空了。

5.2.6 查詢

可以查詢隊列中有多少個數據、有多少空余空間。函數原型如下:

/** 返回隊列中可用數據的個數*/ UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue );/** 返回隊列中可用空間的個數*/ UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue );

5.2.7 覆蓋/偷看

當隊列長度為1時,可以使用xQueueOverwrite()或xQueueOverwriteFromISR()來覆蓋數據。
注意,隊列長度必須為1。當隊列滿時,這些函數會覆蓋里面的數據,這也以為著這些函數不會被阻塞。
函數原型如下:

/* 覆蓋隊列* xQueue: 寫哪個隊列* pvItemToQueue: 數據地址* 返回值: pdTRUE表示成功, pdFALSE表示失敗*/ BaseType_t xQueueOverwrite(QueueHandle_t xQueue,const void * pvItemToQueue);BaseType_t xQueueOverwriteFromISR(QueueHandle_t xQueue,const void * pvItemToQueue,BaseType_t *pxHigherPriorityTaskWoken);

如果想讓隊列中的數據供多方讀取,也就是說讀取時不要移除數據,要留給后來人。那么可以使用"窺視",也就是xQueuePeek()或xQueuePeekFromISR()。這些函數會從隊列中復制出數據,但是不移除數據。這也意味著,如果隊列中沒有數據,那么"偷看"時會導致阻塞;一旦隊列中有數據,以后每次"偷看"都會成功。
函數原型如下:

/* 偷看隊列* xQueue: 偷看哪個隊列* pvItemToQueue: 數據地址, 用來保存復制出來的數據* xTicksToWait: 沒有數據的話阻塞一會* 返回值: pdTRUE表示成功, pdFALSE表示失敗*/ BaseType_t xQueuePeek(QueueHandle_t xQueue,void * const pvBuffer,TickType_t xTicksToWait);BaseType_t xQueuePeekFromISR(QueueHandle_t xQueue,void *pvBuffer,);

5.3 示例8: 隊列的基本使用

本節代碼為:FreeRTOS_08_queue。

本程序會創建一個隊列,然后創建2個發送任務、1個接收任務:

  • 發送任務優先級為1,分別往隊列中寫入100、200
  • 接收任務優先級為2,讀隊列、打印數值

main函數中創建的隊列、創建了發送任務、接收任務,代碼如下:

/* 隊列句柄, 創建隊列時會設置這個變量 */ QueueHandle_t xQueue;int main( void ) {prvSetupHardware();/* 創建隊列: 長度為5,數據大小為4字節(存放一個整數) */xQueue = xQueueCreate( 5, sizeof( int32_t ) );if( xQueue != NULL ){/* 創建2個任務用于寫隊列, 傳入的參數分別是100、200* 任務函數會連續執行,向隊列發送數值100、200* 優先級為1*/xTaskCreate( vSenderTask, "Sender1", 1000, ( void * ) 100, 1, NULL );xTaskCreate( vSenderTask, "Sender2", 1000, ( void * ) 200, 1, NULL );/* 創建1個任務用于讀隊列* 優先級為2, 高于上面的兩個任務* 這意味著隊列一有數據就會被讀走*/xTaskCreate( vReceiverTask, "Receiver", 1000, NULL, 2, NULL );/* 啟動調度器 */vTaskStartScheduler();}else{/* 無法創建隊列 */}/* 如果程序運行到了這里就表示出錯了, 一般是內存不足 */return 0; }

發送任務的函數中,不斷往隊列中寫入數值,代碼如下:

static void vSenderTask( void *pvParameters ) {int32_t lValueToSend;BaseType_t xStatus;/* 我們會使用這個函數創建2個任務* 這些任務的pvParameters不一樣*/lValueToSend = ( int32_t ) pvParameters;/* 無限循環 */for( ;; ){/* 寫隊列* xQueue: 寫哪個隊列* &lValueToSend: 寫什么數據? 傳入數據的地址, 會從這個地址把數據復制進隊列* 0: 不阻塞, 如果隊列滿的話, 寫入失敗, 立刻返回*/xStatus = xQueueSendToBack( xQueue, &lValueToSend, 0 );if( xStatus != pdPASS ){printf( "Could not send to the queue.\r\n" );}} }

接收任務的函數中,讀取隊列、判斷返回值、打印,代碼如下:

static void vReceiverTask( void *pvParameters ) {/* 讀取隊列時, 用這個變量來存放數據 */int32_t lReceivedValue;BaseType_t xStatus;const TickType_t xTicksToWait = pdMS_TO_TICKS( 100UL );/* 無限循環 */for( ;; ){/* 讀隊列* xQueue: 讀哪個隊列* &lReceivedValue: 讀到的數據復制到這個地址* xTicksToWait: 如果隊列為空, 阻塞一會*/xStatus = xQueueReceive( xQueue, &lReceivedValue, xTicksToWait );if( xStatus == pdPASS ){/* 讀到了數據 */printf( "Received = %d\r\n", lReceivedValue );}else{/* 沒讀到數據 */printf( "Could not receive from the queue.\r\n" );}} }

程序運行結果如下:


任務調度情況如下圖所示:

5.4 示例9: 分辨數據源

本節代碼為:FreeRTOS_09_queue_datasource。

當有多個發送任務,通過同一個隊列發出數據,接收任務如何分辨數據來源?數據本身帶有"來源"信息,比如寫入隊列的數據是一個結構體,結構體中的lDataSouceID用來表示數據來源:

typedef struct {ID_t eDataID;int32_t lDataValue; }Data_t;

不同的發送任務,先構造好結構體,填入自己的eDataID,再寫隊列;接收任務讀出數據后,根據eDataID就可以知道數據來源了,如下圖所示:

  • CAN任務發送的數據:eDataID=eMotorSpeed
  • HMI任務發送的數據:eDataID=eSpeedSetPoint

FreeRTOS_09_queue_datasource程序會創建一個隊列,然后創建2個發送任務、1個接收任務:

  • 創建的隊列,用來發送結構體:數據大小是結構體的大小
  • 發送任務優先級為2,分別往隊列中寫入自己的結構體,結構體中會標明數據來源
  • 接收任務優先級為1,讀隊列、根據數據來源打印信息

main函數中創建了隊列、創建了發送任務、接收任務,代碼如下:

/* 定義2種數據來源(ID) */ typedef enum {eMotorSpeed,eSpeedSetPoint } ID_t;/* 定義在隊列中傳輸的數據的格式 */ typedef struct {ID_t eDataID;int32_t lDataValue; }Data_t;/* 定義2個結構體 */ static const Data_t xStructsToSend[ 2 ] = {{ eMotorSpeed, 10 }, /* CAN任務發送的數據 */{ eSpeedSetPoint, 5 } /* HMI任務發送的數據 */ };/* vSenderTask被用來創建2個任務,用于寫隊列* vReceiverTask被用來創建1個任務,用于讀隊列*/ static void vSenderTask( void *pvParameters ); static void vReceiverTask( void *pvParameters );/*-----------------------------------------------------------*//* 隊列句柄, 創建隊列時會設置這個變量 */ QueueHandle_t xQueue;int main( void ) {prvSetupHardware();/* 創建隊列: 長度為5,數據大小為4字節(存放一個整數) */xQueue = xQueueCreate( 5, sizeof( Data_t ) );if( xQueue != NULL ){/* 創建2個任務用于寫隊列, 傳入的參數是不同的結構體地址* 任務函數會連續執行,向隊列發送結構體* 優先級為2*/xTaskCreate(vSenderTask, "CAN Task", 1000, (void *) &(xStructsToSend[0]), 2, NULL);xTaskCreate(vSenderTask, "HMI Task", 1000, (void *) &( xStructsToSend[1]), 2, NULL);/* 創建1個任務用于讀隊列* 優先級為1, 低于上面的兩個任務* 這意味著發送任務優先寫隊列,隊列常常是滿的狀態*/xTaskCreate( vReceiverTask, "Receiver", 1000, NULL, 1, NULL );/* 啟動調度器 */vTaskStartScheduler();}else{/* 無法創建隊列 */}/* 如果程序運行到了這里就表示出錯了, 一般是內存不足 */return 0; }

發送任務的函數中,不斷往隊列中寫入數值,代碼如下:

static void vSenderTask( void *pvParameters ) {BaseType_t xStatus;const TickType_t xTicksToWait = pdMS_TO_TICKS( 100UL );/* 無限循環 */for( ;; ){/* 寫隊列* xQueue: 寫哪個隊列* pvParameters: 寫什么數據? 傳入數據的地址, 會從這個地址把數據復制進隊列* xTicksToWait: 如果隊列滿的話, 阻塞一會*/xStatus = xQueueSendToBack( xQueue, pvParameters, xTicksToWait );if( xStatus != pdPASS ){printf( "Could not send to the queue.\r\n" );}} }

接收任務的函數中,讀取隊列、判斷返回值、打印,代碼如下:

static void vReceiverTask( void *pvParameters ) {/* 讀取隊列時, 用這個變量來存放數據 */Data_t xReceivedStructure;BaseType_t xStatus;/* 無限循環 */for( ;; ){/* 讀隊列* xQueue: 讀哪個隊列* &xReceivedStructure: 讀到的數據復制到這個地址* 0: 沒有數據就即刻返回,不阻塞*/xStatus = xQueueReceive( xQueue, &xReceivedStructure, 0 );if( xStatus == pdPASS ){/* 讀到了數據 */if( xReceivedStructure.eDataID == eMotorSpeed ){printf( "From CAN, MotorSpeed = %d\r\n", xReceivedStructure.lDataValue );}else if( xReceivedStructure.eDataID == eSpeedSetPoint ){printf( "From HMI, SpeedSetPoint = %d\r\n", xReceivedStructure.lDataValue );}}else{/* 沒讀到數據 */printf( "Could not receive from the queue.\r\n" );}} }

運行結果如下:

任務調度情況如下圖所示:

  • t1:HMI是最后創建的最高優先級任務,它先執行,一下子向隊列寫入5個數據,把隊列都寫滿了
  • t2:隊列已經滿了,HMI任務再發起第6次寫操作時,進入阻塞狀態。這時CAN任務是最高優先級的就緒態任務,它開始執行
  • t3:CAN任務發現隊列已經滿了,進入阻塞狀態;接收任務變為最高優先級的就緒態任務,它開始運行
  • t4:現在,HMI任務、CAN任務的優先級都比接收任務高,它們都在等待隊列有空閑的空間;一旦接收任務讀出1個數據,會馬上被搶占。被誰搶占?誰等待最久?HMI任務!所以在t4時刻,切換到HMI任務。
  • t5:HMI任務向隊列寫入第6個數據,然后再次阻塞,這是CAN任務已經阻塞很久了。接收任務變為最高優先級的就緒態任務,開始執行。
  • t6:現在,HMI任務、CAN任務的優先級都比接收任務高,它們都在等待隊列有空閑的空間;一旦接收任務讀出1個數據,會馬上被搶占。被誰搶占?誰等待最久?CAN任務!所以在t6時刻,切換到CAN任務。
  • t7:CAN任務向隊列寫入數據,因為僅僅有一個空間供寫入,所以它馬上再次進入阻塞狀態。這時HMI任務、CAN任務都在等待空閑空間,只有接收任務可以繼續執行。

5.5 示例10: 傳輸大塊數據

本節代碼為:FreeRTOS_10_queue_bigtransfer。

FreeRTOS的隊列使用拷貝傳輸,也就是要傳輸uint32_t時,把4字節的數據拷貝進隊列;要傳輸一個8字節的結構體時,把8字節的數據拷貝進隊列。

如果要傳輸1000字節的結構體呢?寫隊列時拷貝1000字節,讀隊列時再拷貝1000字節?不建議這么做,影響效率!

這時候,我們要傳輸的是這個巨大結構體的地址:把它的地址寫入隊列,對方從隊列得到這個地址,使用地址去訪問那1000字節的數據。

使用地址來間接傳輸數據時,這些數據放在RAM里,對于這塊RAM,要保證這幾點:

  • RAM的所有者、操作者,必須清晰明了
    這塊內存,就被稱為"共享內存"。要確保不能同時修改RAM。比如,在寫隊列之前只有由發送者修改這塊RAM,在讀隊列之后只能由接收者訪問這塊RAM。
  • RAM要保持可用
    這塊RAM應該是全局變量,或者是動態分配的內存。對于動然分配的內存,要確保它不能提前釋放:要等到接收者用完后再釋放。另外,不能是局部變量。

FreeRTOS_10_queue_bigtransfer程序會創建一個隊列,然后創建1個發送任務、1個接收任務:

  • 創建的隊列:長度為1,用來傳輸"char *"指針
  • 發送任務優先級為1,在字符數組中寫好數據后,把它的地址寫入隊列
  • 接收任務優先級為2,讀隊列得到"char *"值,把它打印出來

這個程序故意設置接收任務的優先級更高,在它訪問數組的過程中,接收任務無法執行、無法寫這個數組。

main函數中創建了隊列、創建了發送任務、接收任務,代碼如下:

/* 定義一個字符數組 */ static char pcBuffer[100];/* vSenderTask被用來創建2個任務,用于寫隊列* vReceiverTask被用來創建1個任務,用于讀隊列*/ static void vSenderTask( void *pvParameters ); static void vReceiverTask( void *pvParameters );/*-----------------------------------------------------------*//* 隊列句柄, 創建隊列時會設置這個變量 */ QueueHandle_t xQueue;int main( void ) {prvSetupHardware();/* 創建隊列: 長度為1,數據大小為4字節(存放一個char指針) */xQueue = xQueueCreate( 1, sizeof(char *) );if( xQueue != NULL ){/* 創建1個任務用于寫隊列* 任務函數會連續執行,構造buffer數據,把buffer地址寫入隊列* 優先級為1*/xTaskCreate( vSenderTask, "Sender", 1000, NULL, 1, NULL );/* 創建1個任務用于讀隊列* 優先級為2, 高于上面的兩個任務* 這意味著讀隊列得到buffer地址后,本任務使用buffer時不會被打斷*/xTaskCreate( vReceiverTask, "Receiver", 1000, NULL, 2, NULL );/* 啟動調度器 */vTaskStartScheduler();}else{/* 無法創建隊列 */}/* 如果程序運行到了這里就表示出錯了, 一般是內存不足 */return 0; }

發送任務的函數中,現在全局大數組pcBuffer中構造數據,然后把它的地址寫入隊列,代碼如下:

static void vSenderTask( void *pvParameters ) {BaseType_t xStatus;static int cnt = 0;char *buffer;/* 無限循環 */for( ;; ){sprintf(pcBuffer, "www.100ask.net Msg %d\r\n", cnt++);buffer = pcBuffer; // buffer變量等于數組的地址, 下面要把這個地址寫入隊列/* 寫隊列* xQueue: 寫哪個隊列* pvParameters: 寫什么數據? 傳入數據的地址, 會從這個地址把數據復制進隊列* 0: 如果隊列滿的話, 即刻返回*/xStatus = xQueueSendToBack( xQueue, &buffer, 0 ); /* 只需要寫入4字節, 無需寫入整個buffer */if( xStatus != pdPASS ){printf( "Could not send to the queue.\r\n" );}} }

接收任務的函數中,讀取隊列、得到buffer的地址、打印,代碼如下:

static void vReceiverTask( void *pvParameters ) {/* 讀取隊列時, 用這個變量來存放數據 */char *buffer;const TickType_t xTicksToWait = pdMS_TO_TICKS( 100UL ); BaseType_t xStatus;/* 無限循環 */for( ;; ){/* 讀隊列* xQueue: 讀哪個隊列* &xReceivedStructure: 讀到的數據復制到這個地址* xTicksToWait: 沒有數據就阻塞一會*/xStatus = xQueueReceive( xQueue, &buffer, xTicksToWait); /* 得到buffer地址,只是4字節 */if( xStatus == pdPASS ){/* 讀到了數據 */printf("Get: %s", buffer);}else{/* 沒讀到數據 */printf( "Could not receive from the queue.\r\n" );}} }

運行結果如下圖所示:

5.6 示例11: 郵箱(Mailbox)

本節代碼為:FreeRTOS_11_queue_mailbox。

FreeRTOS的郵箱概念跟別的RTOS不一樣,這里的郵箱稱為"櫥窗"也許更恰當:

  • 它是一個隊列,隊列長度只有1
  • 寫郵箱:新數據覆蓋舊數據,在任務中使用xQueueOverwrite(),在中斷中使用xQueueOverwriteFromISR()。
    既然是覆蓋,那么無論郵箱中是否有數據,這些函數總能成功寫入數據。
  • 讀郵箱:讀數據時,數據不會被移除;在任務中使用xQueuePeek(),在中斷中使用xQueuePeekFromISR()。
    這意味著,第一次調用時會因為無數據而阻塞,一旦曾經寫入數據,以后讀郵箱時總能成功。

main函數中創建了隊列(隊列長度為1)、創建了發送任務、接收任務:

  • 發送任務的優先級為2,它先執行
  • 接收任務的優先級為1

代碼如下:

/* 隊列句柄, 創建隊列時會設置這個變量 */ QueueHandle_t xQueue;int main( void ) {prvSetupHardware();/* 創建隊列: 長度為1,數據大小為4字節(存放一個char指針) */xQueue = xQueueCreate( 1, sizeof(uint32_t) );if( xQueue != NULL ){/* 創建1個任務用于寫隊列* 任務函數會連續執行,構造buffer數據,把buffer地址寫入隊列* 優先級為2*/xTaskCreate( vSenderTask, "Sender", 1000, NULL, 2, NULL );/* 創建1個任務用于讀隊列* 優先級為1*/xTaskCreate( vReceiverTask, "Receiver", 1000, NULL, 1, NULL );/* 啟動調度器 */vTaskStartScheduler();}else{/* 無法創建隊列 */}/* 如果程序運行到了這里就表示出錯了, 一般是內存不足 */return 0; }

發送任務、接收任務的代碼和執行流程如下:

  • A:發送任務先執行,馬上阻塞
  • BC:接收任務執行,這是郵箱無數據,打印"Could not …"。在發送任務阻塞過程中,接收任務多次執行、多次打印。
  • D:發送任務從阻塞狀態退出,立刻執行、寫隊列
  • E:發送任務再次阻塞
  • FG、HI、……:接收任務不斷"偷看"郵箱,得到同一個數據,打印出多個"Get: 0"
  • J:發送任務從阻塞狀態退出,立刻執行、覆蓋隊列,寫入1
  • K:發送任務再次阻塞
  • LM、……:接收任務不斷"偷看"郵箱,得到同一個數據,打印出多個"Get: 1"

運行結果如下圖所示:

總結

以上是生活随笔為你收集整理的韦东山freeRTOS系列教程之【第五章】队列(queue)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

精品免费久久久久久 | www.久热| 免费看的黄色小视频 | 2019中文字幕第一页 | 亚洲韩国一区二区三区 | 色88久久 | 国产美女精品视频 | 日韩中文字幕视频在线 | 日韩精品免费一区二区在线观看 | av福利超碰网站 | 国产自产在线视频 | 色婷婷激情电影 | 日韩有码中文字幕在线 | 99热99热| 97视频免费播放 | av三级在线免费观看 | 免费国产亚洲视频 | 欧美精品小视频 | 免费在线观看不卡av | www黄| 天天操天天干天天玩 | 一区二区三区四区在线免费观看 | 精品视频免费在线 | 中文欧美字幕免费 | 国产免费观看高清完整版 | 日本爱爱免费 | 91探花国产综合在线精品 | 亚洲国产精品日韩 | 在线免费观看成人 | 色婷婷国产精品一区在线观看 | 精品国模一区二区三区 | 成年人免费看片网站 | 人人舔人人舔 | 99精品久久久久久久久久综合 | 中文字幕免费在线看 | 999久久久免费精品国产 | 在线视频观看你懂的 | 处女av在线 | 国产69精品久久99不卡的观看体验 | 亚洲精品午夜久久久久久久 | 久免费| 国产精品成人自产拍在线观看 | 国产视频在线观看一区二区 | 久久97久久| 99亚洲国产精品 | 午夜视频色 | 欧美久久久 | 91视频 - v11av | 91在线蜜桃臀 | 麻豆播放 | 久久久久久草 | 日本久久久久久久久久 | 精品资源在线 | 麻豆视频在线看 | 久久久受www免费人成 | 久久久免费高清视频 | 在线观看 亚洲 | 免费在线观看成人 | 99久久精品国产一区二区成人 | 欧美日韩国产亚洲乱码字幕 | av在线成人| 伊人久久影视 | 在线观看成年人 | 麻豆免费看片 | 国产精品视频免费在线观看 | 在线观看视频免费大全 | 久久国产精品视频观看 | 91大神免费在线观看 | 久久成人国产精品免费软件 | av中文天堂| 久久精品韩国 | 亚洲视频免费在线观看 | 美女视频黄是免费的 | 亚洲aⅴ久久精品 | 国产精品99页 | 国产精品视频免费看 | 色综合天天色综合 | www免费| 黄色成人毛片 | 日本精品xxxx | 国产成人精品一区二区三区在线观看 | 成人国产在线 | 免费亚洲片 | 三级av免费观看 | 日韩二区三区在线观看 | 草久草久| 久久婷婷视频 | www.夜夜操.com | 亚洲视频2 | 99精品视频在线播放观看 | 国产成人免费av电影 | 五月婷婷综合在线视频 | 黄色aaa级片| 91麻豆看国产在线紧急地址 | 91九色在线播放 | 免费在线观看不卡av | 五月天久久婷 | 国产精品永久久久久久久www | 久久成人国产精品入口 | 久久99精品国产麻豆宅宅 | 国产在线免费观看 | 欧美与欧洲交xxxx免费观看 | 成人av一二三区 | 超级碰碰碰免费视频 | 欧美日韩在线视频观看 | 在线观看免费黄色 | 亚洲国产精品电影 | 精品久久久久久久久久久院品网 | av高清不卡 | 欧美91精品国产自产 | 黄色网址av| 久久久在线 | 美女免费av | 色中色综合 | 精品视频在线免费观看 | 免费在线黄色av | 国产一区成人在线 | 久久噜噜少妇网站 | 国产香蕉视频在线观看 | 99视频+国产日韩欧美 | 四虎4hu永久免费 | 亚洲精品美女 | 国产免费久久久久 | 一区二区三区久久精品 | 久草免费资源 | 亚洲国产中文字幕 | 国产日韩视频在线播放 | 五月激情姐姐 | 日本久久久影视 | 国产高清不卡一区二区三区 | 久久精品a| 国产精品第一页在线 | 久久精品一级片 | 99久久99久久免费精品蜜臀 | 中文字幕av免费观看 | 国产中文字幕一区二区三区 | 狠狠躁夜夜躁人人爽超碰91 | 91精品伦理 | 日韩av快播电影网 | 69国产盗摄一区二区三区五区 | 天天操天天爱天天爽 | 天天操天天操天天操天天操天天操 | 九色琪琪久久综合网天天 | 亚洲欧美日韩精品久久奇米一区 | 国产一级免费电影 | 成人免费在线观看av | 97视频在线播放 | 天堂va欧美va亚洲va老司机 | 国产精品女人久久久久久 | 成人黄色av免费在线观看 | 欧美日韩亚洲在线观看 | 91亚洲精品国偷拍 | 九色精品在线 | 国产黑丝袜在线 | 91成人在线视频 | 亚洲激情综合 | 黄网在线免费观看 | 中文字幕av有码 | 91麻豆看国产在线紧急地址 | 午夜私人影院 | 韩国av免费看 | 操操日日| 亚洲一级片在线观看 | 51久久成人国产精品麻豆 | 久久精品精品电影网 | 麻豆91精品| 欧美日韩一区二区在线 | 日韩女同一区二区三区在线观看 | 中文字幕色站 | 美女免费黄视频网站 | 99精品久久久 | 九九99| 亚洲精品视频在线观看免费视频 | 成人久久久久 | 91av视频在线观看免费 | 日韩免费观看av | 精品在线99 | 免费国产一区二区视频 | 中文在线8资源库 | 亚洲蜜桃在线 | 国产精品美女www爽爽爽视频 | 欧美久久久久久久久中文字幕 | 国产精品久久久久久久毛片 | 99热高清 | 美女免费电影 | 毛片随便看 | 在线观看国产亚洲 | 亚州欧美精品 | 亚洲精品999| 亚洲精品自拍视频在线观看 | 在线播放亚洲激情 | 国产一区二区久久精品 | 免费在线看成人av | 国产精品久久久久亚洲影视 | 91插插插免费视频 | 在线观看成人毛片 | 综合久久一本 | 在线观看日本韩国电影 | 91传媒在线播放 | 成人毛片在线视频 | av免费福利| av在线在线 | 久久久久久久久毛片精品 | 久久手机免费观看 | 国产精品久久久久aaaa九色 | 91亚洲夫妻 | 免费影视大全推荐 | 国产精品成人久久久久久久 | 99国内精品 | 97超碰超碰 | 日本韩国精品一区二区在线观看 | 国产高清av免费在线观看 | 国产精品成人自产拍在线观看 | 日本久久中文 | 久久综合五月天 | 国产精品成人a免费观看 | 欧美午夜性生活 | av一级片网站 | 国产一区二区在线看 | 成人网页在线免费观看 | 久草在线免费播放 | 久久免费黄色网址 | 成年人电影免费在线观看 | 狠狠色狠狠色综合日日92 | 亚洲国产精品99久久久久久久久 | 日韩精品 在线视频 | 国产欧美最新羞羞视频在线观看 | 久久精品视频国产 | 久久久久日本精品一区二区三区 | 狠狠地操| 欧美a视频在线观看 | 午夜av片 | 久久久人人人 | 美女视频黄色免费 | 国产人成一区二区三区影院 | 成人av在线观 | 免费观看v片在线观看 | 国产精品 日本 | 91视视频在线直接观看在线看网页在线看 | 9在线观看免费高清完整版在线观看明 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 欧美成人亚洲 | 天天操天天吃 | 一区二区电影网 | 久久99精品波多结衣一区 | 天天操夜夜想 | 就操操久久 | 国产青青青 | 久久超碰99| 欧美一区日韩一区 | 久久久久久久久久久网 | 亚洲成人精品久久久 | 免费色黄 | 亚洲第一区在线播放 | 91久久奴性调教 | 手机成人在线电影 | 国产精品99久久99久久久二8 | 九九交易行官网 | 国产麻豆精品传媒av国产下载 | 久久久精品久久日韩一区综合 | 国产露脸91国语对白 | h网站免费在线观看 | 麻豆免费在线播放 | 国产欧美综合在线观看 | 99色资源| 亚洲精品视频在线观看免费 | 中国成人一区 | 九色视频自拍 | 国产亚洲人成网站在线观看 | 中文字幕av全部资源www中文字幕在线观看 | 一区二区三区四区五区在线 | 中午字幕在线观看 | 精品国产伦一区二区三区观看说明 | 日本精品久久久久中文字幕 | 九九热视频在线免费观看 | 亚洲国产精品女人久久久 | 免费网站在线观看人 | 免费在线观看91 | 91免费观看 | 成人黄色毛片视频 | www.xxxx欧美 | 91亚洲影院 | 丁香六月在线观看 | 五月开心六月婷婷 | 伊人伊成久久人综合网小说 | 六月婷婷久香在线视频 | 亚洲欧洲中文日韩久久av乱码 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 狂野欧美激情性xxxx欧美 | 亚洲国产综合在线 | 国产精品第十页 | 久久有精品 | av电影免费在线播放 | 天堂在线一区 | 免费看的黄网站软件 | 亚洲成av人影片在线观看 | 永久免费毛片在线观看 | 日韩爱爱片 | 九九视频在线观看视频6 | 99热国产在线 | 久久精品aaa | 天天干天天射天天爽 | 激情丁香在线 | 亚洲开心色 | 激情丁香综合五月 | 日韩中文字幕免费视频 | 天天干天天操 | 97超碰资源 | 欧美一区二区三区特黄 | 夜夜躁狠狠燥 | 国产精品久久久久一区二区 | 国产精品片 | 青青河边草免费观看完整版高清 | 久久呀 | 国产永久免费高清在线观看视频 | 精品99在线视频 | 免费在线国产 | 欧美日韩视频在线播放 | 92精品国产成人观看免费 | 婷婷久操| 免费观看v片在线观看 | 久久国产一区二区三区 | www黄| 精品国产乱子伦一区二区 | 午夜在线观看影院 | 亚洲第一成网站 | 成人一级在线 | 久久免费福利 | 黄色精品国产 | 99中文字幕视频 | 久久精久久精 | 久久久激情视频 | 国产一线天在线观看 | 日韩精品免费一区二区 | 超碰av在线播放 | 一区二区三区韩国免费中文网站 | 亚洲一区二区三区精品在线观看 | 国产中文自拍 | 欧美污污视频 | 国产免费叼嘿网站免费 | 欧洲精品码一区二区三区免费看 | 91亚洲成人| 国产精品黑丝在线观看 | 成人毛片a | 婷婷丁香久久五月婷婷 | 久久婷婷一区二区三区 | 黄色成人在线 | 国产在线观看高清视频 | 精品亚洲免费视频 | 成人va天堂| 日韩激情精品 | 中文字幕视频 | 在线观看免费黄色 | 国产a级免费| 99色免费 | 四川bbb搡bbb爽爽视频 | 人成在线免费视频 | 一区 二区电影免费在线观看 | 久久av影视| 久久久久久久国产精品 | 精品久久久久久久 | 麻豆91网站 | 欧美色综合天天久久综合精品 | 国产精品乱码久久久久久1区2区 | 粉嫩av一区二区三区四区 | 久久精品国产一区二区电影 | 国产精品视频久久 | av资源免费在线观看 | 日韩免费在线看 | 国精产品一二三线999 | 黄色亚洲片 | 欧美日韩在线观看不卡 | 亚洲视频播放 | 五月婷婷一区二区三区 | 伊人首页| 国产成人福利在线 | 91看片一区二区三区 | 操操操干干干 | 奇人奇案qvod| 日韩精品久久久久久中文字幕8 | 日韩精品一区二区不卡 | 国产剧情久久 | 日韩com| 欧美特一级片 | 91亚洲在线观看 | 91在线播| 精品国产色 | www.久久com| 在线观看亚洲专区 | 综合色中色| 色婷婷88av视频一二三区 | 欧美一级免费黄色片 | 欧美精品少妇xxxxx喷水 | 久久免费看a级毛毛片 | 免费亚洲黄色 | 特黄特黄的视频 | 精品国偷自产国产一区 | 久久久久综合 | 4p变态网欧美系列 | 日韩久久久久久久 | 国产精品福利在线 | 日韩一二三区不卡 | 国产精品男女视频 | 亚洲国内在线 | 五月婷婷丁香六月 | 99热最新| 国产高清在线不卡 | 在线观看蜜桃视频 | 国产成人99久久亚洲综合精品 | 777久久久 | 狠狠88综合久久久久综合网 | 九九视频热 | 日本午夜在线亚洲.国产 | 国产无限资源在线观看 | 99综合电影在线视频 | 91中文在线视频 | 三上悠亚一区二区在线观看 | 精品国产电影一区 | 免费高清国产 | 久久精品99久久久久久 | 激情综合亚洲精品 | 在线 影视 一区 | 久久伦理电影 | 一区二区 不卡 | 综合网天天 | 天天干,天天射,天天操,天天摸 | 国产又粗又猛又色又黄视频 | av在线免费观看不卡 | 在线免费观看视频你懂的 | 欧美日韩国产精品一区二区亚洲 | 美女天天操 | 亚洲欧美国产精品va在线观看 | 亚洲最大av网站 | 欧美一进一出抽搐大尺度视频 | 亚洲五月激情 | 亚洲国产网址 | 久久久久久久久久久国产精品 | 国产国语在线 | 国产亚洲视频系列 | 欧美日韩国产欧美 | 在线看国产日韩 | 久久草草热国产精品直播 | 国产玖玖精品视频 | 有码中文在线 | 免费精品久久久 | 一二三区在线 | 中文字幕在线播放日韩 | 国产精品6999成人免费视频 | 精品99免费视频 | 国产成人免费精品 | 亚洲激情影院 | 国产 在线观看 | 在线成人免费电影 | 国内成人精品视频 | 国产视频精品免费 | 日本中文在线 | 日韩高清免费无专码区 | 国产理论片在线观看 | 一区二区视频在线观看免费 | 精品视频久久 | 亚洲欧美在线视频免费 | 91麻豆网站 | a电影在线观看 | av天天在线观看 | 超级碰碰碰碰 | 日韩欧美在线综合网 | 综合色在线 | 亚洲最新av网址 | 在线中文字幕网站 | 亚洲黄色一级电影 | 色综合国产 | 亚洲女人av| 在线成人免费电影 | 91伊人| 中文字幕在线看视频国产中文版 | 在线观看日本高清mv视频 | www.色综合.com| 久久精品成人热国产成 | 精品免费一区二区三区 | 国产精品久久一区二区无卡 | 日本黄色免费在线观看 | 国产精品视频专区 | 久久久www成人免费毛片麻豆 | 91av在线播放视频 | 亚洲一区二区三区miaa149 | 亚洲精品一区二区三区四区高清 | 91成人精品观看 | 亚洲最新视频在线 | www91在线观看 | 久久久精品免费看 | 精品久久中文 | 91一区在线观看 | 99麻豆视频 | 国产精品亚洲人在线观看 | 日日草天天草 | 99爱视频在线观看 | a黄色 | 狠狠狠色狠狠色综合 | 91网址在线 | 国产九色91 | 国产精品毛片久久 | 日韩在线高清免费视频 | 欧美日韩国产精品一区二区 | 国产精品wwwwww | 久久精品综合 | 久久久久久久国产精品 | 日韩电影在线一区 | 天天曰天天射 | av免费网站 | 久久久在线免费观看 | 欧美激情第一区 | 一区二区三区三区在线 | 久久图| 免费a视频 | 四虎免费在线观看 | 99热99热 | 免费看一级一片 | 狠狠插天天干 | 欧美日本在线视频 | 亚洲精品视频在线播放 | www.天堂av | 349k.cc看片app| 久久a级片 | 国产精品色 | 一区二区久久久久 | 色爱成人网 | 中文字幕av在线电影 | av免费福利 | 西西4444www大胆无视频 | av色影院| www.天天色 | 久久高清国产 | 亚洲日本黄色 | 99久久婷婷国产精品综合 | 超碰在线最新网址 | 午夜在线观看影院 | 久久99久久99精品免观看软件 | 丝袜制服综合网 | 99国内精品 | 亚洲va欧美va人人爽 | 国产一区私人高清影院 | 国产精品女同一区二区三区久久夜 | www.夜夜操.com | 色播99 | 色综合婷婷 | 日韩欧美在线观看一区二区 | 91九色蝌蚪视频在线 | 久久精品国产精品亚洲 | 69视频网站 | 亚洲精选视频在线 | 国产日产精品一区二区三区四区的观看方式 | 国产精品久久久亚洲 | 婷婷av电影| 天堂黄色片 | 天天操天天干天天操天天干 | 久久精品直播 | 国产手机视频在线播放 | 婷婷干五月 | 久久99久久久久 | 亚洲天天 | 亚洲精品美女久久久久 | 免费看的黄色片 | 亚洲高清色综合 | 久久久999精品视频 国产美女免费观看 | 色婷婷激情综合 | 夜夜高潮夜夜爽国产伦精品 | 色综合天 | 日韩在线观看你懂得 | 午夜电影中文字幕 | 欧美 国产 视频 | av免费电影在线观看 | 成人性生交大片免费看中文网站 | 中文字幕之中文字幕 | 久久免费播放视频 | 精品国产一区二区三区四区vr | 国产一区二区三精品久久久无广告 | 91黄色视屏| 日韩二区在线播放 | 久久五月精品 | 精品久久久久国产 | 伊人资源站| 国产91探花| 日本少妇高清做爰视频 | 日日躁夜夜躁xxxxaaaa | 欧美日韩国产综合一区二区 | 99精品免费 | 亚洲国产色一区 | 欧美一区二区三区特黄 | 一区二区三区四区在线 | 一级黄色免费 | 九九视频精品免费 | 九色视频网站 | 国产精品久久嫩一区二区免费 | 91亚洲精品久久久久图片蜜桃 | 亚洲另类视频在线观看 | 中文字幕一区二区在线观看 | 国产第一页福利影院 | 99视频精品 | 国产成本人视频在线观看 | 天干啦夜天干天干在线线 | 午夜av片| 久久成人免费 | 久久精品综合网 | 欧美日韩国产亚洲乱码字幕 | 九九久久婷婷 | 成 人 免费 黄 色 视频 | 久久涩涩网站 | 91麻豆精品国产自产在线游戏 | www91在线观看| 午夜视频色 | 精品在线视频一区 | 午夜精品一区二区三区四区 | 久久免费视频精品 | 我爱av激情网 | 久久视频精品在线 | 在线视频久 | 亚洲人成人99网站 | 国产系列在线观看 | 国产精品久久久久一区二区国产 | 99精品视频免费看 | 欧美a视频在线观看 | 亚洲视频一区二区三区在线观看 | www.香蕉视频在线观看 | 成人小视频在线播放 | 96久久欧美麻豆网站 | 亚洲伦理电影在线 | 久久久国产99久久国产一 | 黄网站www | 超碰在线个人 | 久久深夜 | 91看片淫黄大片在线播放 | 91传媒91久久久 | 97超碰精品| 午夜免费福利片 | 毛片888| 美女网站视频一区 | 欧美一级xxxx | 亚洲精品www久久久久久 | 波多野结依在线观看 | 久久久久久久久久久高潮一区二区 | av大全在线免费观看 | 国产理伦在线 | 国产精品久久久久久久午夜 | 久久国产精品第一页 | 激情综合网五月激情 | 欧美一区二区三区免费观看 | 成人97人人超碰人人99 | 久久久久久中文字幕 | 97精品免费视频 | 婷婷色av| 麻豆影音先锋 | 欧美日韩xxxxx | 色多多在线观看 | 久久大片 | 色综合久久88色综合天天免费 | 亚洲国产精品99久久久久久久久 | 午夜少妇一区二区三区 | www.av免费| 日韩色av色资源 | 亚洲成人av一区 | 91传媒在线播放 | 国产一区二区三区网站 | 午夜三级影院 | 天天干天天操天天搞 | 国产网站色 | 精品主播网红福利资源观看 | 天天操天天草 | 奇米先锋 | 999一区二区三区 | 日韩精品一区二区三区不卡 | 国产美女视频免费观看的网站 | 国产在线97 | 在线观看日本韩国电影 | www五月天婷婷 | 久久人人爽人人片av | 六月丁香综合 | 国产精品久久久久久久久久久久久 | 伊人在线视频 | 91日本在线播放 | 黄色av大片 | 狠狠干狠狠久久 | 欧美无极色 | 91精品国产综合久久福利不卡 | 中文字幕成人一区 | 国偷自产中文字幕亚洲手机在线 | 97福利 | 亚洲乱码中文字幕综合 | 欧美激情精品久久久久久免费印度 | 久久人人爽人人 | 欧美亚洲专区 | 欧美日韩免费观看一区=区三区 | 四虎成人精品永久免费av九九 | 91av视频在线免费观看 | 西西4444www大胆无视频 | 天天操天天是 | 日韩中文字幕免费在线观看 | 日韩亚洲国产精品 | 人人澡人| 精品久久久久久久久久久久久久久久久久 | 国产五月婷婷 | 天天操天天操天天爽 | 亚洲精品大全 | 亚洲精品电影在线 | 国产精品亚洲综合久久 | 九九三级毛片 | 2018好看的中文在线观看 | 国产一区二区三区午夜 | 在线观看日本高清mv视频 | 美女免费视频观看网站 | 亚洲精品成人免费 | 午夜性盈盈 | 国产精品嫩草影院123 | 国产精品免费一区二区 | 在线天堂日本 | 亚洲人成网站精品片在线观看 | 伊香蕉大综综综合久久啪 | 久久国产精品99久久久久久进口 | 黄色成人毛片 | 久久久久久综合 | 久久免费视频8 | 久青草电影 | 在线电影av | 久久久精品小视频 | 久久国产精品偷 | 人人超在线公开视频 | 久久免费国产精品 | 国产午夜三级一二三区 | 成片免费观看视频 | 国产露脸91国语对白 | 中文字幕人成人 | 极品久久久久久久 | 999国内精品永久免费视频 | 免费看精品久久片 | 成人黄色电影在线观看 | 色婷婷亚洲精品 | 久草视频中文 | 国产免费精彩视频 | 天天爽人人爽夜夜爽 | 国产在线a免费观看 | 欧美亚洲精品在线观看 | 亚洲不卡av一区二区三区 | 亚洲一区黄色 | 五月天久久综合 | 日本精品视频在线播放 | 精品国模一区二区 | 狠狠综合久久av | 少妇av网| 国产精品成人一区二区 | 成人资源在线 | 黄色成人av网址 | 激情xxxx | 免费高清在线观看成人 | 超碰在线公开 | 亚洲综合一区二区精品导航 | 天天综合操 | 伊人亚洲综合网 | 亚洲精品综合一二三区在线观看 | 又黄又网站 | 国产精品免费在线视频 | 久久精品超碰 | 亚洲人xxx| 日韩有码在线播放 | 久久免费视频在线观看6 | 麻豆国产网站入口 | 在线观看a视频 | 精品久久一二三区 | 91免费高清视频 | 福利av在线 | а天堂中文最新一区二区三区 | 久9在线| 国产精品片 | 97超碰人人澡人人爱 | 四虎成人免费观看 | 国产理论免费 | 国产免费午夜 | 久久精品日本啪啪涩涩 | 在线午夜电影神马影院 | 日韩欧美国产视频 | 综合在线色 | 国产91精品久久久久久 | 国产福利av在线 | 99久久精品国产一区二区成人 | 国产免费视频在线 | 亚洲成年人在线播放 | 一级电影免费在线观看 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 97国产电影 | 久久久久久美女 | 久久99热精品这里久久精品 | 成片免费观看视频大全 | 久久精品三 | 少妇自拍av | 欧美日韩一级视频 | 一级黄色免费网站 | 国产精品2018 | av丝袜制服 | 国产精品99精品久久免费 | 久久综合精品国产一区二区三区 | 国产精品综合在线观看 | 黄色大片网 | 日韩高清激情 | 久久综合中文字幕 | 97网在线观看 | 成人一区二区三区在线观看 | www国产在线 | 一区二区激情视频 | 日本精品久久久久久 | 国产精品视频999 | 激情婷婷久久 | 在线观影网站 | 中文字幕电影网 | 亚洲a色 | 国产成人精品免高潮在线观看 | 青青河边草免费视频 | 国产午夜精品一区二区三区嫩草 | 国产主播大尺度精品福利免费 | 国产成人免费在线 | 国产69久久 | 国产精品一区二区三区99 | 国产午夜精品一区二区三区在线观看 | 欧美国产日韩一区二区 | 国产精品99久久久久久有的能看 | 日韩精品中文字幕在线播放 | 在线观看视频免费大全 | 亚洲视频播放 | 国产91粉嫩白浆在线观看 | 国产精品一区二区三区四 | 国产精品成人自拍 | www.夜夜骑.com | 视频在线99 | 国产a免费| 国产亚洲欧美日韩高清 | 久草在线视频免费资源观看 | 精品一二三四视频 | 激情深爱五月 | 久久免费视频在线观看 | 激情开心 | 日韩欧美成人网 | 欧美另类网站 | 91香蕉视频好色先生 | 色综合久久久 | 欧美电影在线观看 | 99精品网站 | 婷婷国产在线 | 在线观看国产 | 麻豆影视网站 | 日本公妇色中文字幕 | 青草草在线视频 | 日韩欧美电影 | av电影在线观看 | 亚洲成a人片在线观看网站口工 | 人人草人人草 | 日韩资源在线播放 | 91视频麻豆 | av动态图片 | 国产又粗又猛又色 | 爱av在线网 | 伊人六月 | 欧美国产日韩一区 | 在线97 | 亚洲资源一区 | 成人久久18免费网站图片 | 国产对白av | 久久视频在线观看免费 | 天天艹天天爽 | 久久国产精品99精国产 | 久久视频这里有久久精品视频11 | 欧美性猛片, | 国产在线污 | 怡春院av| 久久久久亚洲精品男人的天堂 | 精品在线观看一区二区 | 久久久麻豆 | 日本在线视频一区二区三区 | 中文字幕在线视频国产 | a视频免费 | 99高清视频有精品视频 | 狠狠狠狠狠操 | 国产破处在线播放 | 2022久久国产露脸精品国产 | 亚洲国产精品一区二区久久hs | 日韩精品一区二区三区免费观看视频 | 精品久久久久久久久久久久久久久久 | 亚洲免费成人av电影 | 欧美日韩视频观看 | av成人在线播放 | 91入口在线观看 | 国产在线2020 | 国产日韩欧美在线一区 | 在线看黄网站 | 99中文字幕在线观看 | 国产一区在线看 | 国产精品久久嫩一区二区免费 | 免费观看9x视频网站在线观看 | 亚洲欧美精品一区 | 人人爽爽人人 | 亚洲精品乱码久久久久久 | a精品视频| 黄色福利网 | 国产黄色片网站 | 久久再线视频 | 欧美视频xxx | 日韩在线电影观看 | a在线免费| 久久99网| 亚洲欧洲中文日韩久久av乱码 | 久久字幕网| 久久精品99北条麻妃 | 国产高清绿奴videos | 成人免费看视频 | 精品96久久久久久中文字幕无 | 欧美综合久久久 | 国内一区二区视频 | 欧美精品在线免费 | 天天操天天操天天爽 | 国产亚洲字幕 | 色噜噜在线观看视频 | 色狠狠干| 99免费视频| 国产中文字幕91 | 夜夜躁日日躁狠狠躁 | 亚洲最大的av网站 | 精品国产视频在线观看 | 国产精品福利无圣光在线一区 | 日韩精品免费一区 | 亚洲黄色成人网 | 色片网站在线观看 | 天堂网一区二区 | 国产不卡片 | 亚洲免费视频在线观看 | 小草av在线播放 | 啪啪激情网 | 超碰97久久 | 国产91粉嫩白浆在线观看 | 91精品少妇偷拍99 | 六月丁香激情网 | 国产明星视频三级a三级点| 欧美巨乳波霸 | 成人污视频在线观看 | 国产在线观看你懂的 | 精品久久视频 | 久久综合九色综合欧美就去吻 | 性日韩欧美在线视频 | 色天天久久 | 中文字幕人成乱码在线观看 | 亚洲码国产日韩欧美高潮在线播放 | 国产精品永久免费观看 | 久久人人精| 久精品视频免费观看2 | 婷婷在线网站 | 亚洲精品乱码白浆高清久久久久久 | 五月天亚洲综合小说网 | 日韩欧美xxxx| 国产一线天在线观看 | 久久久www成人免费精品张筱雨 | 国产国产人免费人成免费视频 | 狠狠躁18三区二区一区ai明星 | 欧美视频在线观看免费网址 | 狠狠干狠狠色 | 国产中文字幕视频在线 | 91精品天码美女少妇 | 美女视频久久 | 在线欧美小视频 | 亚洲女同videos | 国产黄色免费在线观看 | 国产精品成人一区二区三区 | 97国产大学生情侣白嫩酒店 | 在线免费观看黄色 | 欧美日韩免费一区二区三区 | 香蕉视频免费在线播放 | 国产91学生粉嫩喷水 | 国产123区在线观看 国产精品麻豆91 | 色噜噜噜噜 | 精品九九九九 | 久久精品视频在线观看免费 | 欧美最猛性xxx | 亚洲国产mv | 国产精品一区二区吃奶在线观看 | 久久理论电影 | 婷婷色吧| 在线你懂的视频 | 日韩网站一区二区 | 天天天干天天天操 | 丝袜美腿在线视频 | av亚洲产国偷v产偷v自拍小说 | 福利一区二区三区四区 | 亚洲免费在线播放视频 | 97在线观看 | 三级黄色网址 | 亚洲精品久久久蜜臀下载官网 | 久久美女免费视频 | 一级大片在线观看 | 日本在线观看一区二区 | 91视频中文字幕 | 伊人久久电影网 | 天堂v中文 | 成人免费视频播放 | 日韩av免费一区二区 |