精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

中國移動 Oneos 框架基礎及其組件解析

開發 架構
OneOS是中國移動針對物聯網領域推出的輕量級操作系統,具有可裁剪、跨平臺、低功耗、高安全等特點,支持ARM Cortex-M、MIPS、RISC-V等主流芯片架構,兼容POSIX、CMSIS等標準接口,支持MicroPython語言開發,提供圖形化開發工具,能夠有效提升開發效率并降低開發成本,集成公共組件,適用于安全易用的物聯網產品。

 [[431315]]

1、oneos系統

1.1 開發手冊

OneOS是中國移動針對物聯網領域推出的輕量級操作系統,具有可裁剪、跨平臺、低功耗、高安全等特點,支持ARM Cortex-M、MIPS、RISC-V等主流芯片架構,兼容POSIX、CMSIS等標準接口,支持MicroPython語言開發,提供圖形化開發工具,能夠有效提升開發效率并降低開發成本,集成公共組件,適用于安全易用的物聯網產品。

移動官網提供完善的oneos開發文檔 https://os.iot.10086.cn/v2/doc/homePage

也可參考RT-Thread的資料,https://www.rt-thread.org/document/site/#/

1.2 開發工具

OneOS開發環境是基于命令行的OneOS-Cube,在對應工程目錄下,執行menuconfig配置系統,scons編譯構造。具體操作說明:https://os.iot.10086.cn/v2/doc/detailPage/documentHtml?idss=157071776529260544&proId=156799478777782272

1.3 軟件框架

OneOS總體架構采用分層設計,主體由驅動、內核、組件、安全框架組成,采用一個輕量級內核加多個系統組件的模式。

與freeRTOS只包括內核相比,oneos支持通用組件或第三方庫,尤其對接移動平臺方便,遵循 Apache 2.0 license 開源協議,任意使用。

1.4 內核

Oneos內核提供任務管理調度、任務間同步與通信、定時器、內存管理等常用RTOS功能,與常規的RTOS如freeRTOS相比,僅有幾點小區別:

1、任務,創建task后需要額外調用才啟動,不同于freeRTOS創建所有的task后統一啟動調度,全部task都開始執行。這種各task獨立啟動的,需要注意先后關系,不能task1啟動后就向task2的隊列發消息,此時隊列可能為NULL且發送前沒有判斷,會導致重啟。

2、消息隊列,其動態創建和發送接口類似,但接收隊列消息需要傳入的參數不同,需要傳入期望接收的字節大小。巧合的是項目使用的消息隊列都是同一個結構體,如果不一致,需要特殊處理。

3、工作隊列,將task進行了一定封裝,不需要為處理某個事件而新建task,交給系統提前創建的task統一執行,執行結束后觸發回調函數,這樣多個長時間運行但不經常觸發的,可以交給工作隊列處理,該功能在UIS8910中系統自帶。

4、郵箱,Oneos特有的,可理解為簡化版的消息隊列。

如果對freeRTOS不熟悉的,可以參考入門文章

1.5 組件

正如前面提到,如何使用oneos,移動官網有詳細的說明,本文只是介紹oneos的基本開發流程,分析其部分功能的實現方式,后續以其設備框架、SHELL和單元測試三部分為主。

2、系統移植

2.1 開發流程

基于oneos的開發方式和以往不同,先將原始工程編譯生成庫,全部復制到oneos工程,再基于oneos系統開發業務邏輯,其開發環境和原始工程開發環境無關。Oneos工程編譯生成的bin文件下載到設備,完整版本支持microPython,可以導入python文件直接運行。

可能部分功能比較特殊,使用原始庫文件無法實現,例如獲取系統某個參數。在原始工程開發,可以直接將客制化代碼插入某個接口攔截,基于oneos開發時盡量避免,但是實在不行也只能這樣。這樣操作后,原始工程編譯成功,但鏈接肯定失敗,但不影響結果,只要輸出lib庫即可。

2.2 操作系統適配

如果沒有原始SDK,要運行oneos,直接將原始庫,例如STM32原廠HAL庫復制到oneos/thirdparty即可;但是有基礎SDK,且SDK是基于其它RTOS開發,則其庫要在oneos運行,需要進行適配轉換,存在兩種方式。

以目前支持cat1網絡比較火的兩個芯片平臺為例。紫光展銳UIS8910平臺使用freeRTOS,且基本開源,因此可以將UIS8910工程中的freeRTOS系統接口,其函數內容替換使用oneos的接口實現。

翱捷ASR1603平臺使用threadX,且已封庫,因此是在oneos工程,將oneos的系統內核接口函數內容使用ASR1603提供的庫實現。

<公眾號:嵌入式系統>

前者UIS8910是oneos直接在底層替換了freeRTOS,相當于只運行了一套較為干凈的oneos;后者完全是將兩套RTOS的接口互相匹配,且中間并不是一對一替換。

2.3 風險與限制

原始工程開發函數是直接調用,引入oneos框架后,內核適配、驅動框架增加了代碼量,運行效率也存在一定損失。對網絡modem相關的操作,oneos使用AT通信,其阻塞方式對原有應用邏輯存在較大影響,不如原始API便捷。

3、系統組件

3.1 編譯器關鍵字

重點介紹section關鍵字,后續章節都與其有關,section主要作用是將函數或者變量放在指定段中,可在指定的地方取函數執行。

  1. //main.c   
  2. //section demo   
  3. #include "stdio.h"   
  4.     
  5. int __attribute__((section("my_fun"))) test1(int a,int b)   
  6. {   
  7.  return (a+b);   
  8.  
  9. int test(int b)   
  10. {   
  11.  return 2*b;   
  12.  
  13. int __attribute__((section("my_fun"))) test0(int a,int b)   
  14. {   
  15.  return (a*b);   
  16. }   
  17.     
  18. int __attribute__((section("my_val"))) chengi;   
  19. int __attribute__((section("my_val"))) chengj;   
  20.     
  21. int main(void)   
  22. {   
  23.  int sum,c,j;     
  24.  chengi=1,chengj=2;   
  25.     
  26.  sum=test1(chengi,chengj);   
  27.  c=test(100);   
  28.  j=test0(chengi,chengj);   
  29.         
  30.   printf("sum=%d,c=%d,j=%d\r\n",sum,c,j);   
  31.  
  32.   return 0;   
  33. }   

編譯生成map文件:

  1. gcc -o main.exe main.c -Wl,-Map,my_test.map 

my_test.map 文件片段如下:

  1. .text  0x00401460 0xa0 C:\Users\think\ccmGLaeH.o0x00401460 test0x0040146a main 
  2. .text 0x00401500 0x0 c:/mingw/bin/../libmingw32.a(CRTglob.o) 
  3. ...... my_fun 0x00404000 0x200 [!provide] PROVIDE (___start_my_fun, .) 
  4. my_fun  0x00404000 0x1c C:\Users\think\ccmGLaeH.o 
  5. 0x00404000 test10x0040400d test0 
  6. [!provide] PROVIDE (___stop_my_fun, .) 
  7. .data 0x00405000 0x200 
  8. 0x00405000 _data_start_ = . ...... *(.data_cygwin_nocopy) my_val 0x00406000 0x200 
  9. [!provide] PROVIDE (___start_my_val, .) 
  10. my_val  0x00406000 0x8 C:\Users\think\ccdMcTrl.o0x00406000    chengi0x00406004 chengj 
  11. [!provide] PROVIDE (___stop_my_val, .) 
  12. .rdata 0x00407000 0x400 

分析可見,使用section修飾的函數和變量在自定義的片段,而且是連續存放,這樣可根據變量的地址得出與其同段變量的地址,為后續自動初始化等功能提供了基礎。

3.2 自動初始化

基于前面section的作用,可以將同類函數指針全部使用同一個段名修飾,然后開機后系統自動檢索段內函數指針,逐個執行,對上層應用就是無需主動調用,系統自動初始化。考慮到硬件初始化與應用功能初始化的先后順序,可以對段名進行分配,map文件按段名排序。自動初始化主體是OS_INIT_EXPORT宏。

  1. typedef os_err_t (*os_init_fn_t)(void); 
  2.  
  3. #define OS_INIT_EXPORT(fn, level) \ 
  4. const os_init_fn_t __os_call_##fn OS_SECTION(".init_call."level) = fn 
  5.  
  6. #define OS_BOARD_INIT(fn) OS_INIT_EXPORT(fn, "1"
  7.  
  8. #define OS_PREV_INIT(fn) OS_INIT_EXPORT(fn, "2"
  9.  
  10. #define OS_DEVICE_INIT(fn) OS_INIT_EXPORT(fn, "3"
  11.  
  12. #define OS_CMPOENT_INIT(fn) OS_INIT_EXPORT(fn, "4"
  13.  
  14. #define OS_ENV_INIT(fn) OS_INIT_EXPORT(fn, "5"
  15.  
  16. #define OS_APP_INIT(fn) OS_INIT_EXPORT(fn, "6"

例如shell初始化函數,定義如下:

  1. OS_APP_INIT(sh_system_init); 

將宏定義展開

  1. /* 含義是函數指針 __os_call_sh_system_init 
  2. *  其指向sh_system_init函數,且該指針編譯后放在".init_call.6"段 
  3. */ 
  4. const os_init_fn_t __os_call_sh_system_init 
  5.     __attribute__((section((".init_call.6")))) = sh_system_init 

系統自身也有自定義函數,用來標記起止點函數

  1. OS_INIT_EXPORT(os_init_start, "0"); 
  2. OS_INIT_EXPORT(os_board_init_start, "0.end"); 
  3. OS_INIT_EXPORT(os_board_init_end, "1.end"); 
  4. OS_INIT_EXPORT(os_init_end, "6.end"); 

最終生成的map文件如下圖:

//系統底層在合適的時機調用如下兩函數,將指定段區間內的所有函數自動執行

  1. //系統底層在合適的時機調用如下兩函數,將指定段區間內的所有函數自動執行 
  2.  
  3. void os_board_auto_init(void) 
  4.     const os_init_fn_t *fn_ptr_board_init_start; 
  5.     const os_init_fn_t *fn_ptr_board_init_end; 
  6.     const os_init_fn_t *fn_ptr; 
  7.  
  8.     fn_ptr_board_init_start = &__os_call_os_board_init_start + 1; 
  9.     fn_ptr_board_init_end   = &__os_call_os_board_init_end - 1; 
  10.  
  11.     for (fn_ptr = fn_ptr_board_init_start; fn_ptr <= fn_ptr_board_init_end; fn_ptr++) 
  12.     { 
  13.         (void)(*fn_ptr)(); 
  14.     } 
  15.  
  16.     return
  17.  
  18. static void os_other_auto_init(void) 
  19.     const os_init_fn_t *fn_ptr_other_init_start; 
  20.     const os_init_fn_t *fn_ptr_other_init_end; 
  21.     const os_init_fn_t *fn_ptr; 
  22.  
  23.     fn_ptr_other_init_start = &__os_call_os_board_init_end + 1; 
  24.     fn_ptr_other_init_end   = &__os_call_os_init_end - 1; 
  25.  
  26.     for (fn_ptr = fn_ptr_other_init_start; fn_ptr <= fn_ptr_other_init_end; fn_ptr++) 
  27.     { 
  28.         (void)(*fn_ptr)(); 
  29.     } 
  30.  
  31.     return

系統執行os_other_auto_init時實現了sh_system_init的自動執行,即使應用層沒有顯示的去調用它。使用符號段的方式實現初始化函數自動執行,應用層修改軟件,增加功能啟動或者裁剪,對底層代碼無需任何改動。

3.3 設備框架

3.3.1 設備模型

一般HAL包括GPIO、UART、ADC等,每個設備節點的類型和控制接口、參數個數及含義完全不同,即使都是GPIO,不同原廠提供的接口也各不相同。設備框架就是在底層封裝原始API,然后統一注冊到設備節點表,使用時獲取節點及其對應的操作接口,這樣應用層的代碼在風格上比較統一。

應用層需要操作設備時,根據名稱查找設備,再使用該提供的API進行操作,無需關注該設備具體對應的端口、狀態等細節信息;其風格與linux驅動接近。

3.3.2 設備注冊

以I2C設備為例:

  1. #define OS_DEVICE_INFO static OS_SECTION("device_table") const  os_device_info_t 
  2.  
  3. OS_DEVICE_INFO asr1603_i2c1_device = { 
  4.  .name = "i2c1"
  5.  .driver = "ASR1603_I2C_DRIVER"
  6.  .info = OS_NULL, 
  7. }; 
  8.  
  9.  OS_DEVICE_INFO asr1603_i2c2_device = { 
  10.  .name = "i2c2"
  11.  .driver = "ASR1603_I2C_DRIVER"
  12.  .info = OS_NULL, 
  13. }; 

所有的設備信息存在device_table段,只是分配設備驅動類型和名稱。

  1. OS_DRIVER_INFO asr1603_i2c_driver = { 
  2.  .name = "ASR1603_I2C_DRIVER"
  3.  .probe = asr1603_i2c_probe, //I2C設備初始化和注冊 
  4. }; 
  5.  
  6. OS_DRIVER_DEFINE(asr1603_i2c_driver, "2"); 
  7.  
  8. #define OS_DRIVER_DEFINE(_driver_, sequence)            \ 
  9.     static os_err_t __driver_##_driver_##_init(void)    \ 
  10.     {                                                   \ 
  11.         return driver_match_devices(&_driver_);         \ 
  12.     }                                                   \ 
  13.     OS_INIT_EXPORT(__driver_##_driver_##_init, sequence
  14. //OS_INIT_EXPORT即為前面提到的開機自啟動定義宏 

開機后自動執行_asr1603_i2c_driver_driver__init,也就是自動將device_table段設備對應的驅動程序asr1603_i2c_probe自動執行,實現了所有設備的初始化,

  1. static int asr1603_i2c_probe(const os_driver_info_t *drv, const os_device_in 
  2.                              fo_t *dev) 
  3.     ... 
  4.  //所有的 I2C 設備(一種設備有多個)進行初始化 
  5.     if(!strcmp(dev->name"i2c1")) 
  6.     { 
  7.         g_i2c1.id = ASR1603_DEV_I2C1; 
  8.         i2c_p = &g_i2c1; 
  9.     } 
  10.     else if(!strcmp(dev->name"i2c2")) 
  11.     { 
  12.         g_i2c2.id = ASR1603_DEV_I2C2; 
  13.         i2c_p = &g_i2c2; 
  14.     } 
  15.     .... 
  16.  
  17.     asr1603_wrap_i2c_init(i2c_p->id); 
  18.  
  19.     i2c_p->i2c_bus.ops = &i2c_bus_ops; //底層操作 I2C 的接口,與實際硬件綁定 
  20.     i2c_p->i2c_bus.priv = i2c_p; 
  21.  
  22.     ret = os_i2c_bus_device_register(&(i2c_p->i2c_bus), dev->name, OS_DEVICE 
  23.                                      _FLAG_RDWR, &(i2c_p->i2c_bus)); 
  24.  
  25.     return ret; 

os_i2c_bus_device_register將I2C設備注冊到系統設備列表os_device_list,包括其對外接口i2c_ops。

  1. struct os_device_ops 
  2.     os_err_t  (*init)   (os_device_t *dev); 
  3.     os_err_t  (*open)   (os_device_t *dev, os_uint16_t oflag); 
  4.     os_err_t  (*close)  (os_device_t *dev); 
  5.     os_size_t (*read)   (os_device_t *dev, os_off_t pos, void *buffer, os_size_t size); 
  6.     os_size_t (*write)  (os_device_t *dev, os_off_t pos, const void *buffer, os_size_t size); 
  7.     os_err_t  (*control)(os_device_t *dev, os_int32_t cmd, void *args); 
  8. }; 

所有設備對外提供接口都類似,部分不支持的為NULL,風格和linux設備驅動一致,這些接口是封裝前面i2c_bus_ops提供的硬件特有驅動,這樣完成了I2C設備框架與硬件驅動綁定以及自動初始化。

3.3.3 框架應用

應用層使用I2C設備:

  1. os_device_find("i2c1"); 

獲取成功后,正常流程是使用i2c_ops提供的接口操作設備,實際調用也基于i2c_bus_ops封裝的接口,可見oneos也不太標準;最佳操作可以參考UART的用法。

3.4 模組連接套件

模組連接套件 Molink (Module link kit),設備通過AT與網絡模組交互的接口,內置基帶的使用虛擬AT通道。

Molink對單片機加模組的方案非常合適,對內置基帶的芯片,反而影響效率,因為其AT是阻塞方式實現,例如掃描周圍wifi熱點,會導致當前task阻塞幾秒鐘,這樣處理只是為統一API接口,實現MCU+模組和內置基帶兩種硬件方案的應用代碼無縫遷移。

名稱高大上,其實就是開機初始化一個大數組,在module_asr1603_create(),不同作用的AT分類,封裝AT收發、解析接口。

使用mo-link先獲取數組中對應項,使用其支持的API操作AT指令,以阻塞方式運行。對于ASR1603內置基帶的,socket沒有使用AT方式,而是LWIP接口,這種效率高。

3.5 Shell工具

和linux中shell類似,以命令行觸發函數運行,在shell控制口,默認是OS_CONSOLE_DEVICE_NAME輸入命令,shell task會解析并自動掃描內部函數表,執行函數后輸出回應,將結果顯示在控制終端上。

Shell對軟件調試非常方便,例如調試I2C接口,只需定義:

  1. SH_CMD_EXPORT(test, test_i2c, "test i2c api"); 

開機后串口輸入test字符串,設備即運行test_i2c()函數,其原理如下:

  1. #define SH_CMD_EXPORT(cmd, func, desc)      SH_FUNCTION_EXPORT_CMD(func, __cmd_##cmd, desc
  2.  
  3. #define SH_FUNCTION_EXPORT_CMD(func, cmd, desc)                         \ 
  4.     const char __fsym_##cmd##_name[] = #cmd;                            \ 
  5.     const char __fsym_##cmd##_desc[] = desc;                            \ 
  6.     OS_USED const sh_syscall_t __fsym_##cmd OS_SECTION("FSymTab") =     \ 
  7.     {                                                                   \ 
  8.         __fsym_##cmd##_name,                                            \ 
  9.         __fsym_##cmd##_desc,                                            \ 
  10.         (syscall_func_t)func                                            \ 
  11.     }; 

SH_CMD_EXPORT宏將前面i2c提供的參數轉換,在FsymTab段創建一個名為__fsym___cmd_test的結構體,其3個成員分別是字符名,描述和函數體。

  1. OS_APP_INIT(sh_system_init); 

開機自啟動sh_system_init,創建gs_shell_task任務,接收shell控制口的字符數據,滿足一定條件后進入sh_exec,搜索FsymTab段區間變量名,sh_get_cmd_func找到對應函數再執行。

shell工具便于調試,調試復雜功能注意棧空間;但其在數據安全方面存在較大隱患,且占用獨立的task和串口,浪費硬件資源,正式發布的軟件務必關閉。

3.6 單元測試

類比assert的作用,判斷條件為假時觸發異常,單元測試與其類似,統計判斷結果導致報告。OneOS 開發的單元測試框架atest(and test),和網上開源的差不多。

  1. #define ATEST_TC_EXPORT(name, testcase, init, cleanup, priority)                            \ 
  2.     OS_USED static const atest_tc_entry_t gs_atest##testcase OS_SECTION("AtestTcTab") =     \ 
  3.     {                                                                                       \ 
  4.         #name,                                                                              \ 
  5.         init,                                                                               \ 
  6.         testcase,                                                                           \ 
  7.         cleanup,                                                                            \ 
  8.         priority                                                                            \ 
  9.     }; 

其原理就是軟件自動執行某一段代碼,將運行結果和期望值進行比較并統計,對軟件質量的檢測效果,取決于單元測試用例的設計水平。該功能與平臺無關,適用于新平臺首次使用時測試API。

4、 Python開發

基于前面shell的原理,可以按輸入的字符串執行與之綁定的函數,如果對字符串進行一定的規則定義,支持自動解析執行,即可實現函數按提供的文本執行。這套文本規則就是python語法,解析器就是MicroPython內核,這樣就能實現在嵌入式平臺使用python開發。

MicroPython對軟件進行天然的分層,嚴格區分驅動層和應用層,實現應用軟件的跨平臺移植。Oneos集成的就是開源的MicroPython,其源碼下載地址是:https://github.com/micropython/micropython

OneOS-MicroPython開發環境:VsCode+NODE+Pymakr ,其中.mpy文件混淆加密的工具在MicroPython源碼mpy-cross中自行編譯。

短期內Python不會成為嵌入式的主流開發語言,但掌握其基礎也有大有裨益。

 

責任編輯:武曉燕 來源: 嵌入式系統
相關推薦

2020-06-18 10:03:22

操作系統物聯網中國移動

2012-03-31 16:48:15

移動廣告芒果網

2009-08-10 09:46:06

中國移動Mobile

2009-08-12 09:29:09

中國移動Mobile

2009-07-03 14:31:51

云計算云存儲

2009-08-20 18:45:03

中國移動Mobile

2009-07-06 14:42:48

Mocha BSM中國移動摩卡軟件

2009-07-28 16:38:47

TCAT華為中國移動

2009-08-17 18:29:50

2013-05-30 17:57:25

銳捷網絡中國移動WLAN

2014-10-09 13:30:08

釣魚短信釣魚中國移動

2013-04-02 10:25:45

移動互聯網網絡發展無線網絡

2013-11-06 21:15:39

中國移動愛“心”行動

2015-07-13 14:21:55

中國移動A1體驗

2009-05-04 09:14:33

谷歌中國移動侵權

2012-03-19 10:56:28

點贊
收藏

51CTO技術棧公眾號

中文字幕一区二区在线播放| 极品少妇一区二区三区| 在线观看日韩电影| 亚洲精蜜桃久在线| www夜片内射视频日韩精品成人| 国产精品www.| 亚洲欧美日韩直播| 污污的网站免费| 1区2区3区在线| 国产欧美视频一区二区| 91久久极品少妇xxxxⅹ软件| www.com国产| 91精品国产乱码久久久久久久 | 成人香蕉社区| 欧美日韩一区二区在线观看视频| 一卡二卡三卡视频| 一级日本在线| 97国产精品videossex| 成人a级免费视频| 99热国产在线观看| 午夜久久久久| 色婷婷**av毛片一区| 国产精品300页| 国产美女亚洲精品7777| 欧美视频日韩视频| 狠狠干 狠狠操| 成年人黄视频在线观看| 国产欧美日韩三区| 久久伊人一区二区| 亚洲成人一二三区| 精久久久久久久久久久| 国产脚交av在线一区二区| 精品午夜福利在线观看| 91精品91| 日韩在线中文视频| 在线视频第一页| 亚洲永久精品唐人导航网址| 亚洲成人黄色在线| 亚洲美女高潮久久久| 一级欧美视频| 欧美日韩免费观看一区二区三区| 91成人在线观看喷潮教学| caopo在线| 亚洲丝袜自拍清纯另类| 亚洲欧美日韩国产成人综合一二三区| 黄色av免费在线看| 久久综合狠狠综合久久综合88 | 精品女同一区二区三区| 精品一区二区三区在线视频| 国产精品第一第二| 成人免费毛片视频| 三级影片在线观看欧美日韩一区二区| 欧美日韩成人在线观看| 久久久精品视频免费观看| 欧美成人激情| 久久夜色精品亚洲噜噜国产mv| 亚洲熟女少妇一区二区| 日韩免费在线| 久久精品亚洲94久久精品| 国产在线观看免费视频软件| 久久大综合网| 不用播放器成人网| 欧产日产国产v| 欧美一区不卡| 久久久久久久久久久人体| 国产亚洲精品久久777777| 影音先锋久久| 欧美怡春院一区二区三区| 成人免费毛片视频| 另类综合日韩欧美亚洲| 91日韩在线视频| 午夜精品久久久久久久第一页按摩| 国产电影一区在线| 黄色91av| 成人亚洲性情网站www在线观看| 国产精品嫩草99a| 成年丰满熟妇午夜免费视频| 9999精品成人免费毛片在线看| 精品欧美国产一区二区三区| 丝袜制服一区二区三区| www.久久久.com| 精品99999| 公侵犯人妻一区二区三区| 日韩理论在线| 欧美激情影音先锋| 久久99国产综合精品免费| 免费看日韩精品| 99久热re在线精品视频| 九色视频网站在线观看| 亚洲色图20p| 男人插女人视频在线观看| 五月激情久久| 日韩情涩欧美日韩视频| yjizz视频| 精品欧美激情在线观看| 欧美日本亚洲视频| 好吊色在线视频| 国产成人综合自拍| 日韩色妇久久av| wwwav在线| 色婷婷国产精品综合在线观看| 福利片一区二区三区| 成人在线tv视频| 最近2019年中文视频免费在线观看| 欧美性猛交xxxxx少妇| 国产精品综合| 99国产在线| 超碰97在线免费观看| 亚洲在线观看免费| 精品亚洲一区二区三区四区| 国产suv精品一区| 日韩在线www| 亚洲精品男人的天堂| 国产福利电影一区二区三区| 日韩亚洲一区在线播放| av在线私库| 欧美一级国产精品| 免费看的黄色录像| 老鸭窝毛片一区二区三区| 91网免费观看| 男女啪啪在线观看| 在线免费av一区| 国产十八熟妇av成人一区| 91久久国产| 国产免费观看久久黄| 你懂的视频在线免费| 亚洲一区二区欧美激情| 婷婷中文字幕在线观看| 欧美日韩中文字幕一区二区三区| 性色av一区二区三区免费| 国产福利第一视频| 中文字幕中文乱码欧美一区二区| 欧美aⅴ在线观看| 日韩黄色网络| 久久久久久久91| 99在线精品视频免费观看软件 | 欧美人与禽zozzo禽性配| 蜜桃视频第一区免费观看| 美国av一区二区三区| 成人av影院在线观看| 日韩亚洲欧美综合| 国产一区二区播放| 国产乱码一区二区三区| 在线无限看免费粉色视频| 国产a亚洲精品| 中文字幕亚洲国产| 亚洲天堂网视频| 国产精品嫩草久久久久| 亚洲成人福利在线| 久久免费大视频| 国产啪精品视频| 日本在线人成| 91精品国产高清一区二区三区蜜臀| 99国产精品免费| 美女免费视频一区二区| 一区二区三区四区欧美| 91精品亚洲一区在线观看| 日韩一区二区三区国产| 国产视频第一页| 一区二区理论电影在线观看| 国产a√精品区二区三区四区| 好看的日韩av电影| 国产精品一级久久久| 日韩伦理在线一区| 亚洲夜晚福利在线观看| 久草热在线观看| 最新热久久免费视频| 国产高清av片| 亚洲精品麻豆| 欧美一区二区三区四区夜夜大片| 电影亚洲一区| 久久影院中文字幕| 欧美一区二区公司| 色综合久久久久| 黑人と日本人の交わりビデオ| 寂寞少妇一区二区三区| 99re6这里有精品热视频| 国产精品巨作av| 日韩免费观看视频| 免费av毛片在线看| 精品国产露脸精彩对白| 国产一区二区视频网站| 国产精品对白交换视频| 亚洲一二三四五| 久久久久国产精品一区三寸| 亚洲精品高清视频| 亚洲国产高清在线观看| 奇米四色中文综合久久| 久久99精品久久久久久野外| 亚洲电影免费观看高清完整版在线| 激情五月婷婷网| 亚洲另类在线制服丝袜| 日本aaa视频| 国产电影精品久久禁18| 日韩视频在线免费看| 欧美在线亚洲| 日本成人三级电影网站| 色妞ww精品视频7777| 奇米四色中文综合久久| 先锋成人av| 一区二区福利视频| 好吊视频一二三区| 欧美伊人久久久久久午夜久久久久| a级片在线观看免费| 国产亚洲一区二区在线观看| 日本泡妞xxxx免费视频软件| 日韩二区三区在线观看| 国产中文字幕乱人伦在线观看| 精品视频黄色| 国产专区一区二区| 国产精品日本一区二区三区在线 | av在线com| 久久香蕉国产| 欧美一区二区三区成人久久片| 日韩在线观看一区二区三区| 国产精品久久久久av| 中文字幕在线看片| 欧美福利视频网站| 欧美私人网站| 亚洲少妇激情视频| 手机看片一区二区| 日韩视频不卡中文| 97精品人妻一区二区三区在线| 色综合久久久网| 黄色片免费观看视频| 亚洲一区免费在线观看| 老司机成人免费视频| 日本一区二区三区四区| jizz欧美性20| 99在线视频精品| 久草视频福利在线| 国产精品一二三四区| 亚洲18在线看污www麻豆| 久久人人精品| 国内外成人激情视频| 亚洲第一黄色| 成人在线播放网址| 欧美日韩 国产精品| 日韩精品一区二区三区电影| 91欧美大片| 中文字幕黄色大片| 91视频精品| 日日噜噜噜夜夜爽爽| 欧美肥老太太性生活| 亚洲一区在线直播| 欧美在线电影| 亚洲精品一区二区三区四区五区 | 欧美一级欧美一级| 国产精品大片免费观看| 欧美一区二区三区综合| 最新欧美人z0oozo0| av动漫在线免费观看| 欧美日韩国产精品一区二区亚洲| 黄色网络在线观看| 欧美国产专区| 男女激情免费视频| 国产综合激情| 男人日女人bb视频| 久久精品30| 天天干天天爽天天射| 狠狠色狠狠色综合| 天天爽夜夜爽视频| 成人小视频免费在线观看| 日本少妇xxxx| 国产日韩欧美电影| 最新日韩免费视频| 一区二区三区四区国产精品| 精品无码人妻一区二区三区| 欧美天堂在线观看| 波多野结衣绝顶大高潮| 欧美精品久久天天躁| www.日日夜夜| 日韩精品在线视频| 1769在线观看| 欧美精品第一页在线播放| 爱情电影社保片一区| 国产精品入口夜色视频大尺度| 深夜日韩欧美| 国产在线播放一区二区| 神马久久一区二区三区| 热这里只有精品| 亚洲人成久久| 污污的网站免费| caoporm超碰国产精品| 在线观看国产精品一区| 亚洲欧美日韩在线不卡| 久久久精品免费看| 欧美精品在欧美一区二区少妇| 亚洲国产一二三区| 亚洲偷欧美偷国内偷| 羞羞视频在线免费国产| 青草成人免费视频| 国产剧情一区二区在线观看| 免费试看一区| 午夜亚洲福利| 四季av一区二区| www.亚洲人| 久久国产波多野结衣| 精品久久久久久久久国产字幕| 国产精品欧美亚洲| 亚洲男人的天堂网站| 午夜伦理在线视频| 国产精品电影网站| 老汉色老汉首页av亚洲| 中文字幕一区二区三区在线乱码 | 9久久婷婷国产综合精品性色| 国产乱码精品一区二区三区忘忧草| 香蕉网在线播放| 亚洲一区二区三区国产| 国产尤物视频在线观看| 亚洲欧美制服另类日韩| 欧美人体视频xxxxx| 国产精品一区二区性色av| 欧美黑白配在线| 黄色a级片免费看| 极品尤物av久久免费看| 久久亚洲AV无码专区成人国产| 亚洲成a天堂v人片| 国产乱叫456在线| 中文字幕日韩欧美精品在线观看| 国产精品25p| 国产成人精品日本亚洲11 | 日韩第一区第二区| 午夜一区二区三区| 男人的天堂亚洲在线| 国产大学生视频| 伊人色综合久久天天| 国产精品亚洲lv粉色| 中文字幕av一区| 电影天堂国产精品| 欧美日韩成人一区二区三区| 亚洲国内精品| 无码人妻aⅴ一区二区三区玉蒲团| 日韩一区欧美一区| 一区二区精品视频在线观看| 伊人伊成久久人综合网小说| 欧美电影h版| 免费在线一区二区| 99在线精品视频在线观看| 国产精品熟妇一区二区三区四区| 亚洲精品成人精品456| 999免费视频| 不卡av在线网站| 中文字幕亚洲在线观看| 成人在线免费高清视频| 国产成人99久久亚洲综合精品| 懂色av懂色av粉嫩av| 欧美一区二区在线视频| av在线free| 超碰国产精品久久国产精品99| 欧美午夜影院| 欧美日韩一区二区三区四区五区六区| 亚洲综合视频在线| 亚洲乱码在线观看| 久久免费视频网站| 欧美国产极品| 美女一区二区三区视频| 国产精品美女www爽爽爽| 国产永久免费视频| 色综合视频网站| 国产精品巨作av| 欧美激情成人网| 国产精品伦理一区二区| 国产三级精品在线观看| 欧美人与物videos| 日本欧美韩国国产| 成人在线观看黄| 国产欧美一区二区在线| 一级做a爱片性色毛片| 欧美精品在线极品| 欧美性生活一级片| 天堂av在线网站| 亚洲黄一区二区三区| 色婷婷激情五月| 国产精品白嫩初高中害羞小美女 | 国产三级精品在线| 国产精品老熟女视频一区二区| 欧美激情xxxx性bbbb| 亚洲制服欧美另类| 中文字幕在线观看日| 亚洲在线视频免费观看| 免费在线黄色网址| 成人激情视频小说免费下载| 尤物在线精品| 国产精品国产三级国产专业不| 3d成人h动漫网站入口| 久草在线资源站手机版| 亚洲成人一区二区三区| 国产成人av福利| 日本成人一级片| 欧美激情中文字幕乱码免费| 国语产色综合| 女人扒开腿免费视频app| 欧美日韩中文在线观看| 巨大荫蒂视频欧美另类大| 久久精品五月婷婷| 精品亚洲porn| 99精品人妻国产毛片| 欧美精品午夜视频| 久久91麻豆精品一区|