在线观看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)基礎(chǔ)設(shè)施設(shè)計(jì)方法

嵌入式開發(fā)愛好者 ? 來(lái)源:嵌入式開發(fā)愛好者 ? 2023-10-12 16:09 ? 次閱讀

大家好,今天分享一篇嵌入式軟件架構(gòu)設(shè)計(jì)相關(guān)的文章。

軟件架構(gòu)這東西,眾說(shuō)紛紜,各有觀點(diǎn)。在我看來(lái),軟件架構(gòu)是軟件系統(tǒng)的基本結(jié)構(gòu),包含其組件、組件之間的關(guān)系、組件設(shè)計(jì)與演進(jìn)的規(guī)則,以及體現(xiàn)這些規(guī)則的基礎(chǔ)設(shè)施。

軟件架構(gòu),從來(lái)不是一件容易事,它貫穿在產(chǎn)品的整個(gè)生命周期,需要所有團(tuán)隊(duì)成員遵守并自律,才能將架構(gòu)思想在軟件中體現(xiàn)。新手工程師,由于經(jīng)歷的項(xiàng)目太少,看不到項(xiàng)目全貌,很難從全局理解軟件架構(gòu)。但軟件架構(gòu)真的只是資深工程師的專利嗎?這個(gè)也不見得。

古人作文,講究立意為先。今天工程師做項(xiàng)目和產(chǎn)品,也應(yīng)該先立意。這個(gè)意,就是指要有高度。工程師入門能從軟件架構(gòu)的高度出發(fā),看待軟件問題,相信對(duì)軟件的理解,會(huì)更加深刻一些。因此,我總結(jié)了軟件架構(gòu)的六個(gè)步驟,供嵌入式工程師參考。

上次談到了嵌入式軟件架構(gòu)的第一個(gè)步驟,抽象層。建立抽象層(HAL或者DAL)的目的,是為了隔離硬件,讓代碼與硬件無(wú)關(guān)。即使整個(gè)項(xiàng)目的代碼,由某工程師一個(gè)人完成,抽象層仍是是有必要的。

但這次我們要聊的是,統(tǒng)一的基礎(chǔ)設(shè)施,這是針對(duì)多人合作一個(gè)項(xiàng)目,或者多個(gè)項(xiàng)目共享同一個(gè)系統(tǒng)架構(gòu)的情況。

如果說(shuō),你手頭的項(xiàng)目,沒有與他人合作,也不會(huì)有后續(xù)的相關(guān)項(xiàng)目,軟件基礎(chǔ)設(shè)施這一步,可以直接跳過(guò)。

基礎(chǔ)設(shè)施,分為硬件基礎(chǔ)設(shè)施和軟件基礎(chǔ)設(shè)施。硬件基礎(chǔ)設(shè)施,包含常用器件庫(kù)、封裝庫(kù)、原理圖庫(kù)和硬件參考設(shè)計(jì)等等;而今天我們討論的重點(diǎn),主要在于軟件基礎(chǔ)設(shè)施。軟件基礎(chǔ)設(shè)施包含以下內(nèi)容:

  • ?基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)。

  • ?底層庫(kù)。比如C標(biāo)準(zhǔn)庫(kù)、加密庫(kù)、校驗(yàn)庫(kù)、工具庫(kù)等等。

  • ?操作系統(tǒng)/調(diào)度機(jī)制。包含操作系統(tǒng)以及調(diào)度相關(guān)服務(wù)。

  • ?中間件。比如文件系統(tǒng)、協(xié)議棧、數(shù)據(jù)庫(kù)等。

  • ?框架與機(jī)制。比如消息通信機(jī)制、事件驅(qū)動(dòng)機(jī)制、狀態(tài)機(jī)框架、行為樹框架。

  • ?工具支持。

  • ?統(tǒng)一的編程工具鏈。

  • ?統(tǒng)一的代碼風(fēng)格和編程規(guī)范。

在一些小公司粗放的開發(fā)模式中,并不規(guī)定工程師所依賴的軟件平臺(tái)、硬件平臺(tái)和工具,而是由工程師自己決定。很多工程師,也喜歡這種自由奔放的開發(fā)模式,認(rèn)為只有在這種環(huán)境中,才能發(fā)揮自身創(chuàng)造力。這種認(rèn)知是有偏差的,這個(gè)我們后續(xù)找機(jī)會(huì)詳細(xì)討論。

隨著小公司研發(fā)能力的提升,對(duì)軟件基礎(chǔ)設(shè)施進(jìn)行約束和規(guī)定,幾乎是注定的事情。因?yàn)檐浖^(qū)別于其他技術(shù)的本質(zhì),是在于其復(fù)用性。

復(fù)用程度越高的軟件,質(zhì)量越高,對(duì)開發(fā)效率和開發(fā)質(zhì)量的提升,就越大。無(wú)論從公司的降本增效還是科學(xué)管理的角度,都有著強(qiáng)大的動(dòng)機(jī),去統(tǒng)一軟件基礎(chǔ)設(shè)施。當(dāng)軟件的基礎(chǔ)設(shè)施統(tǒng)一之后,會(huì)產(chǎn)生如下優(yōu)點(diǎn):

  • ?軟件質(zhì)量提升,風(fēng)格的高度一致性
  • ?軟件復(fù)用性,會(huì)提升至一個(gè)新的水平
  • ?將可復(fù)用的功能,盡量抽象到基礎(chǔ)設(shè)施層,減少軟件冗余,提升開發(fā)效率。
  • ?為高層模塊提供約束和紀(jì)律
  • ?有利于團(tuán)隊(duì)的技術(shù)積累和技術(shù)傳承
  • ?有利于團(tuán)隊(duì)的技術(shù)培訓(xùn)
  • ?是團(tuán)隊(duì)進(jìn)行單元測(cè)試和測(cè)試驅(qū)動(dòng)開發(fā),以及跨平臺(tái)開發(fā)的前提。

因此,是否統(tǒng)一,根本不是一個(gè)有爭(zhēng)議的問題;如何統(tǒng)一,才是今天我們的重點(diǎn)。

一、基礎(chǔ)類型與宏定義

統(tǒng)一的軟件基礎(chǔ)設(shè)施的前提,就是聲明統(tǒng)一的基礎(chǔ)數(shù)據(jù)類型和宏,以克服不同的硬件平臺(tái)和編譯器的差異性。

比如下面是我從開源項(xiàng)目EventOS中摘錄出來(lái)的代碼,不見得很完整,只能代表在我在項(xiàng)目里需求。

#include

typedefunsignedinteos_u32_t;
typedefsignedinteos_s32_t;
typedefunsignedshorteos_u16_t;
typedefsignedshorteos_s16_t;
typedefunsignedchareos_u8_t;
typedefsignedchareos_s8_t;
typedefbooleos_bool_t;

#defineEOS_NULL((void*)0)

#defineEOS_U32_MAX(0xffffffffU)
#defineEOS_U32_MIN(0U)
#defineEOS_U16_MAX(0xffffU)
#defineEOS_U16_MIN(0U)
#defineEOS_U8_MAX(0xffU)
#defineEOS_U8_MIN(0U)

編譯器相關(guān)的宏定義。使用宏,屏蔽掉編譯器的差異,會(huì)

/*CompilerRelatedDefinitions*/
#ifdefined(__ARMCC_VERSION)/*ARMCompiler*/

#defineeos_section(x)__attribute__((section(x)))
#defineeos_used__attribute__((used))
#defineeos_align(n)__attribute__((aligned(n)))
#defineeos_weak__attribute__((weak))
#defineeos_inlinestatic__inline

#elifdefined(__GNUC__)/*GNUGCCCompiler*/

#defineeos_section(x)__attribute__((section(x)))
#defineeos_used__attribute__((used))
#defineeos_align(n)__attribute__((aligned(n)))
#defineeos_weak__attribute__((weak))
#defineeos_inlinestatic__inline

#elifdefined(__IAR_SYSTEMS_ICC__)/*forIARCompiler*/

#defineeos_section(x)@x
#defineeos_used__root
#defineeos_align(n)PRAGMA(data_alignment=n)
#defineeos_weak__weak
#defineeos_inlinestaticinline

#else
#error"Thecurrentcompilerisnotsupported."
#endif

一些常用的數(shù)據(jù)結(jié)構(gòu)。這些數(shù)據(jù)結(jié)構(gòu),與硬件和編譯器無(wú)關(guān),是在代碼中頻繁使用,并在多個(gè)模塊間共享的數(shù)據(jù)結(jié)構(gòu),有必要將其提升至基礎(chǔ)設(shè)施的層面進(jìn)行支持,以避免各個(gè)模塊,對(duì)同一個(gè)數(shù)據(jù)類型,進(jìn)行不同的定義帶來(lái)的數(shù)據(jù)轉(zhuǎn)換問題。

這些數(shù)據(jù)結(jié)構(gòu),與產(chǎn)品緊密相關(guān),不同的產(chǎn)品類型之間,各自是不同的。比如下面的定義。

typedefstructeos_date
{
eos_u32_tyear:16;
eos_u32_tmonth:8;
eos_u32_tday:8;
}eos_date_t;

typedefstructeos_time
{
eos_u32_thour:8;
eos_u32_tminute:8;
eos_u32_tsecond:6;
eos_u32_tms:10;
}eos_time_t;

typedefstructeos_imu_data
{
floatacc[3];
floatgyr[3];
floatmag[3];
}eos_imu_data_t;

二、操作系統(tǒng)

有些芯片的資源太小,是不能運(yùn)行操作系統(tǒng)的。這些芯片,一般而言,也沒有辦法建立嚴(yán)謹(jǐn)?shù)那度胧杰浖軜?gòu),我們會(huì)在后續(xù)《小資源芯片的軟件開發(fā)平臺(tái)》中,單獨(dú)進(jìn)行討論。這里只討論芯片的。

不同的芯片,所能跑的操作系統(tǒng)是不同的。但如果要建立軟件基礎(chǔ)設(shè)施,應(yīng)該盡量選取同一個(gè)操作系統(tǒng)。

在現(xiàn)存的操作系統(tǒng)中,FreeRTOS和國(guó)產(chǎn)RT-Thread對(duì)各種不同的硬件架構(gòu)的芯片,支持比較廣泛,可以作為RTOS的首選。

而當(dāng)產(chǎn)品線異常豐富時(shí),特別是使用了某些小眾芯片,或者使用芯片商提供的操作系統(tǒng)時(shí),就沒有辦法建立統(tǒng)一的軟件基礎(chǔ)設(shè)施。這時(shí),有兩個(gè)辦法解決這一問題:

  • ?編寫高層模塊時(shí),使用宏定義和條件編譯,選擇對(duì)應(yīng)的RTOS API。這種一般用于所使用的操作系統(tǒng)較少的情況,比如說(shuō)只有兩三種。
staticvoid*task_handler=NULL;

staticvoidtask_func_module_one(void*parameter);

voidmodule_one_init(void)
{
/*Newlycreatingatasktorunthemodule.*/
#if(EOS_RTOS_NAME==EOS_RTOS_NAME_FREERTOS)
xTaskCreate(task_func_module_one,
"TaskModule",2048,NULL,2,
(TaskHandle_t*)&task_handler);
#elif(EOS_RTOS_NAME==EOS_RTOS_NAME_RTTHREAD)
task_handler=rt_thread_create("led1",task_func_module_one,NULL,
2048,2,20);
#else
eos_assert(false);
#endif

eos_assert(task_handler!=NULL);
}

/*Thetaskfunctionofthemoduleone.*/
staticvoidtask_func_module_one(void*parameter)
{
(void)parameter;

/*Initialization.*/

while(1)
{
/*Addthetaskfunction.*/
}
}
  • ?建立操作系統(tǒng)抽象層(OSAL,Operating System Abstraction Layer),以屏蔽操作系統(tǒng)的差異,使高層模塊依賴于OSAL。這種情況適合于資源豐富的情況。
  • 著名的POSIX標(biāo)準(zhǔn),就是為了建立OSAL的,F(xiàn)reeRTOS和RT-Thread都在不同程度上對(duì)POSIX標(biāo)準(zhǔn)進(jìn)行了支持;在 v嵌入式領(lǐng)域,CMSIS_OS也是為了建立操作系統(tǒng)的統(tǒng)一接口;但無(wú)論是POSIX和CMSIS_OS,被各RTOS支持的力度是不同,因此如果我們產(chǎn)品中需要建立嚴(yán)謹(jǐn)?shù)那度胧杰浖軜?gòu),還是要建立屬于自己的OSAL,以便屏蔽掉操作系統(tǒng)的不同帶來(lái)的差異。

三、中間件

中間件有很多類型,文件系統(tǒng)、各種協(xié)議棧、數(shù)據(jù)庫(kù)、日志模塊、Shell模塊,都屬于中間件的范疇。但在大部分情況下,這些也都屬于軟件基礎(chǔ)設(shè)施的范疇。

因?yàn)槲覀円坏┻x擇某個(gè)中間件,一般來(lái)說(shuō),是沒有必要更換的,正是由于這種穩(wěn)定性,中間件也可以納入軟件基礎(chǔ)設(shè)施的范疇。以下是我經(jīng)常使用的開源中間件:

  • ?FatFS

  • ?LwIP

  • ?FlashDB

  • ?uC/Modbus

  • ?CAN Festival

  • ?letter-shell

開源中間件,只占據(jù)了一小部分。實(shí)際產(chǎn)品中,中間件的大部分,都是產(chǎn)品或者項(xiàng)目私有的代碼。我日常所使用的主要有:日志模塊數(shù)據(jù)采集模塊通訊傳輸層協(xié)議通訊應(yīng)用層協(xié)議文件傳輸協(xié)議OTA功能 * 時(shí)間同步

中間件,占據(jù)了軟件基礎(chǔ)設(shè)施的大部分內(nèi)容。在產(chǎn)品開發(fā)中,之所以軟件復(fù)用性能夠做到越來(lái)越高,中間件的積累,是一個(gè)很重要的原因。

四、框架與機(jī)制

在不同的產(chǎn)品上,開發(fā)嵌入式軟件,除了RTOS之外,很多產(chǎn)品還需要一些框架的支持。常見的框架包括:外設(shè)與驅(qū)動(dòng)框架設(shè)備框架消息框架狀態(tài)機(jī)框架行為樹框架事件驅(qū)動(dòng)框架

這些框架的使用,與產(chǎn)品的特性相關(guān),由產(chǎn)品和需求所決定。比如家庭服務(wù)機(jī)器人中,需要應(yīng)用狀態(tài)機(jī)框架和行為樹框架,來(lái)應(yīng)對(duì)復(fù)雜的應(yīng)用層邏輯。而某些應(yīng)用層邏輯比較簡(jiǎn)單的產(chǎn)品,就不需要使用狀態(tài)機(jī)和行為樹。

軟件基礎(chǔ)設(shè)施與硬件的關(guān)系

嵌入式軟件有一個(gè)區(qū)別于其他軟件領(lǐng)域的重要特性,那就是直接依賴于硬件。軟件基礎(chǔ)設(shè)施,有很多也是需要硬件去體現(xiàn)和承載。比如文件系統(tǒng),在規(guī)定某個(gè)源代碼比如FatFS作為其文件系統(tǒng)解決方案的同時(shí),所伴隨的硬件驅(qū)動(dòng)程序和硬件推薦設(shè)計(jì),也往往被固化,以便在下一個(gè)項(xiàng)目中進(jìn)行復(fù)用,并節(jié)約時(shí)間。

對(duì)于一些重要的且復(fù)雜的軟件基礎(chǔ)設(shè)施,如文件系統(tǒng)、網(wǎng)絡(luò)等,由于調(diào)試和測(cè)試都比較耗時(shí),一般推薦固化硬件設(shè)計(jì)的方式。硬件工程師,應(yīng)優(yōu)先對(duì)這些重要且復(fù)雜的軟件基礎(chǔ)設(shè)置,分配硬件資源,而硬件的其他工程,比如IO、ADC等,再行分配。

結(jié)論

嵌入式軟件基礎(chǔ)設(shè)施,非常重要,根據(jù)項(xiàng)目與產(chǎn)品的不同,它所包含的內(nèi)容也不盡相同。一般在項(xiàng)目啟動(dòng)時(shí),就會(huì)初步選定一些軟件基礎(chǔ)設(shè)施的內(nèi)容,比如RTOS、協(xié)議棧、文件系統(tǒng)等等。

需要指出的是,軟件基礎(chǔ)設(shè)施,也不是不變的,而是隨著產(chǎn)品開發(fā)發(fā)展,不斷會(huì)有新的組件和元素,加入到軟件基礎(chǔ)設(shè)施中去,也有可能會(huì)剝離掉舊的組件,就像生物的新陳代謝。

軟件基礎(chǔ)設(shè)施的新陳代謝,要溫和,要相對(duì)穩(wěn)定,添加和刪除,都要執(zhí)行謹(jǐn)慎原則。


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

原文標(biāo)題:嵌入式軟件架構(gòu)基礎(chǔ)設(shè)施設(shè)計(jì)方法

文章出處:【微信號(hào):嵌入式開發(fā)愛好者,微信公眾號(hào):嵌入式開發(fā)愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

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

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

    獵頭職位:嵌入式軟件架構(gòu)師【廈門】崗位職責(zé):1、負(fù)責(zé)軟件系統(tǒng)總體方案設(shè)計(jì)和詳細(xì)設(shè)計(jì),負(fù)責(zé)核心代碼編寫;2、負(fù)責(zé)技術(shù)方案評(píng)審,負(fù)責(zé)制定系統(tǒng)測(cè)試方案;3、負(fù)責(zé)新技術(shù)和關(guān)鍵技術(shù)的跟蹤、研究和
    發(fā)表于 03-01 10:20

    嵌入式軟件開發(fā)中的程序架構(gòu)

    嵌入式軟件開發(fā),包括單片機(jī)開發(fā)中,軟件架構(gòu)對(duì)于開發(fā)人員是一個(gè)必須認(rèn)真考慮的問題。軟件架構(gòu)對(duì)于系
    發(fā)表于 02-02 06:58

    嵌入式架構(gòu)有多重要

    原有的代碼。接下來(lái)嵌入式ARM便和大家分享一下,嵌入式架構(gòu)那些事兒……01嵌入式系統(tǒng)的基本架構(gòu)嵌入式
    發(fā)表于 10-27 08:15

    為何要進(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

    決定嵌入式系統(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

    嵌入式軟件基礎(chǔ)的四層架構(gòu)分別是哪些

    嵌入式軟件分層架構(gòu)基本原則有哪些?嵌入式軟件基礎(chǔ)的四層架構(gòu)分別是哪些?
    發(fā)表于 12-24 07:57

    基于模塊化設(shè)計(jì)的嵌入式軟件測(cè)試方法

    分析嵌入式軟件的特點(diǎn),綜述傳統(tǒng)的軟件測(cè)試方法;針對(duì)嵌入式軟件的特點(diǎn),提出
    發(fā)表于 05-18 13:26 ?23次下載

    基于模塊化設(shè)計(jì)的嵌入式軟件測(cè)試方法

    摘要:分析嵌入式軟件的特點(diǎn),綜述傳統(tǒng)的軟件測(cè)試方法;針對(duì)嵌入式軟件的特點(diǎn),提出
    發(fā)表于 04-07 00:32 ?2175次閱讀
    基于模塊化設(shè)計(jì)的<b class='flag-5'>嵌入式</b><b class='flag-5'>軟件</b>測(cè)試<b class='flag-5'>方法</b>

    嵌入式軟件架構(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ā)展,嵌入式軟件系統(tǒng)的復(fù)雜度也日益增大。在
    發(fā)表于 10-25 14:46 ?1次下載
    實(shí)時(shí)多任務(wù)<b class='flag-5'>嵌入式</b><b class='flag-5'>軟件</b>的<b class='flag-5'>架構(gòu)</b>方式的設(shè)計(jì)應(yīng)用

    嵌入式軟件是什么意思_嵌入式軟件的分類有哪些

    本文首先闡述了嵌入式軟件的概念,其次介紹了嵌入式軟件的特征,最后介紹了嵌入式軟件的分類。
    發(fā)表于 08-31 15:54 ?1.6w次閱讀

    嵌入式開發(fā)中常用的軟件架構(gòu)

    嵌入式軟件開發(fā),包括單片機(jī)開發(fā)中,軟件架構(gòu)對(duì)于開發(fā)人員是一個(gè)必須認(rèn)真考慮的問題。軟件架構(gòu)對(duì)于系
    的頭像 發(fā)表于 01-01 10:16 ?5930次閱讀
    <b class='flag-5'>嵌入式</b>開發(fā)中常用的<b class='flag-5'>軟件</b><b class='flag-5'>架構(gòu)</b>

    嵌入式軟件架構(gòu)

    嵌入式軟件架構(gòu)
    發(fā)表于 10-20 20:51 ?20次下載
    <b class='flag-5'>嵌入式</b>系<b class='flag-5'>軟件</b><b class='flag-5'>架構(gòu)</b>

    詳解FreeRTOS:嵌入式軟件系統(tǒng)架構(gòu)

    目前常見的嵌入式軟件系統(tǒng)架構(gòu)有三種可以分為:輪詢系統(tǒng)架構(gòu)、前后臺(tái)系統(tǒng)架構(gòu)和多任務(wù)系統(tǒng)架構(gòu)
    的頭像 發(fā)表于 05-04 16:40 ?3163次閱讀
    詳解FreeRTOS:<b class='flag-5'>嵌入式</b><b class='flag-5'>軟件</b>系統(tǒng)<b class='flag-5'>架構(gòu)</b>

    通信基礎(chǔ)設(shè)施設(shè)備的電流檢測(cè)應(yīng)用

    電子發(fā)燒友網(wǎng)站提供《通信基礎(chǔ)設(shè)施設(shè)備的電流檢測(cè)應(yīng)用.pdf》資料免費(fèi)下載
    發(fā)表于 09-03 10:03 ?0次下載
    通信<b class='flag-5'>基礎(chǔ)設(shè)施設(shè)</b>備的電流檢測(cè)應(yīng)用
    主站蜘蛛池模板: 国产香蕉久久精品综合网 | 国产在视频线精品视频2021 | 深夜视频在线免费 | 女人张开腿让男人桶免费最新 | 特黄色一级毛片 | 国产一级做a爰片久久毛片 国产一级做a爰片久久毛片男 | 好硬好湿好爽再深一点h | 一级做α爰片久久毛片 | 天堂最新版资源www在线 | 欧美爱爱网 | 国产色司机在线视频免费观看 | 在线观看s色 | 图片区网友自拍另类图区 | 黄 在线 | 五月婷婷丁香花 | 日韩啪啪网 | 国产偷啪视频一区 | 亚洲一级毛片免费观看 | 日日干夜夜爽 | 亚洲爱爱网站 | 妇少香港三日本三级视频 | 五月婷婷激情综合 | aa在线播放 | 伊人久操 | 日本最色网站 | 色六月丁香 | 一级做a爰片久久毛片毛片 一级做a爰片久久毛片美女图片 | 日本人六九视频69jzz免费 | 四虎影视免费观看 | 色婷婷六月 | 日韩免费三级电影 | 色多多视频网站 | 高黄网站| 色拍拍综合网 | 久热网 | 好大好硬好深好爽的视频 | 亚洲人成网站色在线观看 | 欧美一卡2卡三卡4卡5卡免费观看 | 亚洲经典一区二区三区 | 在线观看视频高清视频 | 被公侵犯肉体中文字幕一区二区 |