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

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

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

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

嵌入式軟件架構(gòu)設(shè)計(jì)之任務(wù)調(diào)度

汽車電子技術(shù) ? 來(lái)源:大橙子瘋嵌入式 ? 作者:大橙子瘋 ? 2023-02-15 14:44 ? 次閱讀

1、前言

嵌入式MCU軟件開發(fā)過(guò)程中,程序任務(wù)調(diào)度架構(gòu)的搭建尤為重要,直接關(guān)系到該程序能支持多少功能(隨著功能越多系統(tǒng)響應(yīng)能力越弱,好的任務(wù)調(diào)度架構(gòu)能夠在保持相同的系統(tǒng)響應(yīng)能力前提下支持更多的功能),下面介紹三種常用的程序任務(wù)調(diào)度框架設(shè)計(jì)方案:

2、程序框架設(shè)計(jì)

前后臺(tái)順序執(zhí)行法

這是初學(xué)者們常用的程序框架設(shè)計(jì)方案,不用考慮太多東西,代碼簡(jiǎn)單,或者對(duì)系統(tǒng)的整體實(shí)時(shí)性和并發(fā)性要求不高;初始化后通過(guò) while(1){ } 或 for(;;){ } 循環(huán)不斷調(diào)用自己編寫完成的函數(shù),也基本不考慮每個(gè)函數(shù)執(zhí)行所需要的時(shí)間,大部分情況下函數(shù)中或多或少都存在毫秒級(jí)別的延時(shí)等待。

優(yōu)點(diǎn) :對(duì)于初學(xué)者來(lái)說(shuō),這是最容易也是最直觀的程序架構(gòu),邏輯簡(jiǎn)單明了,適用于邏輯簡(jiǎn)單,復(fù)雜度比較低的軟件開發(fā)。

缺點(diǎn) :實(shí)時(shí)性低,由于每個(gè)函數(shù)或多或少存在毫秒級(jí)別的延時(shí),即使是1ms,也會(huì)造成其他函數(shù)間隔執(zhí)行時(shí)間的不同,雖然可通過(guò)定時(shí)器中斷的方式,但是前提是中斷執(zhí)行函數(shù)花的時(shí)間必須短。當(dāng)程序邏輯復(fù)雜度提升時(shí),會(huì)導(dǎo)致后來(lái)維護(hù)人員的大腦混亂,很難理清楚該程序的運(yùn)行狀態(tài)。

以下是我在學(xué)校期間做的寢室防盜系統(tǒng)的主函數(shù)代碼(當(dāng)時(shí)也存在部分BUG,沒有解決。現(xiàn)在再看,其實(shí)很多問(wèn)題,而且比較嚴(yán)重,比如中斷服務(wù)函數(shù)內(nèi)竟然有3000ms延時(shí),這太可怕了,還有串口發(fā)送等等;由于實(shí)時(shí)性要求不算太高,因此主函數(shù)中的毫秒級(jí)別延時(shí)對(duì)系統(tǒng)運(yùn)行沒有多大影響,當(dāng)然除BUG外;若是后期需要維護(hù),那就是一個(gè)大工程,還不如推翻重寫):

int main(void)
 {    
    u8 temperature;          
    u8 humidity;   
    int a;
    delay_init();
    uart2_Init(9600);     
    TIM3_Int_Init(4999,7199);
    ds1302_init();
    while(DHT11_Init());    //DHT11初始化    
    a1602_init();        
    lcd12864_INIT();
    LcdInit();

    while(1)
    {
        for(a=0;a<11;a++)
        {
            num[a+3]=At24c02Read(a+2)-208;
            delay_us(10);                    
        }
        for(a=0;a<6;a++)
        {
            shuru[a]=At24c02Read(a+13)-208;
            delay_us(10);                
        }        
        delay_ms(10);  
        RED_Scan();
        Ds1302ReadTime();                    //讀取ds1302的日期時(shí)間
        shi=At24c02Read(0);                //讀取鬧鐘保存的數(shù)據(jù)
        delay_ms(10);
        fen=At24c02Read(1);                //讀取鬧鐘保存的數(shù)據(jù)            
        usart2_scan();                        //藍(lán)牙數(shù)據(jù)掃描
        usart2_bian();                        //藍(lán)牙處理數(shù)據(jù)
        nao_scan();
        k++;
        if(k<20)
        {
            if(k==1)
                LcdWriteCom(0x01);  //清屏
            LcdDisplay();                            //顯示日期時(shí)間
        }
        if(RED==0)
            RED_Scan();

        if(k>=20&&k<30)
        {
            if(k==20)
                LcdWriteCom(0x01);  //清屏
            Lcddisplay();                            //顯示溫濕度
            LcdWriteCom(0x80+6);    
            DHT11_Read_Data(&temperature,&humidity);    //讀取溫濕度值    
            Temp=temperature;Humi=humidity;
            LcdWriteData('0'+temperature/10);
            LcdWriteData('0'+temperature%10);
            LcdWriteCom(0x80+0X40+6);    
            LcdWriteData('0'+humidity/10);
            LcdWriteData('0'+humidity%10);
        }
        if(k==30)
            k=0;
        lcd12864();                                //顯示防盜鬧鐘狀態(tài)

    }        
}


//定時(shí)器3中斷服務(wù)程序
void TIM3_IRQHandler(void)   //TIM3中斷
{
    int i;
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //檢查TIM3更新中斷發(fā)生與否
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中斷標(biāo)志 
        if(key1==1&&FEN-fen==0&&SHI-shi==0)                //時(shí)間一到鬧鐘響起
        {
            f=1;                        
        }
        else
        {
            f=0;
        }    
        if(USART_RX_BUF[0]=='R'&&USART_RX_BUF[1]=='I'&&USART_RX_BUF[2]=='N'&&USART_RX_BUF[3]=='G')
        {
            key0=1;
            for(i=0;i<17;i++)
            {
                USART_SendData(USART1, num[i]);//向串口1發(fā)送數(shù)據(jù)
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發(fā)送結(jié)束
                USART_RX_STA=0;    
            }    
            delay_ms(3000);
            for(i=0;i<3;i++)
            {
                USART_SendData(USART1, num1[i]);//向串口1發(fā)送數(shù)據(jù)
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發(fā)送結(jié)束
                USART_RX_STA=0;    
            }            
        }
    }
}

時(shí)間片論法

介于“前后臺(tái)順序執(zhí)行法”和“操作系統(tǒng)”之間的一種程序架構(gòu)設(shè)計(jì)方案。該設(shè)計(jì)方案需能幫助嵌入式軟件開發(fā)者更上一層樓,在嵌入式軟件開發(fā)過(guò)程中,若遇到以下幾點(diǎn),那么該設(shè)計(jì)方案可以說(shuō)是最優(yōu)選擇,適用于程序較復(fù)雜的嵌入式系統(tǒng)

  1. 目前的需求設(shè)計(jì)需要完全沒有必要上操作系統(tǒng)
  2. 任務(wù)函數(shù)無(wú)需時(shí)刻執(zhí)行,存在間隔時(shí)間(比如按鍵,一般情況下,都需要軟件防抖,初學(xué)者的做法通常是延時(shí)10ms左右再去判斷,但10ms極大浪費(fèi)了CPU的資源,在這段時(shí)間內(nèi)CPU完全可以處理很多其他事情)
  3. 實(shí)時(shí)性有一定的要求

該設(shè)計(jì)方案需要使用一個(gè)定時(shí)器,一般情況下定時(shí)1ms即可(定時(shí)時(shí)間可隨意定,但中斷過(guò)于頻繁效率就低,中斷太長(zhǎng),實(shí)時(shí)性差),因此需要考慮到每個(gè)任務(wù)函數(shù)的執(zhí)行時(shí)間,建議不能超過(guò)1ms(能通過(guò)程序優(yōu)化縮短執(zhí)行時(shí)間則最好優(yōu)化,如果不能優(yōu)化的,則必須保證該任務(wù)的執(zhí)行周期必須遠(yuǎn)大于任務(wù)所執(zhí)行的耗時(shí)時(shí)間),同時(shí)要求主循環(huán)或任務(wù)函數(shù)中不能存在毫秒級(jí)別的延時(shí)。

如何確定每個(gè)函數(shù)的任務(wù)周期呢?根據(jù)任務(wù)的耗時(shí)和效果決定、如按鍵掃描任務(wù)周期為 10ms(為了提高響應(yīng)),指示燈控制任務(wù)周期為 100ms(通常情況下最高100ms的閃爍頻率正好,特殊需求除外),LCD/OLED 顯示周期為 100ms(通過(guò)這種通過(guò)SPI/IIC等接口的方式耗時(shí)大約在 1~10ms,甚至更長(zhǎng),所以任務(wù)周期必須遠(yuǎn)大于耗時(shí),同時(shí)為了滿足人眼所能接受的刷屏效果,也不能太長(zhǎng),100ms 的任務(wù)周期比較合適)等

以下介紹兩種不同的實(shí)現(xiàn)方案,分別針對(duì)無(wú)函數(shù)指針概念的朋友和想進(jìn)一步學(xué)習(xí)的朋友。

① 無(wú)函數(shù)指針的設(shè)計(jì)方式

  1. 首先定義計(jì)時(shí)標(biāo)志變量,以1毫秒為時(shí)間片,在定時(shí)器中斷函數(shù)中累計(jì)計(jì)時(shí),同時(shí)將對(duì)應(yīng)時(shí)間標(biāo)識(shí)置1 。
void TIM3_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM3,TIM_IT_Update) == SET)
    {
        sg_1msTic++;

        sg_1msTic % 1 == 0 ? TIM_1msFlag = 1 : 0;
        sg_1msTic % 10 == 0 ? TIM_10msFlag = 1 : 0;
        sg_1msTic % 20 == 0 ? TIM_20msFlag = 1 : 0;
        sg_1msTic % 100 == 0 ? TIM_100msFlag = 1 : 0;
        sg_1msTic % 500 == 0 ? TIM_500msFlag = 1 : 0;
        sg_1msTic % 1000 == 0 ? (TIM_1secFlag  = 1, sg_1msTic = 0) : 0;
    }

    TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
  1. 然后在主函數(shù)循環(huán)中判斷時(shí)間標(biāo)識(shí),標(biāo)識(shí)被置1則代表時(shí)間已到,可以執(zhí)行相應(yīng)的函數(shù),全部執(zhí)行完畢后將標(biāo)識(shí)置0 ,等待下次觸發(fā)。
int main(void)
{
    System_Init();

    while (1)
    {

        if (TIM_1msFlag)
        {
            CAN_CommTask();// CAN通信任務(wù)

            TIM_1msFlag = 0;
        }

        if (TIM_10msFlag)
        {
            KEY_ScanTask();// 按鍵掃描任務(wù)
            Hmi_Task();// 人機(jī)交互任務(wù)

            TIM_10msFlag = 0;
        }

        if (TIM_100msFlag)
        { 
            LED_CtrlTask();// 指示燈任務(wù)

            TIM_100msFlag = 0;
        }    

        if (TIM_1secFlag)
        {
            WDog_Task();// 喂狗任務(wù)

            TIM_1secFlag = 0;
        }  
    }
}

② 含函數(shù)指針的設(shè)計(jì)方式

  1. 定義含有函數(shù)指針的結(jié)構(gòu)體,用來(lái)指向需要周期執(zhí)行的函數(shù)。
typedef struct{
    uint8 m_runFlag;/*!< 程序運(yùn)行標(biāo)記:0-不運(yùn)行,1運(yùn)行 */
    uint16 m_timer;/*!< 計(jì)時(shí)器 */
    uint16 m_itvTime;/*!< 任務(wù)運(yùn)行間隔時(shí)間 */
    void (*m_pTaskHook)(void);/*!< 要運(yùn)行的任務(wù)函數(shù) */
} TASK_InfoType;
  1. 實(shí)現(xiàn)函數(shù)指針任務(wù)基本調(diào)度功能:任務(wù)調(diào)度管理和任務(wù)調(diào)度執(zhí)行 。
/**
  * @brief      任務(wù)函數(shù)運(yùn)行調(diào)度管理.
  */
void TASK_Remarks(void)
{
    uint8 i;

    for (i = 0; i < TASKS_MAX; i++)
    {
        if (sg_tTaskInfo[i].m_timer)
        {
            sg_tTaskInfo[i].m_timer--;

            if (0 == sg_tTaskInfo[i].m_timer)
            {
                 sg_tTaskInfo[i].m_timer = sg_tTaskInfo[i].m_itvTime;
                 sg_tTaskInfo[i].m_runFlag = 1;
            }
        }
   }
}

/**
  * @brief      任務(wù)函數(shù)調(diào)度執(zhí)行.
  */
void TASK_Process(void)
{
    uint8 i;

    for (i = 0; i < TASKS_MAX; i++)
    {
        if (sg_tTaskInfo[i].m_runFlag)
        {
             sg_tTaskInfo[i].m_pTaskHook(); // 運(yùn)行任務(wù)
             sg_tTaskInfo[i].m_runFlag = 0; // 標(biāo)志清0
        }
    }   
}
  1. 分別在定時(shí)器中斷函數(shù)和主函數(shù)中調(diào)用任務(wù)調(diào)度管理和任務(wù)調(diào)度執(zhí)行 。
int main(void)
{
    System_Init();

    while (1)
    {
        TASK_Process();
    }
}

/**
  * @brief      定時(shí)器3中斷服務(wù)函數(shù).
  */
void TIM3_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM3,TIM_IT_Update) == SET)
    {
        TASK_Remarks();
    }

    TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
  1. 添加需要執(zhí)行的任務(wù)函數(shù)即可。
#define TASKS_MAX     5    // 定義任務(wù)數(shù)目


/** 任務(wù)函數(shù)相關(guān)信息 */
static TASK_InfoType sg_tTaskInfo[TASKS_MAX] = {
    {0, 1, 1, CAN_CommTask},     // CAN通信任務(wù)
    {0, 10, 10, KEY_ScanTask},   // 按鍵掃描任務(wù)
    {0, 10, 10, LOGIC_HandleTask}, // 邏輯處理任務(wù)
    {0, 100, 100, LED_CtrlTask},// 指示燈控制任務(wù)
    {0, 1000, 1000, WDog_Task},  // 喂狗任務(wù)
};

操作系統(tǒng)

嵌入式操作系統(tǒng)EOS(Embedded OperatingSystem)是一種用途廣泛的系統(tǒng)軟件,過(guò)去它主要應(yīng)用于工業(yè)控制和國(guó)防系統(tǒng)領(lǐng)域,而對(duì)于單片機(jī)來(lái)說(shuō),比較常用的有 UCOSFreeRTOSRT-Thread Nano 和 RTX 等多種搶占式操作系統(tǒng)(其他如 Linux 等操作系統(tǒng)不適用于單片機(jī))

操作系統(tǒng)和“時(shí)間片論法”,在任務(wù)執(zhí)行方面來(lái)說(shuō),操作系統(tǒng)對(duì)每個(gè)任務(wù)的耗時(shí)沒有過(guò)多的要求,需要通過(guò)設(shè)置每個(gè)任務(wù)的優(yōu)先級(jí),在高優(yōu)先級(jí)的任務(wù)就緒時(shí),會(huì)搶占低優(yōu)先級(jí)的任務(wù);操作系統(tǒng)相對(duì)復(fù)雜,因此這里沒有詳細(xì)介紹了。

關(guān)于如何選擇合適的操作系統(tǒng)([RTOS]uCOS、FreeRTOS、RTThread、RTX等RTOS的對(duì)比之特點(diǎn)):

UCOS :網(wǎng)上資料豐富,非常適合學(xué)習(xí),但是在產(chǎn)品上使用則需要收費(fèi)

FreeRTOS :使用免費(fèi),因此很多產(chǎn)品都在用

RT-Thread :國(guó)產(chǎn)物聯(lián)網(wǎng)操作系統(tǒng),有著十分豐富的組件,也免費(fèi),資料:RT-Thread 文檔中心

RTX :為ARM和Cortex-M設(shè)備設(shè)計(jì)的免版稅,確定性的實(shí)時(shí)操作系統(tǒng)

借網(wǎng)上一張對(duì)比圖:

圖片

3、總結(jié)

從上述的對(duì)比中可以看出,時(shí)間片輪詢法的優(yōu)勢(shì)還是比較大的,它既有前后臺(tái)順序執(zhí)行法的優(yōu)點(diǎn),也有操作系統(tǒng)的優(yōu)點(diǎn)。結(jié)構(gòu)清晰,簡(jiǎn)單,非常容易理解,所以這種是比較常用的單片機(jī)設(shè)計(jì)框架。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17851

    瀏覽量

    360700
  • 嵌入式
    +關(guān)注

    關(guān)注

    5141

    文章

    19542

    瀏覽量

    315178
  • 軟件開發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    637

    瀏覽量

    28189
收藏 人收藏

    評(píng)論

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

    嵌入式軟件架構(gòu)設(shè)計(jì)

      本篇介紹了嵌入式系統(tǒng)編程軟件架構(gòu)方面的知識(shí),主要包括模塊劃分、多任務(wù)還是單任務(wù)選取、單任務(wù)
    發(fā)表于 06-23 23:15

    誠(chéng)聘嵌入式軟件架構(gòu)

    ,本科以上學(xué)歷;2、三年以上嵌入式軟件系統(tǒng)架構(gòu)設(shè)計(jì)經(jīng)驗(yàn),同時(shí)有通信行業(yè)軟件開發(fā)經(jīng)驗(yàn);3、精通C/C++語(yǔ)言,精通數(shù)據(jù)結(jié)構(gòu);熟悉QT\linux\android
    發(fā)表于 03-01 10:20

    嵌入式系統(tǒng)的軟件架構(gòu)設(shè)計(jì)!

    軟件架構(gòu)設(shè)計(jì)!2. 嵌入式環(huán)境下軟件設(shè)計(jì)的特點(diǎn)要談嵌入式軟件
    發(fā)表于 08-10 07:46

    為何要進(jìn)行嵌入式軟件架構(gòu)設(shè)計(jì)?如何設(shè)計(jì)?

    為何要進(jìn)行嵌入式軟件架構(gòu)設(shè)計(jì)?如何進(jìn)行嵌入式軟件架構(gòu)設(shè)計(jì)?
    發(fā)表于 11-01 06:31

    嵌入式軟件架構(gòu)設(shè)計(jì)的目的及思路

    【1】架構(gòu)設(shè)計(jì)的目的1.應(yīng)用的代碼邏輯清晰,且避免重復(fù)造輪子。2.方便軟件的移植。3.最大限度地復(fù)用。4.高內(nèi)聚低耦合。 【2】嵌入式架構(gòu)思路1.功能模塊化設(shè)計(jì)獲得需求------->
    發(fā)表于 11-08 06:41

    對(duì)嵌入式系統(tǒng)中的架構(gòu)設(shè)計(jì)的理解

    【閱讀這篇文章,你能了解到什么】1. 從事嵌入式開發(fā)12年的我,對(duì)架構(gòu)設(shè)計(jì)的理解;2. 對(duì)嵌入式系統(tǒng)中的架構(gòu)設(shè)計(jì)要刻意訓(xùn)練;3. 嵌入式系統(tǒng)
    發(fā)表于 11-08 08:23

    決定嵌入式系統(tǒng)軟件架構(gòu)的因素和架構(gòu)的影響

    嵌入式系統(tǒng)軟件架構(gòu)設(shè)計(jì)目錄1.前言42.決定架構(gòu)的因素和架構(gòu)的影響42.1.常見的誤解52.1.1.小型的系統(tǒng)不需要
    發(fā)表于 11-08 06:54

    嵌入式系統(tǒng)任務(wù)管理與調(diào)度

    慕課電子科技大學(xué).嵌入式系統(tǒng).第七章.任務(wù)管理與調(diào)度.任務(wù)管理3-任務(wù)管理機(jī)制0 目錄7 任務(wù)
    發(fā)表于 12-21 08:00

    嵌入式軟件架構(gòu)設(shè)計(jì)資料分享

    作為程序員,我覺得如果要走的更遠(yuǎn)必須要成為工程師,畢竟年齡和資歷都擺在那里了。所以就讓我這個(gè)老程序員淺談一下嵌入式軟件架構(gòu)設(shè)計(jì)。我參考的也是一篇博文。原圖如下![在這里插入圖片描述](?x-oss-process=image/w
    發(fā)表于 12-24 07:09

    嵌入式軟件架構(gòu)設(shè)計(jì)

    嵌入式軟件架構(gòu)的設(shè)計(jì),幫助我們建立合理,有效的軟件架構(gòu)
    發(fā)表于 11-09 17:34 ?19次下載

    實(shí)時(shí)多任務(wù)嵌入式軟件架構(gòu)方式的設(shè)計(jì)應(yīng)用

    分享到:標(biāo)簽:軟總線 嵌入式軟件 實(shí)時(shí)多任務(wù) 1.引言 隨著大型嵌入式系統(tǒng)向著集成化和多元化方向的發(fā)展,嵌入式
    發(fā)表于 10-25 14:46 ?1次下載
    實(shí)時(shí)多<b class='flag-5'>任務(wù)</b><b class='flag-5'>嵌入式</b><b class='flag-5'>軟件</b>的<b class='flag-5'>架構(gòu)</b>方式的設(shè)計(jì)應(yīng)用

    探究嵌入式開發(fā)是否需要架構(gòu)設(shè)計(jì)?

    閱讀這篇文章,你能了解到什么 1. 從事嵌入式開發(fā)12年的我,對(duì)架構(gòu)設(shè)計(jì)的理解; 2. 對(duì)嵌入式系統(tǒng)中的架構(gòu)設(shè)計(jì)要刻意訓(xùn)練; 3. 嵌入式
    的頭像 發(fā)表于 04-05 09:49 ?3700次閱讀
    探究<b class='flag-5'>嵌入式</b>開發(fā)是否需要<b class='flag-5'>架構(gòu)設(shè)</b>計(jì)?

    嵌入式UI架構(gòu)設(shè)計(jì)漫談

    嵌入式UI架構(gòu)設(shè)計(jì)漫談
    發(fā)表于 11-03 17:36 ?15次下載
    <b class='flag-5'>嵌入式</b>UI<b class='flag-5'>架構(gòu)設(shè)</b>計(jì)漫談

    嵌入式系統(tǒng)軟件架構(gòu)設(shè)計(jì)

    嵌入式系統(tǒng)軟件架構(gòu)設(shè)計(jì)目錄1.前言42.決定架構(gòu)的因素和架構(gòu)的影響42.1.常見的誤解52.1.1.小型的系統(tǒng)不需要
    發(fā)表于 11-03 18:21 ?30次下載
    <b class='flag-5'>嵌入式</b>系統(tǒng)<b class='flag-5'>軟件</b><b class='flag-5'>架構(gòu)設(shè)</b>計(jì)

    任務(wù)調(diào)度開源代碼是什么

    通過(guò)[嵌入式軟件架構(gòu)設(shè)計(jì)-任務(wù)調(diào)度]了解到 MCU 的三種任務(wù)
    的頭像 發(fā)表于 02-15 14:53 ?1188次閱讀
    主站蜘蛛池模板: 天天碰免费视频 | 欧美国产日本高清不卡 | 天天色天天干天天射 | 天天射天天怕 | 人人干操 | 欧美性猛 | 黄色毛片子 | 男人边吃奶边做视频免费网站 | 三级黄色短视频 | 欧美三级不卡在线观线看高清 | 网友自拍区一区二区三区 | 天天射网站 | 国产高清免费不卡观看 | 天堂在线视频 | 97av免费视频 | 国产精品免费观看网站 | 久久精品国产免费看久久精品 | 日本一区视频在线播放 | 性视频软件 | 午夜黄色网 | 一级女人毛片人一女人 | 成人三级网址 | 夜夜cao| 国产精品免费久久久免费 | 正在播放淫亚洲 | 欧美成人看片一区二区三区 | 色妞女女女女女bbbb | 免费在线播放毛片 | 91色在线播放 | 男人天堂资源网 | 天天干天天操天天碰 | 午夜100| 伊人久久综合成人网小说 | 在线看逼 | 日韩三级在线免费观看 | 久久艹人人艹 | 四虎影视永久在线精品免费播放 | 亚洲欧美人成网站综合在线 | 色噜噜成人综合网站 | 海外毛片 | 黄色在线视频免费 |