在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式環(huán)形隊列和消息隊列的實現(xiàn)

CHANBAEK ? 來源:南山府嵌入式 ? 作者:編外人員 ? 2023-04-14 11:52 ? 次閱讀

說明

嵌入式環(huán)形隊列和消息隊列是實現(xiàn)數(shù)據(jù)緩存和通信的常見數(shù)據(jù)結(jié)構(gòu),廣泛應(yīng)用于嵌入式系統(tǒng)中的通信協(xié)議和領(lǐng)域。

環(huán)形隊列是一種先進先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),其中數(shù)據(jù)被存儲在一個環(huán)形緩沖區(qū)中。 它使用兩個指針,分別指向隊列的頭和尾,以便在讀寫操作時追蹤隊列的狀態(tài)。 當(dāng)隊列滿時,新數(shù)據(jù)將覆蓋舊數(shù)據(jù),以確保隊列的長度保持不變。 環(huán)形隊列在實現(xiàn)嵌入式通信協(xié)議時特別有用,例如UARTCAN等。

消息隊列是一種多個發(fā)送者和接收者之間共享數(shù)據(jù)的通信機制。 它允許多個任務(wù)或線程向隊列發(fā)送消息,并允許多個任務(wù)或線程從隊列中接收消息。 每個消息都有一個固定的大小和格式,并可以根據(jù)需要進行排隊和檢索。 在嵌入式系統(tǒng)中,消息隊列廣泛用于處理異步事件,例如中斷處理和任務(wù)之間的通信。

主要應(yīng)用于:

  1. 網(wǎng)絡(luò)通信協(xié)議(例如TCP/IP,UDP等)中的數(shù)據(jù)緩存和隊列管理。
  2. 嵌入式操作系統(tǒng)(例如FreeRTOS,uC/OS等)中的任務(wù)通信和事件處理。
  3. 汽車電子領(lǐng)域中的CAN和LIN通信協(xié)議。
  4. 工業(yè)自動化領(lǐng)域中的Modbus,Profibus等通信協(xié)議。
  5. 無線通信領(lǐng)域中的藍牙ZigbeeLoRa等通信協(xié)議。

大致應(yīng)用

  1. 串口通信中,可以使用環(huán)形隊列來接收和發(fā)送數(shù)據(jù)。 當(dāng)接收到新的數(shù)據(jù)時,將其存儲到環(huán)形隊列中,并在需要發(fā)送數(shù)據(jù)時從隊列中取出數(shù)據(jù)發(fā)送。 這種方式可以減少中斷處理的時間,提高系統(tǒng)的響應(yīng)速度。
  2. 多任務(wù)系統(tǒng)中,消息隊列用于任務(wù)之間的通信。 每個任務(wù)都可以向消息隊列中發(fā)送消息,其他任務(wù)可以從隊列中獲取消息并進行相應(yīng)的處理。 這種方式可以實現(xiàn)任務(wù)之間的解耦,提高系統(tǒng)的可擴展性和可維護性。
  3. 實時控制系統(tǒng)中,環(huán)形隊列可以用于緩存傳感器數(shù)據(jù)或控制命令。 當(dāng)傳感器或其他設(shè)備向系統(tǒng)發(fā)送數(shù)據(jù)時,可以將其存儲到環(huán)形隊列中,然后由控制任務(wù)從隊列中獲取數(shù)據(jù)并進行相應(yīng)的處理。 這種方式可以減少系統(tǒng)對硬件的依賴性,提高系統(tǒng)的靈活性和可靠性。
  4. 音頻處理中,環(huán)形隊列可以用于實現(xiàn)音頻數(shù)據(jù)的緩存。 當(dāng)音頻數(shù)據(jù)輸入時,將其存儲到環(huán)形隊列中,然后由音頻處理任務(wù)從隊列中獲取數(shù)據(jù)并進行處理。 這種方式可以實現(xiàn)音頻數(shù)據(jù)的流式處理,提高系統(tǒng)的處理效率和響應(yīng)速度。

嵌入式環(huán)形隊列

嵌入式環(huán)形隊列是一種先進先出(FIFO)的隊列,其實現(xiàn)基于環(huán)形緩沖區(qū)。 隊列的頭尾指針分別指向隊列的第一個元素和最后一個元素,當(dāng)隊列滿時,新加入的元素將覆蓋隊列頭的元素。 嵌入式環(huán)形隊列的實現(xiàn)過程如下:

  1. 隊列初始化:初始化頭尾指針為0,表示隊列為空。
  2. 入隊操作:將元素插入隊列尾部,尾指針加1,如果隊列滿了,則尾指針回到隊列開頭,覆蓋頭指針?biāo)赶虻脑亍?/li>
  3. 出隊操作:將隊列頭部元素出隊,并將頭指針加1,如果隊列已經(jīng)空了,則頭指針回到隊列開頭。

嵌入式環(huán)形隊列的實現(xiàn)可以使用數(shù)組或鏈表來實現(xiàn)。 使用數(shù)組時,需要考慮隊列滿時需要覆蓋隊列頭的元素,所以需要額外的邏輯來保證正確性。

嵌入式環(huán)形隊列操作步驟(大致如此)

1)定義一個固定大小的數(shù)組

1#define QUEUE_SIZE 10
2int queue[QUEUE_SIZE];

2)定義兩個指針,分別指向隊列的起始位置和末尾位置

1int head = 0;  // 隊列起始位置
2int tail = 0;  // 隊列末尾位置

3)實現(xiàn)入隊操作,即將元素添加到隊列末尾。 如果隊列已滿,則不能再添加元素

1void enqueue(int data) {
2    if ((tail + 1) % QUEUE_SIZE == head) {
3        // 隊列已滿
4        return;
5    }
6    queue[tail] = data;
7    tail = (tail + 1) % QUEUE_SIZE;
8}

4)實現(xiàn)出隊操作,即將隊列中的元素刪除并返回。 如果隊列為空,則不能執(zhí)行出隊操作。

1int dequeue() {
2    if (head == tail) {
3        // 隊列為空
4        return -1;
5    }
6    int data = queue[head];
7    head = (head + 1) % QUEUE_SIZE;
8    return data;
9}

5)實現(xiàn)查詢隊列大小的函數(shù)

1int queue_size() {
2    return (tail - head + QUEUE_SIZE) % QUEUE_SIZE;
3}

完整代碼實現(xiàn)

1#define QUEUE_SIZE 10
 2int queue[QUEUE_SIZE];
 3int head = 0;
 4int tail = 0;
 5
 6void enqueue(int data) {
 7    if ((tail + 1) % QUEUE_SIZE == head) {
 8        // 隊列已滿
 9        return;
10    }
11    queue[tail] = data;
12    tail = (tail + 1) % QUEUE_SIZE;
13}
14
15int dequeue() {
16    if (head == tail) {
17        // 隊列為空
18        return -1;
19    }
20    int data = queue[head];
21    head = (head + 1) % QUEUE_SIZE;
22    return data;
23}
24
25int queue_size() {
26    return (tail - head + QUEUE_SIZE) % QUEUE_SIZE;
27}

嵌入式消息隊列

嵌入式消息隊列的實現(xiàn)原理

嵌入式消息隊列通常采用循環(huán)緩沖區(qū)實現(xiàn),即使用一個數(shù)組作為緩沖區(qū),通過頭指針和尾指針來管理隊列。 消息隊列的基本操作包括入隊和出隊

入隊操作

入隊操作將一個消息寫入隊列中,實現(xiàn)方法如下:

1void queue_push(queue_t *queue, void *data, size_t size)
 2{
 3    uint32_t next = (queue->tail + 1) % queue->capacity;
 4
 5    if (next == queue->head) {
 6        // 隊列已滿,不再添加數(shù)據(jù)
 7        return;
 8    }
 9
10    queue_item_t *item = &queue->items[queue->tail];
11    item->size = size;
12    item->data = malloc(size);
13    memcpy(item->data, data, size);
14
15    queue->tail = next;
16}

在入隊操作中,我們首先檢查隊列是否已滿。 如果隊列已滿,就直接返回,不再添加數(shù)據(jù)。 如果隊列未滿,則使用尾指針指向的空間來存儲新的數(shù)據(jù)。 為了避免新的數(shù)據(jù)覆蓋舊的數(shù)據(jù),我們需要動態(tài)分配一個新的內(nèi)存空間,將數(shù)據(jù)復(fù)制到該空間中,并將其地址存儲到隊列的元素中。 最后,我們將尾指針往后移動一個位置。

出隊操作

出隊操作將一個消息從隊列中讀取出來,并將其從隊列中刪除,實現(xiàn)方法如下

1void queue_pop(queue_t *queue, void *data, size_t *size)
 2{
 3    if (queue->head == queue->tail) {
 4        // 隊列為空,無法讀取數(shù)據(jù)
 5        return;
 6    }
 7
 8    queue_item_t *item = &queue->items[queue->head];
 9    *size = item->size;
10    memcpy(data, item->data, *size);
11
12    free(item->data);
13    queue->head = (queue->head + 1) % queue->capacity;
14}

在出隊操作中,我們首先檢查隊列是否為空。 如果隊列為空,就直接返回,無法讀取數(shù)據(jù)。 如果隊列非空,則使用頭指針指向的空間來讀取數(shù)據(jù)。 我們將元素中存儲的數(shù)據(jù)復(fù)制到指定的地址中,并返回數(shù)據(jù)的大小。 最后,我們釋放元素中分配的內(nèi)存空間,并將頭指針往后移動一個位置。

消息示例:

1#include 
  2#include 
  3#include 
  4
  5// 消息隊列結(jié)構(gòu)體
  6typedef struct {
  7    uint8_t *buf;    // 指向隊列緩存區(qū)的指針
  8    uint32_t head;   // 隊頭指針
  9    uint32_t tail;   // 隊尾指針
 10    uint32_t size;   // 隊列容量
 11    uint32_t count;  // 當(dāng)前隊列中的消息數(shù)量
 12} message_queue_t;
 13
 14// 創(chuàng)建一個消息隊列
 15message_queue_t *message_queue_create(uint32_t size) {
 16    message_queue_t *mq = (message_queue_t *)malloc(sizeof(message_queue_t));
 17    if (mq == NULL) {
 18        return NULL;
 19    }
 20
 21    mq->buf = (uint8_t *)malloc(size);
 22    if (mq->buf == NULL) {
 23        free(mq);
 24        return NULL;
 25    }
 26
 27    mq->head = 0;
 28    mq->tail = 0;
 29    mq->size = size;
 30    mq->count = 0;
 31
 32    return mq;
 33}
 34
 35// 銷毀一個消息隊列
 36void message_queue_destroy(message_queue_t *mq) {
 37    if (mq == NULL) {
 38        return;
 39    }
 40
 41    if (mq->buf != NULL) {
 42        free(mq->buf);
 43    }
 44
 45    free(mq);
 46}
 47
 48// 向消息隊列中發(fā)送一條消息
 49uint32_t message_queue_send(message_queue_t *mq, uint8_t *buf, uint32_t len) {
 50    if (mq == NULL || buf == NULL || len == 0) {
 51        return 0;
 52    }
 53
 54    // 如果隊列已滿,則無法發(fā)送消息
 55    if (mq->count >= mq->size) {
 56        return 0;
 57    }
 58
 59    // 將消息寫入隊列緩存區(qū)
 60    uint32_t i;
 61    for (i = 0; i < len; i++) {
 62        mq->buf[mq->tail] = buf[i];
 63        mq->tail = (mq->tail + 1) % mq->size;
 64    }
 65
 66    // 更新隊列狀態(tài)
 67    mq->count += len;
 68
 69    return len;
 70}
 71
 72// 從消息隊列中接收一條消息
 73uint32_t message_queue_recv(message_queue_t *mq, uint8_t *buf, uint32_t len) {
 74    if (mq == NULL || buf == NULL || len == 0) {
 75        return 0;
 76    }
 77
 78    // 如果隊列為空,則無法接收消息
 79    if (mq->count == 0) {
 80        return 0;
 81    }
 82
 83    // 讀取隊列緩存區(qū)中的消息
 84    uint32_t i;
 85    for (i = 0; i < len && i < mq->count; i++) {
 86        buf[i] = mq->buf[mq->head];
 87        mq->head = (mq->head + 1) % mq->size;
 88    }
 89
 90    // 更新隊列狀態(tài)
 91    mq->count -= i;
 92
 93    return i;
 94}
 95
 96// 獲取消息隊列中的消息數(shù)量
 97uint32_t message_queue_count(message_queue_t *mq) {
 98    if (mq == NULL) {
 99        return 0;
100    }
101
102    return mq->count;
103}

消息隊列示例說明

上面的示例是一個基于循環(huán)隊列實現(xiàn)的簡單嵌入式消息隊列的代碼實現(xiàn),下面詳細說明其實現(xiàn)原理:

消息隊列結(jié)構(gòu)體

定義一個消息隊列結(jié)構(gòu)體,包含隊列緩存區(qū)指針、隊頭指針、隊尾指針、隊列容量和當(dāng)前隊列中的消息數(shù)量等信息

1typedef struct {
2    uint8_t *buf;    // 指向隊列緩存區(qū)的指針
3    uint32_t head;   // 隊頭指針
4    uint32_t tail;   // 隊尾指針
5    uint32_t size;   // 隊列容量
6    uint32_t count;  // 當(dāng)前隊列中的消息數(shù)量
7} message_queue_t;

創(chuàng)建消息隊列

使用 message_queue_create 函數(shù)創(chuàng)建一個消息隊列,該函數(shù)會動態(tài)分配一塊內(nèi)存用于存儲消息隊列結(jié)構(gòu)體和隊列緩存區(qū),初始化消息隊列的各個參數(shù),并返回一個指向消息隊列結(jié)構(gòu)體的指針。

1message_queue_t *message_queue_create(uint32_t size) {
 2    message_queue_t *mq = (message_queue_t *)malloc(sizeof(message_queue_t));
 3    if (mq == NULL) {
 4        return NULL;
 5    }
 6
 7    mq->buf = (uint8_t *)malloc(size);
 8    if (mq->buf == NULL) {
 9        free(mq);
10        return NULL;
11    }
12
13    mq->head = 0;
14    mq->tail = 0;
15    mq->size = size;
16    mq->count = 0;
17
18    return mq;
19}

銷毀消息隊列

使用 message_queue_destroy 函數(shù)銷毀一個消息隊列,該函數(shù)會釋放消息隊列結(jié)構(gòu)體和隊列緩存區(qū)所占用的內(nèi)存。

1void message_queue_destroy(message_queue_t *mq) {
 2    if (mq == NULL) {
 3        return;
 4    }
 5
 6    if (mq->buf != NULL) {
 7        free(mq->buf);
 8    }
 9
10    free(mq);
11}

發(fā)送消息

使用 message_queue_send 函數(shù)向消息隊列中發(fā)送一條消息,該函數(shù)會將消息寫入隊列緩存區(qū),并更新隊列的狀態(tài),返回實際寫入隊列緩存區(qū)的消息長度。

1uint32_t message_queue_send(message_queue_t *mq, uint8_t *buf, uint32_t len) {
 2    if (mq == NULL || buf == NULL || len == 0) {
 3        return 0;
 4    }
 5
 6    // 如果隊列已滿,則無法發(fā)送消息
 7    if (mq->count >= mq->size) {
 8        return 0;
 9    }
10
11    // 將消息寫入隊列緩存區(qū)
12    uint32_t i;
13    for (i = 0; i < len; i++) {
14        mq->buf[mq->tail] = buf[i];
15        mq->tail = (mq->tail + 1) % mq->size;
16    }
17
18    // 更新隊列狀態(tài)
19    mq->count += len;
20
21    return len;
22}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5142

    文章

    19561

    瀏覽量

    315373
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1398

    瀏覽量

    80454
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    40623
  • 隊列
    +關(guān)注

    關(guān)注

    1

    文章

    46

    瀏覽量

    11052
  • 消息隊列
    +關(guān)注

    關(guān)注

    0

    文章

    33

    瀏覽量

    3090
收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    嵌入式開發(fā)中消息隊列實現(xiàn)

    嵌入式開發(fā)中經(jīng)常會看到消息隊列的身影,隊列的應(yīng)用是很廣泛的,它可以應(yīng)用的場景有很多,比如緩存通信消息,暫存執(zhí)行內(nèi)容,數(shù)據(jù)順序轉(zhuǎn)發(fā)等的操作。
    發(fā)表于 08-22 11:19 ?1486次閱讀
    <b class='flag-5'>嵌入式</b>開發(fā)中消息<b class='flag-5'>隊列</b>的<b class='flag-5'>實現(xiàn)</b>

    基于STM32的串口環(huán)形隊列IAP調(diào)試

    基于STM32的串口環(huán)形隊列IAP調(diào)試心得
    的頭像 發(fā)表于 09-18 15:33 ?1952次閱讀
    基于STM32的串口<b class='flag-5'>環(huán)形</b><b class='flag-5'>隊列</b>IAP調(diào)試

    環(huán)形隊列在串口數(shù)據(jù)接收中的使用

    前言??書接上回,前文主要介紹了環(huán)形隊列實現(xiàn)原理以及C語言實現(xiàn)及測試過程,本文將回歸到嵌入式平臺的應(yīng)用中,話不多說,淦,上干貨!實驗?zāi)康腍
    發(fā)表于 12-06 06:27

    嵌入式軟件中的隊列有何特點

    數(shù)據(jù)結(jié)構(gòu)之隊列篇1 隊列之特點及在嵌入式軟件中的應(yīng)用隊列(queue)是一個簡單線性表,它是一個允許在一端進行插入操作,而在另一端進行刪除操作的線性表。
    發(fā)表于 12-21 07:28

    實現(xiàn)隊列環(huán)形緩沖的方法

    串口隊列環(huán)形緩沖區(qū)隊列串口環(huán)形緩沖的好處代碼實現(xiàn)隊列??要
    發(fā)表于 02-21 07:11

    環(huán)形隊列的相關(guān)資料分享

    前言??當(dāng)代碼,不再是簡單的完成需求,對代碼進行堆砌,而是開始思考如何寫出優(yōu)美代碼的時候,我們的代碼水平必然會不斷提升,今天,咱們來學(xué)習(xí)環(huán)形隊列結(jié)構(gòu)。環(huán)形隊列的基本概念??相信對數(shù)據(jù)結(jié)
    發(fā)表于 02-23 06:10

    環(huán)形隊列的操作如何去實現(xiàn)

    環(huán)形隊列結(jié)構(gòu)的定義是什么?環(huán)形隊列的操作如何去實現(xiàn)呢?
    發(fā)表于 02-25 06:35

    基于環(huán)形隊列的串口打印阻塞解決方法

    隊列(FIFO)是一種常見的線性存儲結(jié)構(gòu),在嵌入式開發(fā)中經(jīng)常用到,主要的應(yīng)用場景有:
    的頭像 發(fā)表于 01-22 09:47 ?3092次閱讀
    基于<b class='flag-5'>環(huán)形</b><b class='flag-5'>隊列</b>的串口打印阻塞解決方法

    深度解析數(shù)據(jù)結(jié)構(gòu)與算法篇之隊列環(huán)形隊列實現(xiàn)

    的位置。 02 — 環(huán)形隊列實現(xiàn) 要想將元素放入隊列我們必須知道對頭和隊尾,在隊列長度不能無限大的條件下我們還要知道
    的頭像 發(fā)表于 06-18 10:07 ?2161次閱讀

    TencentOS-tiny中環(huán)形隊列實現(xiàn)

    1. 什么是隊列隊列(queue)是一種只能在一端插入元素、在另一端刪除元素的數(shù)據(jù)結(jié)構(gòu),遵循「先入先出」(FIFO)的規(guī)則。 隊列中有兩個基本概念: 隊頭指針(可變):永遠指向此隊列的第一個數(shù)據(jù)元素
    的頭像 發(fā)表于 10-08 16:30 ?1572次閱讀

    STM32串口環(huán)形緩沖--使用隊列實現(xiàn)(開放源碼)

    串口隊列環(huán)形緩沖區(qū)隊列串口環(huán)形緩沖的好處代碼實現(xiàn)隊列??要
    發(fā)表于 12-24 19:04 ?28次下載
    STM32串口<b class='flag-5'>環(huán)形</b>緩沖--使用<b class='flag-5'>隊列</b><b class='flag-5'>實現(xiàn)</b>(開放源碼)

    基于STM32的串口環(huán)形隊列IAP調(diào)試心得

    使用環(huán)形隊列,簡單點說就是個環(huán)形數(shù)組,一邊接收上位機數(shù)據(jù),一邊往flash里面寫。
    發(fā)表于 02-08 15:22 ?5次下載
    基于STM32的串口<b class='flag-5'>環(huán)形</b><b class='flag-5'>隊列</b>IAP調(diào)試心得

    嵌入式環(huán)形隊列和消息隊列是如何去實現(xiàn)的?

    嵌入式環(huán)形隊列和消息隊列實現(xiàn)數(shù)據(jù)緩存和通信的常見數(shù)據(jù)結(jié)構(gòu),廣泛應(yīng)用于嵌入式系統(tǒng)中的通信協(xié)議和領(lǐng)
    發(fā)表于 05-20 14:55 ?1352次閱讀

    裸機中環(huán)形隊列與RTOS中消息隊列有何區(qū)別呢?

    環(huán)形隊列”和“消息隊列”在嵌入式領(lǐng)域有應(yīng)用非常廣泛,相信有經(jīng)驗的嵌入式軟件工程師對它們都不陌生。
    的頭像 發(fā)表于 01-26 09:38 ?974次閱讀
    裸機中<b class='flag-5'>環(huán)形</b><b class='flag-5'>隊列</b>與RTOS中消息<b class='flag-5'>隊列</b>有何區(qū)別呢?

    嵌入式環(huán)形隊列與消息隊列實現(xiàn)原理

    嵌入式環(huán)形隊列,也稱為環(huán)形緩沖區(qū)或循環(huán)隊列,是一種先進先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),用于在固定大小的存儲區(qū)域中高效地存儲和訪問數(shù)據(jù)。其主要特點
    的頭像 發(fā)表于 09-02 15:29 ?1122次閱讀
    主站蜘蛛池模板: 色www亚洲国产张柏芝 | 亚洲精品老司机综合影院 | 亚欧免费视频一区二区三区 | 久精品在线观看 | 一区二区三区在线观看免费 | 成人伊人亚洲人综合网站222 | 国产美女主播一级成人毛片 | 伊人啪啪 | 大片毛片女女女女女女女 | 国语一级毛片私人影院 | 人阁色第四影院在线观看 | 免费观看a黄一级视频 | 色播激情五月 | 国产看片视频 | 亚洲综合色站 | 成 人色 网 站 欧美大片在线观看 | 手机在线看片国产日韩生活片 | 色综合色综合色综合色综合 | 日韩欧美中文字幕在线播放 | 很黄很暴力 很污秽的小说 很黄很黄叫声床戏免费视频 | 婷婷久久综合网 | 91极品女神私人尤物在线播放 | 欧美在线视频7777kkkk | 免费网站你懂得 | 亚洲欧美一区二区三区在线播放 | 视频一区二区三区在线观看 | 精品久久久久国产免费 | 奇米影视婷婷 | 天天久久| 一级做a爱过程免费视 | 四虎在线观看一区二区 | 欧美69色| 天堂网在线视频 | 亚洲日本在线观看视频 | 天堂视频在线视频观看2018 | 中文成人在线 | 亚洲三级网址 | 亚洲免费色图 | 欧美亚洲综合另类成人 | 成人国产永久福利看片 | 国产综合精品久久亚洲 |