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

MCU上的代碼執行時間

開發 開發工具
測量代碼部分的實際執行時間可以幫助找到代碼中的熱點。本文將說明如何可以方便地測量和顯示在基于Cortex-M MCU的實時執行時間。

在許多實時應用程序中,二八原則并不生效,CPU 可以花費95%(或更多)的時間在不到5% 的代碼上。電動機控制、引擎控制、無線通信以及其他許多對時間敏感的應用程序都是如此。這些嵌入式系統通常是用c編寫的,而且開發人員常常被迫對代碼進行手工優化,可能會回到匯編語言,以滿足性能的需求。測量代碼部分的實際執行時間可以幫助找到代碼中的熱點。本文將說明如何可以方便地測量和顯示在基于Cortex-M MCU的實時執行時間。

測量代碼的執行時間

測量代碼執行時間的方法有很多。作為一個嵌入式工程師,經常使用一個或多個數字輸出和一個示波器。需要在執行要監視的代碼之前設置一個高的輸出,然后將輸出降低。當然,在做這些之前有相當多的設置工作: 找到一個或多個自由輸出,確保它們可以輕松訪問,將端口配置為輸出,編寫代碼,編譯,設置范圍等等。一旦有了一個信號,你可能需要對它進行一段時間的監視,以便看到最小值和***值。 數字存儲示波器使這個過程更容易,但是還有其他更簡單的方法。

另一種測量執行時間的方法是使用可跟蹤調試接口。只需要運行代碼,查看跟蹤,計算 delta時間(通常是手動的) ,并將CPU周期轉換為微秒。不幸的是,這個跟蹤給了一個執行的實例,可能不得不在追蹤捕獲中進一步查找最壞情況下的執行時間。這是一個乏味的過程。

Cortex-M 周期計數器

在大多數Cortex-M的處理器中調試端口包含一個32位的自由運行計數器,它可以計算 CPU 的時鐘周期。計數器是 Debug 觀察和跟蹤(DWT)模塊的一部分,可以很容易地用于測量代碼的執行時間。下面的代碼是啟用和初始化這個特性非常有用。

  1. #define  ARM_CM_DEMCR      (*(uint32_t *)0xE000EDFC) 
  2.  
  3. #define  ARM_CM_DWT_CTRL   (*(uint32_t *)0xE0001000) 
  4.  
  5. #define  ARM_CM_DWT_CYCCNT (*(uint32_t *)0xE0001004) 
  6.  
  7.  
  8. if (ARM_CM_DWT_CTRL != 0) {        // See if DWT is available 
  9.  
  10.     ARM_CM_DEMCR      |= 1 << 24;  // Set bit 24 
  11.  
  12.     ARM_CM_DWT_CYCCNT  = 0; 
  13.  
  14.     ARM_CM_DWT_CTRL   |= 1 << 0;   // Set bit 0 
  15.  

使用DWT周期計數器來測量代碼執行時間

可以通過在目標代碼之前和之后讀取周期計數器的值來測量和計算代碼段的執行時間,如下所示。 當然,這意味著必須設置代碼,但能夠得到一個非常準確的值。

  1. uint32_t  start; 
  2.  
  3. uint32_t  stop; 
  4.  
  5. uint32_t  delta; 
  6.  
  7.  
  8. start = ARM_CM_DWT_CYCCNT; 
  9.  
  10. // Code to measure 
  11.  
  12. stop  = ARM_CM_DWT_CYCCNT; 
  13.  
  14. delta = stop – start; 

因為使用的是無符號運算,delta表示所測量代碼的實際執行時間(CPU 時鐘周期)。

在測量開始和停止讀數之間的代碼執行時間時,可能會發生中斷,所以每次執行這個序列很可能會有不同的值。在這種情況下,可能希望在測量過程中禁用中斷,但是要清楚禁用中斷是暫時的,只用于測量。盡管如此,也許應該把中斷的任務包括進來,因為它們會影響到代碼的***執行時間。

  1. Disable Interrupts; 
  2.  
  3. start = ARM_CM_DWT_CYCCNT; 
  4.  
  5. // Code to measure 
  6.  
  7. stop  = ARM_CM_DWT_CYCCNT; 
  8.  
  9. Enable Interrupts; 
  10.  
  11. delta = stop – start; 

如果所測代碼包含條件語句、循環或任何可能導致變化的東西,那么獲得的值可能不代表最壞情況下的執行時間。為了糾正這個問題,需要添加一個峰值檢測器,如下圖所示。當然,在進行任何測量之前,需要將 max 聲明并初始化為最小值(即0)。

  1. start = ARM_CM_DWT_CYCCNT; 
  2.  
  3. // Code to measure 
  4.  
  5. stop  = ARM_CM_DWT_CYCCNT; 
  6.  
  7. delta = stop – start; 
  8.  
  9. if (max < delta) { 
  10.  
  11.     max = delta; 
  12.  

同樣,知道最短執行時間也是有趣且有用的 在進行任何測量之前,只需要聲明和初始化***可能值(即0xFFFFFFFF)。下面是新的代碼: ``` tart = ARMCMDWT_CYCCNT;

  1. // Code to measure 
  2.  
  3. stop = ARMCMDWT_CYCCNT; 
  4.  
  5. delta = stop – start; 
  6.  
  7. if (max < delta) { 
  8.  
  9. max = delta; 
  10.  
  11. if (min > delta) { 
  12.  
  13. min = delta; 

} ``` 就像 Cortex-M4處理器和 Cortex-M7那樣,執行時間還取決于CPU是否配備了緩存。如果系統中使用了指令或數據緩存,對同一段代碼的多重測量可能不一致。這時,可以考慮禁用緩存以測量最壞的情況。

大多數調試器允許顯示這些變量值。如果是這樣,則需要在全局范圍內聲明顯示變量,以保留它們的值并允許實時監控。不幸的是,這些值代表的是CPU時鐘周期,而且大多數調試器還不夠成熟,無法為了顯示目的而對變量進行縮放。假設一個16兆赫的CPU時鐘速度,顯示70.19微秒比顯示1123個周期要方便得多。實際上還有一種更好的方法來顯示這些變量,這也提供了規模化能力,可以以一種更加可讀的形式看待它們。

經過的時間模塊

當然,可以將代碼片段嵌入到應用程序中,但還可以可以使用一個簡單的模塊。 elapsedtime.c與elapsedtime.h,它僅由4個函數組成。

方法如下:

  1. 按照慣例,#include 
  2. 在使用elapsedtime.c 中的其他函數之前,調用 elapsedtime_init()
  3. 通過設置"ELAPSEDTIMEMAX_SECTIONS"來定義時間測量結構的***數目。這與用 stop/start代碼包裝的不同代碼段相對應
  4. 調用elapsedtimestart()并傳遞要監視的代碼片段的索引(即0 到ELAPSEDTIMEMAX_SECTIONS-1)
  5. 調用elapsedtimestop()并傳遞在運行時啟動時所使用的相同索引
  6. 如果調試器允許監視變量(即當目標正在運行時) ,則可以顯示elapsedtimetbl[],并查看對應索引的運行時間結構
  7. 重復執行步驟4到6,并將代碼置于最壞和***的情況下,以便ELAPSED_TIME數據結構中的Min 和max 字段可以很好地表示所測量代碼片段的執行時間

需要注意的是, 沒有在測量過程中禁用中斷,因為ISR可能會涉及到,也需要了解這會如何影響感知的執行時間。

  1. void  main (void) 
  2.  
  3.     // Some code 
  4.  
  5.     elapsed_time_init();         // Iitialize the module 
  6.  
  7.     // Some code 
  8.  
  9.  
  10. void  MyCode (void) 
  11.  
  12.     // Some code here 
  13.  
  14.     elapsed_time_start(0);    // Start measurement of code snippet #0 
  15.  
  16.     // Code being measured 
  17.  
  18.     elapsed_time_stop(0);     // Stop and 
  19.  
  20.     // Some other code 
  21.  

當然,最小和***的執行時間取決于測量的頻率,以及代碼是否分別受到***和最差條件的限制。

另外,沒有必要顯示起始字段,因為它只用于在測量開始時記錄DWT周期計數器的值,然而,啟動字段可以用來顯示出來。換句話說,當看到這個值變化時,就會知道測量正在發生。

使用 uc / probe 的示例顯示

使用了elapsed_time.c 和 uc/probe,來測量一下代碼片段的執行時間。

圖1| IAR 和 uc/probe 的樹視圖

圖1顯示了使用IAR的LiveWatch (左)和 uc / probe 的樹視圖(右)。截圖是在不同的時間拍攝的,是一個存儲不同代碼片段的測量值的數組。

可以將min/max/current分配給計量表和數字指示器,如圖2所示。CPU 運行在80mhz,這些值以微秒顯示,應用了0.0125的縮放因子。左側的按鈕用于重置統計數據,從而迫使重新計算最小值和***值。

圖2 | 使用uc/probe 的儀表顯示***執行時間

Uc/probe 的一個強大特性是能夠與微軟的 Excel 對接,從而在電子表格中顯示這些值(實時) ,如圖3所示。

圖3 | 使用 Excel 顯示實時數據

小結

作為嵌入式開發人員,有許多工具可以用來測試和驗證設計。對于代碼執行時間,可以很容易地使用 Cortex-M 處理器眾多特性中的一個,即DWT周期計數器。

uc/probe 提供了很多功能,允許使用計量表、儀表盤、數字指示器、 Excel界面或圖表來監控應用程序中的許多變量。通過內置的示波器功能,一旦觸發條件滿足,還可以捕獲多達7個額外變量值。

附錄代碼

elapsed_time.c

  1. #include  <stdint.h> 
  2. #include  <elapsed_time.h> 
  3.  
  4. /* 
  5. ******************************************************************************** 
  6. *                           CORTEX-M - DWT TIMER 
  7. ******************************************************************************** 
  8. */ 
  9.  
  10. #define  ARM_CM_DEMCR      (*(uint32_t *)0xE000EDFC) 
  11. #define  ARM_CM_DWT_CTRL   (*(uint32_t *)0xE0001000) 
  12. #define  ARM_CM_DWT_CYCCNT (*(uint32_t *)0xE0001004) 
  13.  
  14. /* 
  15. ******************************************************************************** 
  16. *                             Data Structure 
  17. ******************************************************************************** 
  18. */ 
  19.  
  20. typedef  struct  elapsed_time { 
  21.     uint32_t  start; 
  22.     uint32_t  current
  23.     uint32_t  max
  24.     uint32_t  min
  25. } ELAPSED_TIME; 
  26.  
  27. /* 
  28. ******************************************************************************** 
  29. *                      STORAGE FOR ELAPSED TIME MEASUREMENTS 
  30. ******************************************************************************** 
  31. */ 
  32.  
  33. static  ELAPSED_TIME  elapsed_time_tbl[ELAPSED_TIME_MAX_SECTIONS]; 
  34.  
  35. /* 
  36. ******************************************************************************** 
  37. *                              MODULE INITIALIZATION 
  38. * Note(s): Must be called before any of the other functions in this module 
  39. ******************************************************************************** 
  40. */ 
  41.  
  42. void  elapsed_time_init (void)          
  43.     uint32_t  i; 
  44.      
  45.      
  46.     if (ARM_CM_DWT_CTRL != 0) {                  // See if DWT is available 
  47.         ARM_CM_DEMCR      |= 1 << 24;            // Set bit 24 
  48.         ARM_CM_DWT_CYCCNT  = 0;                 
  49.         ARM_CM_DWT_CTRL   |= 1 << 0;             // Set bit 0 
  50.     } 
  51.     for (i = 0; i < ELAPSED_TIME_MAX_SECTIONS; i++) { 
  52.         elapsed_time_clr(i); 
  53.     } 
  54.  
  55. /* 
  56. ******************************************************************************** 
  57. *                  START THE MEASUREMENT OF A CODE SECTION 
  58. ******************************************************************************** 
  59. */ 
  60.  
  61. void  elapsed_time_start (uint32_t  i)   
  62.     elapsed_time_tbl[i].start = ARM_CM_DWT_CYCCNT; 
  63.  
  64. /* 
  65. ******************************************************************************** 
  66. *           STOP THE MEASUREMENT OF A CODE SECTION AND COMPUTE STATS 
  67. ******************************************************************************** 
  68. */ 
  69.  
  70. void  elapsed_time_stop (uint32_t  i)   
  71.     uint32_t       stop;  
  72.     ELAPSED_TIME  *p_tbl; 
  73.      
  74.  
  75.     stop           = ARM_CM_DWT_CYCCNT;    
  76.     p_tbl          = &elapsed_time_tbl[i]; 
  77.     p_tbl->current = stop - p_tbl->start; 
  78.     if (p_tbl->max < p_tbl->current) { 
  79.         p_tbl->max = p_tbl->current
  80.     } 
  81.     if (p_tbl->min > p_tbl->current) { 
  82.         p_tbl->min = p_tbl->current
  83.     } 
  84.  
  85. /* 
  86. ******************************************************************************** 
  87. *                      CLEAR THE MEASUREMENTS STATS 
  88. ******************************************************************************** 
  89. */ 
  90.  
  91. void  elapsed_time_clr (uint32_t  i)          
  92.     ELAPSED_TIME  *p_tbl; 
  93.      
  94.      
  95.     p_tbl          = &elapsed_time_tbl[i]; 
  96.     p_tbl->start   = 0; 
  97.     p_tbl->current = 0; 
  98.     p_tbl->min     = 0xFFFFFFFF; 
  99.     p_tbl->max     = 0; 
  100. elapsed_time.h 
  101.  
  102. /* 
  103. ******************************************************************************** 
  104. *                       MODULE TO MEASURE EXECUTION TIME 
  105. ******************************************************************************** 
  106. */ 
  107.  
  108. /* 
  109. ******************************************************************************** 
  110. *                MAXIMUM NUMBER OF ELAPSED TIME MEASUREMENT SECTIONS 
  111. ******************************************************************************** 
  112. */ 
  113.  
  114. #define  ELAPSED_TIME_MAX_SECTIONS  10 
  115.  
  116. /* 
  117. ******************************************************************************** 
  118. *                             FUNCTION PROTOTYPES 
  119. ******************************************************************************** 
  120. */ 
  121.  
  122. void  elapsed_time_clr   (uint32_t  i);      // Clear measured values 
  123. void  elapsed_time_init  (void);             // Module initialization 
  124. void  elapsed_time_start (uint32_t  i);      // Start measurement  
  125. void  elapsed_time_stop  (uint32_t  i);      // Stop  measurement  

參考文獻

https://www.micrium.com/ucprobe/about/

https://www.iar.com/iar-embedded-workbench/

https://www.arm.com/products/processors/cortex-m

【本文來自51CTO專欄作者“老曹”的原創文章,作者微信公眾號:喔家ArchiSelf,id:wrieless-com】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2021-02-24 11:44:35

語言計算函數嵌入式系統

2020-07-14 08:17:26

代碼執行時間

2009-11-26 11:05:44

PHP計算頁面執行時間

2010-09-08 15:00:03

SQL語句執行

2024-05-10 08:44:53

C#軟件開發優化代碼

2011-05-17 13:32:04

oracle

2023-01-27 15:28:04

開發Python內存

2010-11-18 15:53:30

Oracle語句執行時

2010-09-06 13:17:19

SQL Server語句

2010-04-28 12:33:36

Oracle自定義函數

2024-04-12 07:50:40

Python監控利器Time 模塊

2025-01-16 07:00:00

AOPSpringBoot后端

2024-07-03 13:51:02

SQL毛刺數據庫

2019-08-28 07:45:45

數據存儲層多線程

2020-08-03 16:00:31

Linux命令進程

2018-11-22 09:15:45

Linux命令進程

2021-11-05 07:47:55

API計算任務

2020-12-25 08:52:53

SQLMysql 數據庫

2012-01-10 10:44:36

字符串

2020-12-04 11:00:18

MySQL執行時間執行計劃
點贊
收藏

51CTO技術棧公眾號

国产精品专区一| 亚洲国产免费av| 8x8x华人在线| 日韩在线观看视频一区二区三区| 一区二区三区精品视频在线观看| 亚洲精品少妇网址| 中文字幕国产高清| 成人免费高清观看| 91色porny在线视频| 国产在线视频欧美| 亚洲免费激情视频| 五月天综合网站| 亚洲精品二三区| 欧美午夜精品理论片| jizz内谢中国亚洲jizz| 亚洲欧美日韩久久| 激情视频一区二区| 97超视频在线观看| 亚洲精品国产日韩| 久久久国产成人精品| a级一a一级在线观看| 欧美jizz18| 亚洲一区二区三区四区的| 日韩福利影院| 视频在线不卡| 国产精品影视在线观看| 国产精品igao视频| 久久露脸国语精品国产91| 欧美电影一二区| 亚洲老司机av| 五月天激情小说| 欧美经典影片视频网站| 欧美日韩精品三区| 1024av视频| 岛国片av在线| 亚洲精品国产a久久久久久| 色视频一区二区三区| 亚洲色图欧美视频| 成人免费毛片aaaaa**| 91精品久久久久久久久久久 | 黄色成人在线播放| 天堂а√在线中文在线| 久久99精品久久久久久野外| 国产区在线观看成人精品| 国产日韩一区二区| 国模人体一区二区| 国产高清成人在线| 亚洲a在线播放| 亚洲一区二区激情| 美女脱光内衣内裤视频久久网站 | www黄色av| 欧美乱大交做爰xxxⅹ小说| 欧美freesex8一10精品| 欧美岛国在线观看| 亚洲911精品成人18网站| 国产成人久久精品一区二区三区| 欧美色综合天天久久综合精品| 日日摸日日碰夜夜爽av | 国产精品xxx视频| 国产伦精品一区二区三区视频网站| 亚洲国产日韩欧美一区二区三区| 欧美国产欧美亚洲国产日韩mv天天看完整 | 免费看日b视频| 中文字幕伦理免费在线视频| 亚洲免费在线观看| 日韩专区第三页| 国产精品国精产品一二| 亚洲成av人**亚洲成av**| 国产精品一线二线三线| 久久影院午夜精品| 日韩欧美在线网址| 无需播放器的av| 先锋影音网一区二区| 91精品国产麻豆国产自产在线| 亚洲色图偷拍视频| 伊色综合久久之综合久久| 欧美xxx久久| 国产精品久久久免费观看| 欧美女王vk| 久久久久999| 久久精品国产亚洲AV无码男同 | 巨乳女教师的诱惑| 国产精品流白浆在线观看| 日韩精品久久久久| 农村老熟妇乱子伦视频| 午夜欧美精品| 欧美最近摘花xxxx摘花| 亚洲午夜激情视频| 成人手机在线视频| 久久婷婷国产综合尤物精品| av在线三区| 一区二区三区丝袜| 麻豆av免费在线| 国产精区一区二区| 日韩精品视频在线播放| 国产三级精品三级观看| 91久久亚洲| 国产区精品视频| 空姐吹箫视频大全| 国产精品免费视频一区| 给我免费播放片在线观看| 国产一区二区三区朝在线观看| 欧美一级在线观看| 五月天精品视频| 欧美日韩四区| 国产伦精品免费视频| 蜜桃在线一区二区| 国产精品欧美久久久久无广告| 国产一二三在线视频| 欧美高清影院| 亚洲乱码av中文一区二区| 色在线观看视频| 日本强好片久久久久久aaa| aa成人免费视频| 网友自拍视频在线| 亚洲v日本v欧美v久久精品| 艹b视频在线观看| 网曝91综合精品门事件在线| 九九视频这里只有精品| 中文字幕+乱码+中文乱码www| 国产91精品一区二区麻豆网站| 欧美亚洲另类在线一区二区三区| 午夜羞羞小视频在线观看| 欧美日韩精品一区二区天天拍小说 | 国产欧美一区二区精品婷婷| 老子影院午夜伦不卡大全| 亚洲爽爆av| 中文字幕一精品亚洲无线一区 | 欧美三级华人主播| 男女免费观看在线爽爽爽视频| 欧美性猛交xxxx乱大交退制版 | 少妇人妻偷人精品一区二区| 亚洲青青青在线视频| 美女在线视频一区二区| 国产精品免费不| 91精品国产电影| 日韩在线视频第一页| 一区二区三区高清不卡| www.久久com| 亚洲破处大片| 18成人在线| 黄色大片在线播放| 7777女厕盗摄久久久| a级黄色免费视频| 青青草国产成人99久久| 五码日韩精品一区二区三区视频| 波多野结衣亚洲一二三| 亚洲毛片在线观看.| 特级毛片www| 2014亚洲片线观看视频免费| 色欲av无码一区二区人妻| 丝袜av一区| 日本不卡高字幕在线2019| 日本午夜在线视频| 日韩欧美在线看| 色噜噜噜噜噜噜| 久久99这里只有精品| 久久久国产精华液999999| 国产一区二区三区免费在线| 欧美成人免费在线观看| 亚洲欧美另类一区| 天天综合网天天综合色| 手机免费看av| 精品一区二区影视| 亚洲av综合色区| 福利片一区二区| 欧美亚洲另类视频| 超碰免费在线| 欧美一区二区二区| 在线免费观看毛片| 久久久蜜桃精品| 天天干天天草天天| 欧美高清日韩| 精品免费视频123区| 亚洲wwww| 久久夜色精品国产欧美乱| 性色av蜜臀av| 一本大道综合伊人精品热热| 丁香六月激情综合| 国产经典欧美精品| 亚洲欧洲日产国码无码久久99| 国产探花在线精品一区二区| 91精品视频网站| 多野结衣av一区| 中文字幕久热精品视频在线| 精品国产av 无码一区二区三区| 亚洲国产精品久久人人爱蜜臀| 女同毛片一区二区三区| 麻豆精品新av中文字幕| 97视频在线免费| 日韩精品诱惑一区?区三区| 97久久夜色精品国产九色| 香蕉伊大人中文在线观看| www.午夜精品| 亚洲三区在线播放| 日韩午夜三级在线| 久久亚洲精品石原莉奈| 亚洲最大成人综合| 少妇人妻好深好紧精品无码| 大胆亚洲人体视频| 孩娇小videos精品| 国产午夜精品一区二区三区欧美| 杨幂一区欧美专区| 秋霞蜜臀av久久电影网免费| 成人激情视频免费在线| 毛片无码国产| 久久久久久久久亚洲| 91sp网站在线观看入口| 亚洲国产另类 国产精品国产免费| 国产又粗又猛又爽又黄91| 欧美日韩在线视频观看| 国产97免费视频| 国产欧美日韩久久| 国产精品一区二区入口九绯色| 国内精品久久久久影院一蜜桃| 国语对白做受xxxxx在线中国| 欧美日本不卡高清| 偷拍盗摄高潮叫床对白清晰| 国产一区二区精品福利地址| 韩日午夜在线资源一区二区| 日韩欧美久久| 成人高h视频在线| 日韩免费电影| 91福利视频在线观看| 波多野结依一区| 精品自拍视频在线观看| 美女国产在线| 色噜噜狠狠狠综合曰曰曰88av| 欧美午夜黄色| 日韩久久精品电影| 女人18毛片一区二区三区| 日韩一区二区精品| 国产精品一级视频| 欧美美女一区二区三区| 波多野结衣一二区| 日本道精品一区二区三区| 成人免费视频毛片| 激情亚洲一区二区三区四区| 国产午夜小视频| 亚洲一区二区黄色| 精品无码m3u8在线观看| 亚洲夂夂婷婷色拍ww47| 九九热精彩视频| 亚洲午夜一区二区| 久久久久亚洲天堂| 亚洲午夜日本在线观看| 久久中文字幕无码| 亚洲韩国精品一区| 香蕉免费毛片视频| 欧美日韩国产在线看| 久久久久亚洲AV| 精品久久久香蕉免费精品视频| 国产精品美女毛片真酒店| 婷婷久久综合九色国产成人| 国产情侣自拍av| 一本一道综合狠狠老| 国产字幕在线观看| 欧美性一二三区| 亚洲无码精品在线播放| 日韩欧美在线123| 好吊色视频一区二区| 亚洲精品国产综合久久| 飘雪影院手机免费高清版在线观看 | 狠狠色伊人亚洲综合网站l| 亚洲性夜色噜噜噜7777| 在线视频婷婷| 九九久久久久99精品| 成入视频在线观看| 国产成人午夜视频网址| 麻豆久久久久| 99久久精品免费看国产四区| 国产精品丝袜在线播放| 欧美日产一区二区三区在线观看| 成人羞羞网站入口| 日本精品福利视频| 亚洲少妇诱惑| 日韩在线一区视频| 成人免费毛片片v| 亚洲精品国产精品国自| 玉足女爽爽91| 中文字幕69页| 欧美一区二区国产| 日韩三级电影网| 久久久国产视频| 一个人看的www视频在线免费观看| 国产不卡在线观看| 日本精品一区二区三区在线观看视频| 国产日韩一区二区三区| 99久久.com| 久草资源站在线观看| 国产综合色视频| 插吧插吧综合网| 亚洲精品你懂的| 依依成人综合网| 欧美一区二区美女| 精品亚洲综合| 久久久久久久久电影| 国产亚洲欧美日韩精品一区二区三区| 91久久精品www人人做人人爽| 一区二区三区视频免费观看| 黄色网址在线免费看| 亚洲综合激情| 国产又粗又猛又爽又黄| 国产亚洲一二三区| 国产一级做a爰片在线看免费| 在线免费观看视频一区| 隣の若妻さん波多野结衣| 日韩中文视频免费在线观看| 中文字幕在线免费观看视频| 亚洲伊人第一页| 欧美熟乱15p| 日本韩国欧美在线观看| 国产美女在线观看一区| 国产又黄又粗视频| 婷婷中文字幕综合| 性欧美videos另类hd| 日韩在线精品一区| 偷拍中文亚洲欧美动漫| 国产欧美一区二区三区另类精品 | 亚洲伦理在线观看| 日韩综合视频在线观看| 欧洲av不卡| 精品国产乱码久久久久| 欧美午夜电影在线观看| 四季av一区二区三区| 国产日韩欧美一区二区三区乱码| 日韩精品无码一区二区| 精品卡一卡二卡三卡四在线| 搞黄网站在线观看| 91精品久久久久久久久中文字幕 | 91在线观看污| 久久久久人妻一区精品色欧美| 7777精品伊人久久久大香线蕉的 | 欧美日韩影院| 亚洲精品一区二区18漫画| 亚洲欧美视频在线观看| 一级做a爰片久久毛片16| 综合久久五月天| 国产精品xxx| 亚洲国产一区二区在线| 免费日本视频一区| 免费黄色在线网址| 欧美三级电影一区| av在线播放网站| 国产美女直播视频一区| 久久精品播放| 亚洲色图偷拍视频| 夜夜嗨av一区二区三区网页 | 日韩欧美不卡在线| 成人激情校园春色| 日产电影一区二区三区| 亚洲精品国产欧美| 中文字幕这里只有精品| 欧洲精品在线一区| 日韩av中文字幕一区二区 | 欧美性感美女一区二区| 亚洲精品视频导航| 中文字幕亚洲成人| 国产成人精品一区二区无码呦| 欧美成人精品影院| 一本一道久久a久久| 成人午夜精品久久久久久久蜜臀| 白白色亚洲国产精品| 影音先锋在线国产| 正在播放欧美一区| 999久久久国产999久久久| 毛片在线视频观看| 91免费版在线| 在线免费看av的网站| 欧美另类精品xxxx孕妇| 神马久久影院| 亚洲怡红院在线| 亚洲高清一区二区三区| 欧美日本韩国一区二区| 国产色综合天天综合网| 欧美日韩精选| 国产jjizz一区二区三区视频| 欧美日韩成人综合天天影院| 日本高清在线观看| 久久久久资源| 久久97超碰国产精品超碰| 久草成人在线视频| 亚洲欧美成人网| 国产精品亚洲综合在线观看| 日韩中字在线观看| 国产精品免费免费| 天堂av一区二区三区| 国产视频观看一区| 日韩视频二区| 99久久久免费精品| 亚洲国产精品电影| 欧美美女被草| 国产成人a亚洲精v品无码| 成人欧美一区二区三区1314| 欧美 日韩 中文字幕| 国产欧美日韩精品在线观看| 伊人成人在线| 日本 欧美 国产| 亚洲精品中文字幕有码专区| 激情不卡一区二区三区视频在线|