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

鴻蒙輕內核M核源碼分析系列五-時間管理

系統
文章由鴻蒙社區產出,想要了解更多內容請前往:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com

[[398138]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 在鴻蒙輕內核源碼分析上一篇文章中,我們剖析了中斷的源碼,簡單提到了Tick中斷。本文會繼續分析Tick和時間相關的源碼,給讀者介紹鴻蒙輕內核的時間管理模塊。

時間管理模塊以系統時鐘為基礎,可以分為2部分,一部分是SysTick中斷,為任務調度提供必要的時鐘節拍;另外一部分是,給應用程序提供所有和時間有關的服務,如時間轉換、統計功能。

系統時鐘是由定時器/計數器產生的輸出脈沖觸發中斷產生的,一般定義為整數或長整數。輸出脈沖的周期叫做一個“時鐘滴答”,也稱為時標或者Tick。Tick是操作系統的基本時間單位,由用戶配置的每秒Tick數決定。如果用戶配置每秒的Tick數目為1000,則1個Tick等于1ms的時長。另外一個計時單位是Cycle,這是系統最小的計時單位。Cycle的時長由系統主時鐘頻率決定,系統主時鐘頻率就是每秒鐘的Cycle數,對于216 MHz的CPU,1秒產生216000000個cycles。

用戶以秒、毫秒為單位計時,而操作系統以Tick為單位計時,當用戶需要對系統進行操作時,例如任務掛起、延時等,此時可以使用時間管理模塊對Tick和秒/毫秒進行轉換。

下面,我們剖析下時間管理模塊的源代碼,若涉及開發板部分,以開發板工程targets\cortex-m7_nucleo_f767zi_gcc\為例進行源碼分析。

1、時間管理初始化和啟動

我們先看下時間管理模塊的相關配置,然后再剖析如何初始化,如何啟動。

1.1 時間管理相關的配置

時間管理模塊涉及3個配置項,系統時鐘OS_SYS_CLOCK、每秒Tick數目LOSCFG_BASE_CORE_TICK_PER_SECOND兩個配置選項,還有宏LOSCFG_BASE_CORE_TICK_HW_TIME。LOSCFG_BASE_CORE_TICK_HW_TIME默認關閉,開啟時,需要提供定制函數VOID platform_tick_handler(VOID),在Tick中斷處理函數中執行定制操作。這些配置項在模板開發板工程目錄的文件target_config.h中定義,如文件targets\cortex-m7_nucleo_f767zi_gcc\target_config.h中定義如下:

  1. #define OS_SYS_CLOCK                                        96000000 
  2. #define LOSCFG_BASE_CORE_TICK_PER_SECOND                    (1000UL) 
  3. #define LOSCFG_BASE_CORE_TICK_HW_TIME                       0 

 1.2 時間管理初始化和啟動

函數INT32 main(VOID)會調用kernel\src\los_init.c中的函數UINT32 LOS_Start(VOID)啟動系統,該函數會調用啟動調度函數UINT32 HalStartSchedule(OS_TICK_HANDLER handler)。源碼如下:

  1. LITE_OS_SEC_TEXT_INIT UINT32 LOS_Start(VOID) 
  2.     return HalStartSchedule(OsTickHandler); 

 函數UINT32 HalTickStart(OS_TICK_HANDLER *handler)定義在kernel\arch\arm\cortex-m7\gcc\los_context.c,源碼如下。其中函數參數為Tick中斷處理函數OsTickHandler(),后文會分析該tick中斷處理函數。⑴處代碼繼續調用函數進一步調用函數HalTickStart(handler)來設置Tick中斷啟動。⑵處會調用匯編函數HalStartToRun開始運行系統,后續任務調度系列再詳細分析該匯編函數。

  1. LITE_OS_SEC_TEXT_INIT UINT32 HalStartSchedule(OS_TICK_HANDLER handler) 
  2.     UINT32 ret; 
  3. ⑴  ret = HalTickStart(handler); 
  4.     if (ret != LOS_OK) { 
  5.         return ret; 
  6.     } 
  7. ⑵  HalStartToRun(); 
  8.     return LOS_OK; /* never return */ 

 函數HalTickStart(handler)定義在文件kernel\arch\arm\cortex-m7\gcc\los_timer.c,源碼如下,我們分析下函數的代碼實現。⑴處校驗下時間管理模塊的配置項的合法性。在開啟宏LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT時,會使用系統定義的中斷。會執行⑵處的代碼,調用定義在文件kernel\arch\arm\cortex-m7\gcc\los_interrupt.c中的函數OsSetVector()設置中斷向量,該函數在中斷系列會詳細分析。⑶處設置全局變量g_sysClock為系統時鐘,g_cyclesPerTick為每tick對應的cycle數目,g_ullTickCount初始化為0,表示系統tick中斷發生次數。⑷處調用定義在targets\cortex-m7_nucleo_f767zi_gcc\Drivers\CMSIS\Include\core_cm7.h文件中的內聯函數uint32_t SysTick_Config(uint32_t ticks),初始化、啟動系統定時器Systick和中斷。

  1. WEAK UINT32 HalTickStart(OS_TICK_HANDLER *handler) 
  2.     UINT32 ret; 
  3.  
  4. ⑴  if ((OS_SYS_CLOCK == 0) || 
  5.         (LOSCFG_BASE_CORE_TICK_PER_SECOND == 0) || 
  6.         (LOSCFG_BASE_CORE_TICK_PER_SECOND > OS_SYS_CLOCK)) { 
  7.         return LOS_ERRNO_TICK_CFG_INVALID; 
  8.     } 
  9.  
  10. #if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1) 
  11. #if (OS_HWI_WITH_ARG == 1) 
  12.     OsSetVector(SysTick_IRQn, (HWI_PROC_FUNC)handler, NULL); 
  13. #else 
  14. ⑵  OsSetVector(SysTick_IRQn, (HWI_PROC_FUNC)handler); 
  15. #endif 
  16. #endif 
  17.  
  18. ⑶  g_sysClock = OS_SYS_CLOCK; 
  19.     g_cyclesPerTick = OS_SYS_CLOCK / LOSCFG_BASE_CORE_TICK_PER_SECOND; 
  20.     g_ullTickCount = 0; 
  21.  
  22. ⑷  ret = SysTick_Config(g_cyclesPerTick); 
  23.     if (ret == 1) { 
  24.         return LOS_ERRNO_TICK_PER_SEC_TOO_SMALL; 
  25.     } 
  26.  
  27.     return LOS_OK; 

 1.3 Tick中斷處理函數OsTickHandler()

文件kernel\src\los_tick.c定義的函數VOID OsTickHandler(VOID),是時間管理模塊中執行最頻繁的函數,每當Tick中斷發生時就會調用該函數。我們分析下該函數的源碼,⑴處如果開啟宏LOSCFG_BASE_CORE_TICK_HW_TIME,會調用定制的tick處理函數platform_tick_handler(),默認不開啟。⑵處會更新全局變量g_ullTickCount,⑶處如果開啟宏LOSCFG_BASE_CORE_TIMESLICE,會檢查當前運行任務的時間片,在后續任務模塊會詳細分析下函數OsTimesliceCheck()。⑷處會遍歷任務的排序鏈表,檢查是否有超時的任務。⑸處如果支持定時器特性,會檢查定時器是否超時。

源碼如下:

  1. LITE_OS_SEC_TEXT VOID OsTickHandler(VOID) 
  2. #if (LOSCFG_BASE_CORE_TICK_HW_TIME == 1) 
  3. ⑴  platform_tick_handler(); 
  4. #endif 
  5.  
  6. ⑵  g_ullTickCount++; 
  7.  
  8. #if (LOSCFG_BASE_CORE_TIMESLICE == 1) 
  9. ⑶  OsTimesliceCheck(); 
  10. #endif 
  11.  
  12. ⑷   OsTaskScan();  // task timeout scan 
  13.  
  14. #if (LOSCFG_BASE_CORE_SWTMR == 1) 
  15. ⑸  (VOID)OsSwtmrScan(); 
  16. #endif 

 2、LiteOS內核時間管理常用操作

時間管理提供下面幾種功能,時間轉換、時間統計等,這些函數定義在文件kernel\src\los_tick.c,我們剖析下這些操作的源代碼實現。

2.1 時間轉換操作

2.1.1 毫秒轉換成Tick

函數UINT32 LOS_MS2Tick(UINT32 millisec)把輸入參數毫秒數UINT32 millisec可以轉化為Tick數目。代碼中OS_SYS_MS_PER_SECOND,即1秒等于1000毫秒。時間轉換也比較簡單,知道一秒多少Tick,除以OS_SYS_MS_PER_SECOND,得出1毫秒多少Tick,然后乘以millisec,計算出Tick數目的結果值并返回。

  1. LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MS2Tick(UINT32 millisec) 
  2.     if (millisec == OS_NULL_INT) { 
  3.         return OS_NULL_INT; 
  4.     } 
  5.  
  6.     return ((UINT64)millisec * LOSCFG_BASE_CORE_TICK_PER_SECOND) / OS_SYS_MS_PER_SECOND; 

 2.1.2 Tick轉化為毫秒

函數UINT32 LOS_Tick2MS(UINT32 tick)把輸入參數Tick數目轉換為毫秒數。時間轉換也比較簡單,ticks數目除以每秒多少Tick數值LOSCFG_BASE_CORE_TICK_PER_SECOND,計算出多少秒,然后轉換成毫秒,計算出結果值并返回。

  1. LITE_OS_SEC_TEXT_MINOR UINT32 LOS_Tick2MS(UINT32 ticks) 
  2.     return ((UINT64)ticks * OS_SYS_MS_PER_SECOND) / LOSCFG_BASE_CORE_TICK_PER_SECOND; 

 2.1.3 Cycle數目轉化為毫秒

介紹轉換函數之前,先看下一個CpuTick結構體,結構體比較簡單,就2個成員,分別表示一個UINT64類型數據的高、低32位數值。

  1. typedef struct tagCpuTick { 
  2.     UINT32 cntHi; /* < 一個64位數值的高32位 */ 
  3.     UINT32 cntLo; /* < 一個64位數值的低32位 */ 
  4. } CpuTick; 

 繼續看轉換函數OsCpuTick2MS(),它可以把CpuTick類型表示的cycle數目轉換為對應的毫秒數,輸出毫秒數據的高、低32位數值。看下具體的代碼,⑴處校驗參數是否為空指針,⑵處檢查系統時鐘是否配置。⑶處把CpuTick結構體表示的cycle數目轉化為UINT64類型數據。⑷處進行數值計算,(DOUBLE)g_sysClock / OS_SYS_MS_PER_SECOND得到每毫秒多少個cycle數,然后和tmpCpuTick做除法運算,得到cycle數目對應的毫秒數目。⑸處把DOUBLE類型轉換為UINT64類型,然后執行⑹,分別把結果數值的高、低64位賦值給*msLo、*msHi。

  1. LITE_OS_SEC_TEXT_INIT UINT32 OsCpuTick2MS(CpuTick *cpuTick, UINT32 *msHi, UINT32 *msLo) 
  2.     UINT64 tmpCpuTick; 
  3.     DOUBLE temp
  4.  
  5. ⑴  if ((cpuTick == NULL) || (msHi == NULL) || (msLo == NULL)) { 
  6.         return LOS_ERRNO_SYS_PTR_NULL; 
  7.     } 
  8.  
  9. ⑵  if (g_sysClock == 0) { 
  10.         return LOS_ERRNO_SYS_CLOCK_INVALID; 
  11.     } 
  12. ⑶  tmpCpuTick = ((UINT64)cpuTick->cntHi << OS_SYS_MV_32_BIT) | cpuTick->cntLo; 
  13. ⑷  temp = tmpCpuTick / ((DOUBLE)g_sysClock / OS_SYS_MS_PER_SECOND); 
  14.  
  15.     tmpCpuTick = (UINT64)temp
  16.  
  17.     *msLo = (UINT32)tmpCpuTick; 
  18.     *msHi = (UINT32)(tmpCpuTick >> OS_SYS_MV_32_BIT); 
  19.  
  20.     return LOS_OK; 

 2.1.4 Cycle數目轉化為微秒

轉換函數OsCpuTick2US(),它可以把CpuTick類型表示的cycle數目轉換為對應的毫秒數,輸出毫秒數據的高、低32位數值。該函數和OsCpuTick2MS()類似,自行閱讀即可。

  1. LITE_OS_SEC_TEXT_INIT UINT32 OsCpuTick2US(CpuTick *cpuTick, UINT32 *usHi, UINT32 *usLo) 
  2.     UINT64 tmpCpuTick; 
  3.     DOUBLE temp
  4.  
  5.     if ((cpuTick == NULL) || (usHi == NULL) || (usLo == NULL)) { 
  6.         return LOS_ERRNO_SYS_PTR_NULL; 
  7.     } 
  8.  
  9.     if (g_sysClock == 0) { 
  10.         return LOS_ERRNO_SYS_CLOCK_INVALID; 
  11.     } 
  12.     tmpCpuTick = ((UINT64)cpuTick->cntHi << OS_SYS_MV_32_BIT) | cpuTick->cntLo; 
  13.     temp = tmpCpuTick / ((DOUBLE)g_sysClock / OS_SYS_US_PER_SECOND); 
  14.  
  15.     tmpCpuTick = (UINT64)temp
  16.  
  17.     *usLo = (UINT32)tmpCpuTick; 
  18.     *usHi = (UINT32)(tmpCpuTick >> OS_SYS_MV_32_BIT); 
  19.  
  20.     return LOS_OK; 

 2.2 時間統計操作

2.2.1 獲取每個Tick等于多少Cycle數

函數UINT32 LOS_CyclePerTickGet(VOID)計算1個tick等于多少cycle。g_sysClock系統時鐘表示1秒多少cycle,LOSCFG_BASE_CORE_TICK_PER_SECOND一秒多少tick,相除計算出1 tick多少cycle數,即g_cyclesPerTick = g_sysClock / LOSCFG_BASE_CORE_TICK_PER_SECOND。

  1. LITE_OS_SEC_TEXT_MINOR UINT32 LOS_CyclePerTickGet(VOID) 
  2.     return g_cyclesPerTick; 

 2.2.2 獲取自系統啟動以來的Tick數

UINT64 LOS_TickCountGet(VOID)函數計算自系統啟動以來的Tick中斷的次數。需要注意,在關中斷的情況下不進行計數,不能作為準確時間使用。每次Tick中斷發生時,在函數VOID OsTickHandler(VOID)中會更新g_ullTickCount數據。

  1. LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID) 
  2.     return g_ullTickCount; 

 2.2.3 獲取系統時鐘

UINT32 LOS_SysClockGet(VOID)函數獲取配置的系統時鐘。

  1. UINT32 LOS_SysClockGet(VOID) 
  2.     return g_sysClock; 

 2.2.4 獲取系統啟動以來的Cycle數

函數VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo)定義在文件kernel\arch\arm\cortex-m7\gcc\los_timer.c中,該函數獲取系統啟動以來的Cycle數。返回結果按高、低32位的無符號數值UINT32 *cntHi, UINT32 *cntLo分別返回。

我們看下該函數的源碼。先關中斷,然后⑴處獲取啟動啟動以來的Tick數目。⑵處通過讀取當前值寄存器SysTick Current Value Register,獲取hwCycle。⑶處表示中斷控制和狀態寄存器Interrupt Control and State Register的第TICK_CHECK位為1時,表示掛起systick中斷,tick沒有計數,需要加1校準。⑷處根據swTick、g_cyclesPerTick和hwCycle計算出自系統啟動以來的Cycle數。⑸處獲取Cycle數的高、低32位的無符號數值,然后開中斷、返回。

  1. LITE_OS_SEC_TEXT_MINOR VOID HalGetCpuCycle(UINT32 *cntHi, UINT32 *cntLo) 
  2.     UINT64 swTick; 
  3.     UINT64 cycle; 
  4.     UINT32 hwCycle; 
  5.     UINTPTR intSave; 
  6.  
  7.     intSave = LOS_IntLock(); 
  8.  
  9. ⑴  swTick = g_ullTickCount; 
  10. ⑵  hwCycle = SysTick->VAL; 
  11.  
  12. ⑶  if ((SCB->ICSR & TICK_CHECK) != 0) { 
  13.         hwCycle = SysTick->VAL; 
  14.         swTick++; 
  15.     } 
  16.  
  17. ⑷  cycle = (((swTick) * g_cyclesPerTick) + (g_cyclesPerTick - hwCycle)); 
  18.  
  19. ⑸  *cntHi = cycle >> SHIFT_32_BIT; 
  20.     *cntLo = cycle & CYCLE_CHECK; 
  21.  
  22.     LOS_IntRestore(intSave); 
  23.  
  24.     return

 小結

本文帶領大家一起剖析了鴻蒙輕內核的時間管理模塊的源代碼。時間管理模塊為任務調度提供必要的時鐘節拍,會向應用程序提供所有和時間有關的服務,如時間轉換、統計、延遲功能。后續也會陸續推出更多的分享文章,敬請期待,為了更容易找到鴻蒙輕內核代碼倉,建議訪問 https://gitee.com/openharmony/kernel_liteos_m ,謝謝。

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-06-04 09:57:49

鴻蒙HarmonyOS應用

2022-01-12 10:50:23

鴻蒙HarmonyOS應用

2022-01-10 15:31:44

鴻蒙HarmonyOS應用

2022-03-03 18:28:28

Harmony進程任務管理模塊

2022-03-11 20:23:14

鴻蒙源碼分析進程管理

2021-10-20 16:08:57

鴻蒙HarmonyOS應用

2021-05-25 09:28:34

鴻蒙HarmonyOS應用

2021-05-17 09:28:59

鴻蒙HarmonyOS應用

2021-06-04 14:15:10

鴻蒙HarmonyOS應用

2021-05-31 20:30:55

鴻蒙HarmonyOS應用

2022-04-13 11:02:12

鴻蒙事件模塊事件Event

2021-05-11 09:54:55

鴻蒙HarmonyOS應用

2021-06-09 09:48:01

鴻蒙HarmonyOS應用

2021-05-27 09:43:56

鴻蒙HarmonyOS應用

2021-05-21 09:25:11

鴻蒙HarmonyOS應用

2021-07-06 09:45:03

鴻蒙HarmonyOS應用

2021-09-22 14:36:32

鴻蒙HarmonyOS應用

2022-03-31 16:26:49

鴻蒙源碼分析進程管理

2021-05-12 09:45:20

鴻蒙HarmonyOS應用

2022-01-14 08:39:47

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術棧公眾號

免播放器亚洲| 国产亚洲欧美日韩精品一区二区三区 | 美女撒尿一区二区三区| 成人啪啪18免费游戏链接| 国产不卡人人| 国产精品久久久久影院亚瑟| 国产精品乱码视频| 中文字幕久久熟女蜜桃| 国产精品大片免费观看| 亚洲日本欧美中文幕| 九九九久久久久久久| 欧美日韩电影免费看| 亚洲猫色日本管| 日韩成人av网站| 一级黄色片在线看| 国产精品腿扒开做爽爽爽挤奶网站| 日韩一级黄色av| 无遮挡aaaaa大片免费看| 91精品在线免费视频| 欧美视频在线免费看| 欧美少妇在线观看| 高清性色生活片在线观看| 国产91综合网| 国产日韩欧美一二三区| 17婷婷久久www| 亚洲av无码一区二区三区观看 | 国产日本欧美在线观看| 日本一级一片免费视频| 一本一本久久a久久综合精品| 亚洲欧美国产日韩天堂区| 中文字幕亚洲日本| 免费日韩成人| 你懂的在线看| 日本在线不卡视频| 午夜精品久久久久久99热| 天天操天天摸天天舔| 西瓜成人精品人成网站| 精品国产91洋老外米糕| 一区二区三区四区毛片| 国产韩日精品| 国产精品久久久久久久免费观看 | 成人影视在线播放| 99视频在线精品| caoporn国产精品免费公开| jizz国产在线| 首页亚洲欧美制服丝腿| 91高清视频免费| 日本三级黄色大片| 国产精品99免费看| 欧美精品做受xxx性少妇| 三级黄色在线观看| 色天天久久综合婷婷女18| 在线视频免费一区二区| 亚洲综合欧美综合| 欧美久久综合网| 亚洲一二在线观看| 日韩中文字幕有码| 日韩欧美在线视频播放| 亚洲日本va午夜在线电影| 5858s免费视频成人| 日韩在线一区视频| 免费欧美网站| 亚洲精品一区二区三区精华液| 麻豆免费在线观看视频| 成人福利一区| 日韩风俗一区 二区| 熟女俱乐部一区二区视频在线| 秋霞蜜臀av久久电影网免费| 国产丝袜一区二区三区免费视频| 亚洲欧美色图视频| 激情综合网站| 最近2019中文字幕大全第二页| 久久久精品少妇| 最新国产精品久久久| 欧美黄色性视频| 午夜精品久久久久久久久久久久久蜜桃 | 韩国v欧美v亚洲v日本v| 亚洲伊人第一页| 成人午夜福利视频| 久久综合久久综合九色| 亚洲精品日韩成人| 在线电影福利片| 福利视频一区二区| 中文字幕永久视频| 久久wwww| 亚洲精品永久免费| 疯狂撞击丝袜人妻| 亚洲精品护士| 国产日韩欧美成人| 欧美 日韩 人妻 高清 中文| 久久精品日产第一区二区三区高清版| 亚洲蜜桃av| 神马午夜伦理不卡| 久久porn| 精品国产乱码久久| 无码人妻精品一区二区中文| 一区二区蜜桃| 欧美制服第一页| 国产精品久久久久久久久久久久久久久久久久 | 午夜不卡影院| 制服丝袜日韩国产| 国产麻豆天美果冻无码视频| 久久精品影视| 日韩美女免费视频| 亚洲免费成人网| 国产精品视频看| 欧美久久久久久久久久久久久| 日本午夜精品久久久久| 亚洲精品wwwww| 成人在线观看高清| 日韩专区中文字幕一区二区| 国产亚洲自拍偷拍| av免费网站在线观看| 91久久香蕉国产日韩欧美9色| 催眠调教后宫乱淫校园| 亚洲国产精品91| 国产成人av网址| 天天操天天干天天| 一区二区三区鲁丝不卡| 奇米影视四色在线| 久久91麻豆精品一区| 久久人人爽人人爽人人片av高清| 一级做a爱片久久毛片| 久久久99免费| 又粗又黑又大的吊av| 亚洲第一二区| 黄色免费成人| 美女福利精品视频| 国产真人无遮挡作爱免费视频| 狠狠色丁香久久婷婷综合_中| 久久久福利视频| 国产精品专区在线| 97超碰在线免费| 4438x成人网最大色成网站| 色呦呦一区二区| 国产综合自拍| 91香蕉国产在线观看| 视频福利在线| 亚洲一二三四久久| 亚洲妇熟xx妇色黄蜜桃| jvid福利在线一区二区| 日本在线观看天堂男亚洲| 欧美在线 | 亚洲| 亚洲精品国产第一综合99久久| 在线观看高清免费视频| 在线日韩一区| 久久久久久久久久久国产| 亚洲av综合色区无码一二三区| 中文一区二区完整视频在线观看 | 久久久免费看片| 乱码第一页成人| 蜜桃久久影院| 亚洲精品动漫| 日韩av影片在线观看| 粉嫩aⅴ一区二区三区| 成人免费视频一区二区| a天堂资源在线观看| 人人九九精品视频| 欧美成人免费播放| 好吊色一区二区三区| 亚洲尤物在线视频观看| 自拍视频第一页| 欧美日韩mv| 成人欧美一区二区三区视频xxx| www在线看| 精品国产凹凸成av人导航| 国产亚洲自拍av| 99麻豆久久久国产精品免费| 日韩av三级在线| 亚洲国产国产| 国产成人欧美在线观看| 成年人视频网站在线| 777色狠狠一区二区三区| 91嫩草|国产丨精品入口| 丁香五精品蜜臀久久久久99网站 | 亚洲狠狠婷婷综合久久久久图片| 岛国大片在线观看| 91网上在线视频| 成人小视频在线看| 天天综合亚洲| 国产精品一区二区三区免费| www.超碰在线| 一本色道久久88综合亚洲精品ⅰ | 日韩欧美综合在线| 日韩免费一二三区| 久久综合色之久久综合| jizzzz日本| 国产精品久久久久久久| 麻豆久久久av免费| 色综合久久久| 欧美激情欧美狂野欧美精品| 神马午夜精品95| 色就色 综合激情| 欧美大片xxxx| 波多野结衣91| 久久久久久三级| 精品一区二区三区在线| 国产91亚洲精品一区二区三区| 免费h在线看| www.久久久久久.com| 亚洲AV无码成人片在线观看 | 精品国产www| 亚洲视频一区二区在线| 国产真实乱人偷精品| 日本不卡123| 奇米影视亚洲色图| 国产一区国产二区国产三区| 3d动漫精品啪啪一区二区三区免费| 7777kkk亚洲综合欧美网站| 亚洲男人天堂手机在线| 国产极品久久久| 色94色欧美sute亚洲线路一久 | 国产精品久久久久久久久久久久久 | 亚洲综合图片网| 亚洲黄色录像片| 91中文字幕永久在线| 国产精品影视在线观看| 欧美牲交a欧美牲交aⅴ免费下载| 欧美一区国产在线| 日韩欧美在线电影| 成人av婷婷| 91久久在线视频| 国产精品久久久久久久久夜色| 亚洲激情在线| 亚洲日本欧美在线| 五月综合久久| 成人在线观看网址| 成人国产精品久久| 国产噜噜噜噜噜久久久久久久久| 捆绑调教日本一区二区三区| 久久久精品一区| 国产高清av在线| 亚洲激情视频在线观看| 欧美一级一区二区三区| 日韩午夜电影在线观看| 国产精品久久久久久久久久久久久久久久 | 成人看片网页| 97国产精品人人爽人人做| 伊人222成人综合网| 日韩中文在线中文网在线观看| 亚洲av片一区二区三区| 亚洲电影天堂av| av中文在线观看| 日韩精品一区二区三区蜜臀| 88av在线视频| 精品视频在线看| 影音先锋国产资源| 欧美性色黄大片手机版| 亚洲精品一区二三区| 欧美日韩国产中文精品字幕自在自线| 久久久一二三区| 一区二区免费在线| 欧美性猛交xxxxx少妇| 亚洲日本在线看| 国产精品免费在线视频| 亚洲欧美另类小说| 午夜剧场免费在线观看| 亚洲精品你懂的| 妖精视频在线观看免费| 久久综合久久综合亚洲| 亚洲天堂av中文字幕| 国产免费久久精品| 欧美老女人性生活视频| 国产精品欧美一区喷水| 日韩欧美视频免费观看| 国产精品视频在线看| 黑人と日本人の交わりビデオ| 亚洲国产精品二十页| 亚洲欧洲综合网| 亚洲一二三区在线观看| 国产奶水涨喷在线播放| 偷拍日韩校园综合在线| 99国产精品白浆在线观看免费| 另类视频一区二区三区| 亚洲字幕一区二区| 韩国三级成人在线| 国产精品综合久久久久久| 女仆av观看一区| 日本一区视频在线播放| 久久中文字幕av| 日韩一级特黄毛片| 日韩视频三区| 日韩一级片播放| 激情综合一区二区三区| 亚洲精品在线网址| 成人黄色av电影| 西西444www无码大胆| 欧美激情综合在线| 国产高清视频免费在线观看| 亚洲综合久久av| 国产原创视频在线| 懂色av影视一区二区三区| 在线亚洲欧美日韩| 精品少妇一区二区三区视频免付费 | 国产亚洲va综合人人澡精品| xxxxx99| 亚洲mv大片欧洲mv大片精品| 国产高清中文字幕| 欧美男生操女生| 日韩在线视频观看免费| 精品国产欧美成人夜夜嗨| 蜜臀av在线播放| 国产精品va在线| 日韩三级av高清片| 神马影院午夜我不卡影院| 91精品一区国产高清在线gif | 在线观看美女网站大全免费| 久久久久久久久久久久av| 成人日韩精品| 成人欧美一区二区三区视频xxx| 精品国产午夜| 欧美日韩激情四射| 日本不卡不码高清免费观看| 亚洲午夜久久久久久久久| 中文一区二区完整视频在线观看| 日本少妇xxxx动漫| 欧美日韩一区二区三区高清| 国产91绿帽单男绿奴| 日韩在线免费av| 日韩在线免费| 九色视频成人porny| 伊人青青综合网| 成人性做爰aaa片免费看不忠| 91亚洲男人天堂| 丰满少妇被猛烈进入一区二区| 理论不卡电影大全神| 亲子乱一区二区三区电影| 日本伊人久久| 青少年xxxxx性开放hg| 国产精品久久久久久久免费软件 | 日韩精品――中文字幕| 欧美一级午夜免费电影| 日韩av中文| 欧洲亚洲免费视频| 日韩欧美四区| 久艹视频在线免费观看| 国产精品亚洲成人| 精品99在线观看| 欧美高清激情brazzers| 国产小视频福利在线| 97在线看福利| 窝窝社区一区二区| 欧美极品欧美精品欧美| 成人一级片网址| 久久高清内射无套| 91精品国产一区二区人妖| 国产在线激情| 成人国产精品免费视频| 在线观看日韩| 永久看看免费大片| 亚洲猫色日本管| 国产又大又黑又粗| 久久视频在线看| 在线日韩三级| 在线观看亚洲视频啊啊啊啊| 日韩国产高清在线| 精品无人区无码乱码毛片国产| 欧美性猛交xxxx偷拍洗澡| 三级视频在线播放| 国产成人福利视频| 欧美精品系列| 国产无遮挡猛进猛出免费软件| 中文字幕中文乱码欧美一区二区 | 日韩av一区二区在线影视| 中文字幕网站在线观看| 欧美在线视频日韩| 日本成人在线播放| 成人性色av| 极品裸体白嫩激情啪啪国产精品| 亚洲午夜久久久久久久久| 精品日本美女福利在线观看| 欧美新色视频| 国产成人精品av| 国产成人久久| 国产精品久久久久久9999| 一区二区三区在线观看欧美| 亚洲乱码精品久久久久..| 午夜精品视频在线| 亚洲人成精品久久久| 91人人澡人人爽人人精品| 欧美国产禁国产网站cc| www黄色网址| 日韩美女在线播放| 91日韩免费| 在线观看国产网站| 欧美亚洲免费在线一区| 福利视频在线| 欧美一区观看| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲欧美色图片| 中文成人在线| 日韩在线观看a| 国产性做久久久久久| 国产高清视频免费| 欧美亚洲国产视频| 在线电影一区二区| 丰腴饱满的极品熟妇| 91麻豆精品国产综合久久久久久| 欧美激情网站| 热这里只有精品|