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

Go語言在極小硬件上的運用(一)

開發 后端
Go 語言,能在多低下的配置上運行并發揮作用呢?我最近購買了一個特別便宜的開發板,我購買它的理由有三個。為了這篇文章,我選用了這一系列中最低配置的開發板,整件事情就變得有趣起來了。

Go語言在極小硬件上的運用(一)

Go 語言,能在多低下的配置上運行并發揮作用呢?

我最近購買了一個特別便宜的開發板:

 

STM32F030F4P6

我購買它的理由有三個。首先,我(作為程序員)從未接觸過 STM320 系列的開發板。其次,STM32F10x 系列使用也有點少了。STM320 系列的 MCU 很便宜,有更新一些的外設,對系列產品進行了改進,問題修復也做得更好了。最后,為了這篇文章,我選用了這一系列中最低配置的開發板,整件事情就變得有趣起來了。

硬件部分

STM32F030F4P6 給人留下了很深的印象:

  • CPU: Cortex M0 48 MHz(最低配置,只有 12000 個邏輯門電路)
  • RAM: 4 KB,
  • Flash: 16 KB,
  • ADC、SPI、I2C、USART 和幾個定時器

以上這些采用了 TSSOP20 封裝。正如你所見,這是一個很小的 32 位系統。

軟件部分

如果你想知道如何在這塊開發板上使用 Go 編程,你需要反復閱讀硬件規范手冊。你必須面對這樣的真實情況:在 Go 編譯器中給 Cortex-M0 提供支持的可能性很小。而且,這還僅僅只是第一個要解決的問題。

我會使用 Emgo,但別擔心,之后你會看到,它如何讓 Go 在如此小的系統上盡可能發揮作用。

在我拿到這塊開發板之前,對 stm32/hal 系列下的 F0 MCU 沒有任何支持。在簡單研究參考手冊后,我發現 STM32F0 系列是 STM32F3 削減版,這讓在新端口上開發的工作變得容易了一些。

如果你想接著本文的步驟做下去,需要先安裝 Emgo

  1. cd $HOME
  2. git clone https://github.com/ziutek/emgo/
  3. cd emgo/egc
  4. go install

然后設置一下環境變量

  1. export EGCC=path_to_arm_gcc # eg. /usr/local/arm/bin/arm-none-eabi-gcc
  2. export EGLD=path_to_arm_linker # eg. /usr/local/arm/bin/arm-none-eabi-ld
  3. export EGAR=path_to_arm_archiver # eg. /usr/local/arm/bin/arm-none-eabi-ar
  4.  
  5. export EGROOT=$HOME/emgo/egroot
  6. export EGPATH=$HOME/emgo/egpath
  7.  
  8. export EGARCH=cortexm0
  9. export EGOS=noos
  10. export EGTARGET=f030x6

更詳細的說明可以在 Emgo 官網上找到。

要確保 egc 在你的 PATH 中。 你可以使用 go build 來代替 go install,然后把 egc 復制到你的 $HOME/bin/usr/local/bin 中。

現在,為你的第一個 Emgo 程序創建一個新文件夾,隨后把示例中鏈接器腳本復制過來:

  1. mkdir $HOME/firstemgo
  2. cd $HOME/firstemgo
  3. cp $EGPATH/src/stm32/examples/f030-demo-board/blinky/script.ld .

最基本程序

main.go 文件中創建一個最基本的程序:

  1. package main
  2.  
  3. func main() {
  4. }

文件編譯沒有出現任何問題:

  1. $ egc
  2. $ arm-none-eabi-size cortexm0.elf
  3. text data bss dec hex filename
  4. 7452 172 104 7728 1e30 cortexm0.elf

第一次編譯可能會花點時間。編譯后產生的二進制占用了 7624 個字節的 Flash 空間(文本 + 數據)。對于一個什么都沒做的程序來說,占用的空間有些大。還剩下 8760 字節,可以用來做些有用的事。

不妨試試傳統的 “Hello, World!” 程序:

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. func main() {
  6. fmt.Println("Hello, World!")
  7. }

不幸的是,這次結果有些糟糕:

  1. $ egc
  2. /usr/local/arm/bin/arm-none-eabi-ld: /home/michal/P/go/src/github.com/ziutek/emgo/egpath/src/stm32/examples/f030-demo-board/blog/cortexm0.elf section `.text' will not fit in region `Flash'
  3. /usr/local/arm/bin/arm-none-eabi-ld: region `Flash' overflowed by 10880 bytes
  4. exit status 1

“Hello, World!” 需要 STM32F030x6 上至少 32KB 的 Flash 空間。

fmt 包強制包含整個 strconvreflect 包。這三個包,即使在精簡版本中的 Emgo 中,占用空間也很大。我們不能使用這個例子了。有很多的應用不需要好看的文本輸出。通常,一個或多個 LED,或者七段數碼管顯示就足夠了。不過,在第二部分,我會嘗試使用 strconv 包來格式化,并在 UART 上顯示一些數字和文本。

閃爍

我們的開發板上有一個與 PA4 引腳和 VCC 相連的 LED。這次我們的代碼稍稍長了一些:

  1. package main
  2.  
  3. import (
  4. "delay"
  5.  
  6. "stm32/hal/gpio"
  7. "stm32/hal/system"
  8. "stm32/hal/system/timer/systick"
  9. )
  10.  
  11. var led gpio.Pin
  12.  
  13. func init() {
  14. system.SetupPLL(8, 1, 48/8)
  15. systick.Setup(2e6)
  16.  
  17. gpio.A.EnableClock(false)
  18. led = gpio.A.Pin(4)
  19.  
  20. cfg := &gpio.Config{Mode: gpio.Out, Driver: gpio.OpenDrain}
  21. led.Setup(cfg)
  22. }
  23.  
  24. func main() {
  25. for {
  26. led.Clear()
  27. delay.Millisec(100)
  28. led.Set()
  29. delay.Millisec(900)
  30. }
  31. }

按照慣例,init 函數用來初始化和配置外設。

system.SetupPLL(8, 1, 48/8) 用來配置 RCC,將外部的 8 MHz 振蕩器的 PLL 作為系統時鐘源。PLL 分頻器設置為 1,倍頻數設置為 48/8 =6,這樣系統時鐘頻率為 48MHz。

systick.Setup(2e6) 將 Cortex-M SYSTICK 時鐘作為系統時鐘,每隔 2e6 次納秒運行一次(每秒鐘 500 次)。

gpio.A.EnableClock(false) 開啟了 GPIO A 口的時鐘。False 意味著這一時鐘在低功耗模式下會被禁用,但在 STM32F0 系列中并未實現這一功能。

led.Setup(cfg) 設置 PA4 引腳為開漏輸出。

led.Clear() 將 PA4 引腳設為低,在開漏設置中,打開 LED。

led.Set() 將 PA4 設為高電平狀態,關掉LED。

編譯這個代碼:

  1. $ egc
  2. $ arm-none-eabi-size cortexm0.elf
  3. text data bss dec hex filename
  4. 9772 172 168 10112 2780 cortexm0.elf

正如你所看到的,這個閃爍程序占用了 2320 字節,比最基本程序占用空間要大。還有 6440 字節的剩余空間。

看看代碼是否能運行:

  1. $ openocd -d0 -f interface/stlink.cfg -f target/stm32f0x.cfg -c 'init; program cortexm0.elf; reset run; exit'
  2. Open On-Chip Debugger 0.10.0+dev-00319-g8f1f912a (2018-03-07-19:20)
  3. Licensed under GNU GPL v2
  4. For bug reports, read
  5. http://openocd.org/doc/doxygen/bugs.html
  6. debug_level: 0
  7. adapter speed: 1000 kHz
  8. adapter_nsrst_delay: 100
  9. none separate
  10. adapter speed: 950 kHz
  11. target halted due to debug-request, current mode: Thread
  12. xPSR: 0xc1000000 pc: 0x0800119c msp: 0x20000da0
  13. adapter speed: 4000 kHz
  14. ** Programming Started **
  15. auto erase enabled
  16. target halted due to breakpoint, current mode: Thread
  17. xPSR: 0x61000000 pc: 0x2000003a msp: 0x20000da0
  18. wrote 10240 bytes from file cortexm0.elf in 0.817425s (12.234 KiB/s)
  19. ** Programming Finished **
  20. adapter speed: 950 kHz

在這篇文章中,這是我第一次,將一個短視頻轉換成動畫 PNG。我對此印象很深,再見了 YouTube。 對于 IE 用戶,我很抱歉,更多信息請看 apngasm。我本應該學習 HTML5,但現在,APNG 是我最喜歡的,用來播放循環短視頻的方法了。

 

STM32F030F4P6

更多的 Go 語言編程

如果你不是一個 Go 程序員,但你已經聽說過一些關于 Go 語言的事情,你可能會說:“Go 語法很好,但跟 C 比起來,并沒有明顯的提升。讓我看看 Go 語言的通道和協程!”

接下來我會一一展示:

  1. import (
  2. "delay"
  3.  
  4. "stm32/hal/gpio"
  5. "stm32/hal/system"
  6. "stm32/hal/system/timer/systick"
  7. )
  8.  
  9. var led1, led2 gpio.Pin
  10.  
  11. func init() {
  12. system.SetupPLL(8, 1, 48/8)
  13. systick.Setup(2e6)
  14.  
  15. gpio.A.EnableClock(false)
  16. led1 = gpio.A.Pin(4)
  17. led2 = gpio.A.Pin(5)
  18.  
  19. cfg := &gpio.Config{Mode: gpio.Out, Driver: gpio.OpenDrain}
  20. led1.Setup(cfg)
  21. led2.Setup(cfg)
  22. }
  23.  
  24. func blinky(led gpio.Pin, period int) {
  25. for {
  26. led.Clear()
  27. delay.Millisec(100)
  28. led.Set()
  29. delay.Millisec(period - 100)
  30. }
  31. }
  32.  
  33. func main() {
  34. go blinky(led1, 500)
  35. blinky(led2, 1000)
  36. }

代碼改動很小: 添加了第二個 LED,上一個例子中的 main 函數被重命名為 blinky 并且需要提供兩個參數。 main 在新的協程中先調用 blinky,所以兩個 LED 燈在并行使用。值得一提的是,gpio.Pin 可以同時訪問同一 GPIO 口的不同引腳。

Emgo 還有很多不足。其中之一就是你需要提前規定 goroutines(tasks) 的最大執行數量。是時候修改 script.ld 了:

  1. ISRStack = 1024;
  2. MainStack = 1024;
  3. TaskStack = 1024;
  4. MaxTasks = 2;
  5.  
  6. INCLUDE stm32/f030x4
  7. INCLUDE stm32/loadflash
  8. INCLUDE noos-cortexm

棧的大小需要靠猜,現在還不用關心這一點。

  1. $ egc
  2. $ arm-none-eabi-size cortexm0.elf
  3. text data bss dec hex filename
  4. 10020 172 172 10364 287c cortexm0.elf

另一個 LED 和協程一共占用了 248 字節的 Flash 空間。

 

STM32F030F4P6

通道

通道是 Go 語言中協程之間相互通信的一種推薦方式。Emgo 甚至能允許通過中斷處理來使用緩沖通道。下一個例子就展示了這種情況。

  1. package main
  2.  
  3. import (
  4. "delay"
  5. "rtos"
  6.  
  7. "stm32/hal/gpio"
  8. "stm32/hal/irq"
  9. "stm32/hal/system"
  10. "stm32/hal/system/timer/systick"
  11. "stm32/hal/tim"
  12. )
  13.  
  14. var (
  15. leds [3]gpio.Pin
  16. timer *tim.Periph
  17. ch = make(chan int, 1)
  18. )
  19.  
  20. func init() {
  21. system.SetupPLL(8, 1, 48/8)
  22. systick.Setup(2e6)
  23.  
  24. gpio.A.EnableClock(false)
  25. leds[0] = gpio.A.Pin(4)
  26. leds[1] = gpio.A.Pin(5)
  27. leds[2] = gpio.A.Pin(9)
  28.  
  29. cfg := &gpio.Config{Mode: gpio.Out, Driver: gpio.OpenDrain}
  30. for _, led := range leds {
  31. led.Set()
  32. led.Setup(cfg)
  33. }
  34.  
  35. timer = tim.TIM3
  36. pclk := timer.Bus().Clock()
  37. if pclk < system.AHB.Clock() {
  38. pclk *= 2
  39. }
  40. freq := uint(1e3) // Hz
  41. timer.EnableClock(true)
  42. timer.PSC.Store(tim.PSC(pclk/freq - 1))
  43. timer.ARR.Store(700) // ms
  44. timer.DIER.Store(tim.UIE)
  45. timer.CR1.Store(tim.CEN)
  46.  
  47. rtos.IRQ(irq.TIM3).Enable()
  48. }
  49.  
  50. func blinky(led gpio.Pin, period int) {
  51. for range ch {
  52. led.Clear()
  53. delay.Millisec(100)
  54. led.Set()
  55. delay.Millisec(period - 100)
  56. }
  57. }
  58.  
  59. func main() {
  60. go blinky(leds[1], 500)
  61. blinky(leds[2], 500)
  62. }
  63.  
  64. func timerISR() {
  65. timer.SR.Store(0)
  66. leds[0].Set()
  67. select {
  68. case ch <- 0:
  69. // Success
  70. default:
  71. leds[0].Clear()
  72. }
  73. }
  74.  
  75. //c:__attribute__((section(".ISRs")))
  76. var ISRs = [...]func(){
  77. irq.TIM3: timerISR,
  78. }

與之前例子相比較下的不同:

  1. 添加了第三個 LED,并連接到 PA9 引腳(UART 頭的 TXD 引腳)。
  2. 時鐘(TIM3)作為中斷源。
  3. 新函數 timerISR 用來處理 irq.TIM3 的中斷。
  4. 新增容量為 1 的緩沖通道是為了 timerISRblinky 協程之間的通信。
  5. ISRs 數組作為中斷向量表,是更大的異常向量表的一部分。
  6. blinky 中的 for 語句被替換成 range 語句。

為了方便起見,所有的 LED,或者說它們的引腳,都被放在 leds 這個數組里。另外,所有引腳在被配置為輸出之前,都設置為一種已知的初始狀態(高電平狀態)。

在這個例子里,我們想讓時鐘以 1 kHz 的頻率運行。為了配置 TIM3 預分頻器,我們需要知道它的輸入時鐘頻率。通過參考手冊我們知道,輸入時鐘頻率在 APBCLK = AHBCLK 時,與 APBCLK 相同,反之等于 2 倍的 APBCLK

如果 CNT 寄存器增加 1 kHz,那么 ARR 寄存器的值等于更新事件(重載事件)在毫秒中的計數周期。 為了讓更新事件產生中斷,必須要設置 DIER 寄存器中的 UIE 位。CEN 位能啟動時鐘。

時鐘外設在低功耗模式下必須啟用,為了自身能在 CPU 處于休眠時保持運行: timer.EnableClock(true)。這在 STM32F0 中無關緊要,但對代碼可移植性卻十分重要。

timerISR 函數處理 irq.TIM3 的中斷請求。timer.SR.Store(0) 會清除 SR 寄存器里的所有事件標志,無效化向 NVIC 發出的所有中斷請求。憑借經驗,由于中斷請求無效的延時性,需要在程序一開始馬上清除所有的中斷標志。這避免了無意間再次調用處理。為了確保萬無一失,需要先清除標志,再讀取,但是在我們的例子中,清除標志就已經足夠了。

下面的這幾行代碼:

  1. select {
  2. case ch <- 0:
  3. // Success
  4. default:
  5. leds[0].Clear()
  6. }

是 Go 語言中,如何在通道上非阻塞地發送消息的方法。中斷處理程序無法一直等待通道中的空余空間。如果通道已滿,則執行 default,開發板上的LED就會開啟,直到下一次中斷。

ISRs 數組包含了中斷向量表。//c:__attribute__((section(".ISRs"))) 會導致鏈接器將數組插入到 .ISRs 節中。

blinkyfor 循環的新寫法:

  1. for range ch {
  2. led.Clear()
  3. delay.Millisec(100)
  4. led.Set()
  5. delay.Millisec(period - 100)
  6. }

等價于:

  1. for {
  2. _, ok := <-ch
  3. if !ok {
  4. break // Channel closed.
  5. }
  6. led.Clear()
  7. delay.Millisec(100)
  8. led.Set()
  9. delay.Millisec(period - 100)
  10. }

注意,在這個例子中,我們不在意通道中收到的值,我們只對其接受到的消息感興趣。我們可以在聲明時,將通道元素類型中的 int 用空結構體 struct{} 來代替,發送消息時,用 struct{}{} 結構體的值代替 0,但這部分對新手來說可能會有些陌生。

讓我們來編譯一下代碼:

  1. $ egc
  2. $ arm-none-eabi-size cortexm0.elf
  3. text data bss dec hex filename
  4. 11096 228 188 11512 2cf8 cortexm0.elf

新的例子占用了 11324 字節的 Flash 空間,比上一個例子多占用了 1132 字節。

采用現在的時序,兩個閃爍協程從通道中獲取數據的速度,比 timerISR 發送數據的速度要快。所以它們在同時等待新數據,你還能觀察到 select 的隨機性,這也是 Go 規范所要求的。

 

STM32F030F4P6

開發板上的 LED 一直沒有亮起,說明通道從未出現過溢出。

我們可以加快消息發送的速度,將 timer.ARR.Store(700) 改為 timer.ARR.Store(200)。 現在 timerISR 每秒鐘發送 5 條消息,但是兩個接收者加起來,每秒也只能接受 4 條消息。

 

STM32F030F4P6

正如你所看到的,timerISR 開啟黃色 LED 燈,意味著通道上已經沒有剩余空間了。

第一部分到這里就結束了。你應該知道,這一部分并未展示 Go 中最重要的部分,接口。

協程和通道只是一些方便好用的語法。你可以用自己的代碼來替換它們,這并不容易,但也可以實現。接口是Go 語言的基礎。這是文章中 第二部分所要提到的.

在 Flash 上我們還有些剩余空間。 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2019-09-25 17:46:13

Go語言編程語言

2020-11-03 08:31:53

Go語言編程語言

2020-10-25 06:30:48

Go語言編程語言

2018-03-12 22:13:46

GO語言編程軟件

2012-11-21 11:48:23

i-NVMM加密密碼

2024-05-10 08:36:40

Go語言對象

2012-11-08 09:36:10

Google Go

2023-12-13 07:19:01

微服務架構Golang

2014-04-09 09:32:24

Go并發

2021-09-17 10:51:01

Linuxlspci命令

2010-01-27 13:53:40

強大的CC++編譯器

2020-10-12 08:03:51

Go語言編程

2012-10-08 09:25:59

GoGo語言開發語言

2013-07-30 09:27:32

Go云計算語言

2013-07-30 09:23:43

VMwareGoogle云平臺

2018-03-19 17:40:10

Python區塊鏈

2012-05-04 11:28:41

虛擬化KVM高性能

2021-06-24 06:35:00

Go語言進程

2021-04-15 12:10:42

Go語言Go開發者

2022-03-27 23:11:39

Go語言函數
點贊
收藏

51CTO技術棧公眾號

91精品国产综合久久久久久久久| 欧美日韩国产美| 国产伦精品一区二区三毛| 精品无码免费视频| 日韩美女国产精品| 日本韩国欧美一区| 国产91av视频在线观看| 99精品在线看| 99国产精品久久久久久久| 亚洲性猛交xxxxwww| 岛国av免费在线| 色www永久免费视频首页在线| 99久久国产综合精品女不卡| 国产精品69av| 全网免费在线播放视频入口 | 少妇高潮av久久久久久| 欧美日韩亚洲在线观看| 日韩欧美在线网站| 欧美性大战久久久久xxx| 最新国产在线观看| 成人午夜电影小说| 国产精品www| 婷婷在线精品视频| 亚洲欧洲免费| 日韩午夜精品电影| 99视频精品免费| 3d玉蒲团在线观看| 久久精品日产第一区二区三区高清版| 91久久久久久久久久久久久| 亚洲一区 视频| 色爱综合网欧美| 精品久久久久久久久久久久包黑料 | 无码成人精品区在线观看| 欧美成人黑人| 亚洲免费观看高清| 日韩av不卡播放| 黑人操亚洲女人| 久久精品久久精品| 奇米四色中文综合久久| 欧美极品aaaaabbbbb| 成人一二三区| 日韩精品久久久久久福利| 激情图片中文字幕| 成人日韩在线| 亚洲成av人在线观看| 制服国产精品| 国产在线观看黄| 97se亚洲国产综合自在线观| 99在线观看视频| 97人妻一区二区精品免费视频| 亚洲综合国产激情另类一区| 欧美激情伊人电影| 国产精品成人69xxx免费视频| 欧美呦呦网站| 亚洲免费小视频| 中文字幕免费在线播放| 亚洲不卡在线| 日韩一区二区在线观看| 亚洲精品www.| 日本成人福利| 在线观看欧美日本| 亚洲色欲综合一区二区三区| 成人国产电影在线观看| 亚洲成人资源网| 人人妻人人澡人人爽欧美一区双| av毛片在线免费看| 日韩理论片网站| 欧美少妇一级片| 久久亚洲天堂| 亚洲欧洲制服丝袜| 亚洲精品欧美精品| 中国日本在线视频中文字幕| 国产精品狼人久久影院观看方式| 亚洲欧美影院| 九七久久人人| 亚洲美女视频在线观看| 久久久天堂国产精品| 欧美日韩在线看片| 亚洲免费伊人电影| 国产黄色激情视频| hd国产人妖ts另类视频| 午夜精品成人在线视频| 欧美黑人经典片免费观看| 香蕉伊大人中文在线观看| 黑人精品xxx一区| 无码无遮挡又大又爽又黄的视频| 欧美成人性网| 欧美日韩久久久一区| 亚洲天堂伊人网| 国产麻豆精品| 精品久久久久一区| 美国黄色a级片| 国产综合久久久| 最近的2019中文字幕免费一页| 波兰性xxxxx极品hd| 欧美激情91| 久久噜噜噜精品国产亚洲综合| 欧美精品二区三区| 日本在线播放一区二区三区| 91亚洲va在线va天堂va国| 丁香六月天婷婷| 91香蕉国产在线观看软件| 日韩.欧美.亚洲| 怡红院在线播放| 精品福利免费观看| 久久久久久蜜桃一区二区| 最新国产精品精品视频| 精品偷拍各种wc美女嘘嘘| 影音先锋男人看片资源| 欧美私人啪啪vps| 日本免费一区二区三区视频观看| 国产精品日韩无码| 99国产精品国产精品毛片| 亚洲免费视频一区| av人人综合网| 欧美日韩一区二区三区视频| 日本中文字幕有码| 欧美日韩久久精品| 性欧美在线看片a免费观看| 免费黄色小视频在线观看| 国产精品88888| 美女精品国产| 中文字幕在线播放网址| 色先锋资源久久综合| 麻豆精品国产传媒| 欧美自拍偷拍| 97高清免费视频| 91无套直看片红桃| 久久久亚洲午夜电影| 成人在线免费观看视频网站| 韩国成人漫画| 欧美sm极限捆绑bd| 97精品在线播放| 日韩极品在线观看| 久久国产精品免费一区| 影音先锋在线视频| 欧美日韩免费高清一区色橹橹| 9.1成人看片| 欧美日韩国内| 成人免费网站在线观看| av在线免费观看网| 日韩欧美成人精品| 婷婷五月精品中文字幕| 一二三区不卡| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 亚洲成人77777| 国产精品天天摸av网| 欧美 国产 日本| 日韩有吗在线观看| 久久亚洲国产精品| 波多野结衣一二区| 2021国产精品久久精品| 福利视频一二区| av不卡一区| 欧美大尺度在线观看| 国产精品色综合| 中文字幕欧美一| 一区二区三区视频在线观看免费| 国产精品日韩精品中文字幕| 欧洲一区二区视频| 免费av在线电影| 色综合久久综合网欧美综合网| 第四色在线视频| 亚洲一区图片| 奇米精品在线| 欧美日韩五码| 一本色道久久综合亚洲精品小说| 亚洲色成人www永久网站| 久久久久久久综合狠狠综合| 成人黄色片视频| 久久av网址| 国产国产精品人在线视| 国产黄在线播放| 欧美四级电影网| 永久免费观看片现看| 另类专区欧美蜜桃臀第一页| 男女啪啪的视频| 精品国产三级| 国外成人性视频| 欧美日韩影视| 欧美专区日韩专区| 中文乱码字幕高清一区二区| 国产综合一区二区| 男人添女人下部视频免费| 开心激情综合| 国产成人精品一区| www.在线播放| 欧美一个色资源| 日韩成年人视频| 久久精品免视看| 欧美激情第3页| 欧美日本一区| 久久精品一区二区三区不卡免费视频 | 日韩大陆av| 欧美成人免费观看| 午夜影院免费视频| 欧美性猛交xxxxxxxx| 日韩三级在线观看视频| av一区二区三区四区| 国产视频在线视频| 欧美高清不卡| 欧美动漫一区二区| av在线亚洲一区| 国语自产精品视频在线看一大j8 | 亚洲精品一区二区二区| 自拍视频在线观看一区二区| 麻豆精品国产传媒av| 日韩电影在线观看电影| 水蜜桃在线免费观看| 欧洲vs亚洲vs国产| 国产精品偷伦免费视频观看的| 色在线视频网| 国产亚洲精品日韩| 成人av无码一区二区三区| 色综合天天综合网天天狠天天| 97精品在线播放| 久久久久久久久久久久久女国产乱| 中文字幕22页| 免费国产自线拍一欧美视频| 亚洲第一精品区| 美女毛片一区二区三区四区最新中文字幕亚洲 | 欧美激情视频一区二区三区不卡| 蜜桃视频在线播放| 精品福利视频一区二区三区| 国产精品成人久久久| 亚洲一区二区美女| av在线免费播放网址| 91亚洲资源网| 中文字幕 欧美 日韩| 日本不卡一区二区| 无码人妻精品一区二区三区在线| 一区二区影院| 亚洲国产精品一区二区第一页 | 精品视频在线免费看| 影音先锋亚洲天堂| 一区二区三区丝袜| 色婷婷粉嫩av| 欧美激情一区三区| 给我看免费高清在线观看| 国产成人高清在线| 午夜激情影院在线观看| 日本最新不卡在线| 东京热加勒比无码少妇| 激情欧美一区二区三区| 国内精品国产三级国产99| 93在线视频精品免费观看| 欧美一级二级三级| 精品在线手机视频| 久久精品日产第一区二区三区| 精品综合久久88少妇激情| 99影视tv| 日韩中文字幕视频网| 亚洲www视频| 在线视频成人| 国产精品一区二区电影| 精品视频在线一区二区在线| 日韩免费在线看| 综合日韩av| 欧美伊久线香蕉线新在线| 精精国产xxxx视频在线播放| 久久久久久91香蕉国产| 激情网站在线| 欧美国产精品日韩| 欧洲在线视频| 欧美黑人xxxⅹ高潮交| 欧洲性视频在线播放| 欧美成人午夜免费视在线看片| www免费视频观看在线| 久久视频精品在线| 日本三级韩国三级欧美三级| 九九综合九九综合| heyzo在线播放| 欧美亚洲日本黄色| 88xx成人免费观看视频库| 国产精品一区电影| 欧美成人精品午夜一区二区| av成人观看| 啪啪激情综合网| 欧美在线一二三区| 久久一区91| 黑人巨大国产9丨视频| 激情婷婷久久| 久久无码高潮喷水| 日本va欧美va精品| 三级黄色片播放| 成人福利视频在线看| 久久精品成人av| 中文字幕免费观看一区| 91香蕉视频在线播放| 亚洲欧美日韩国产中文在线| 精品无码一区二区三区电影桃花| 精品高清一区二区三区| jizz国产在线| 欧美精品久久99久久在免费线 | 欧美自拍偷拍第一页| 亚洲精品一区二区久| 一级毛片视频在线观看| 欧美www在线| 激情视频网站在线播放色| 国产精品美女无圣光视频| 日本少妇精品亚洲第一区| 精品乱色一区二区中文字幕| 日韩大片在线播放| 成年人深夜视频| 久久久久国内| 99国产精品免费视频| 99久久婷婷国产综合精品| 日本免费www| 亚洲大片精品永久免费| 中文字幕在线观看你懂的| 精品国产电影一区二区| 国产理论电影在线观看| 久久久久久久久久久成人| 成人私拍视频| 91九色视频导航| 自拍亚洲一区| 欧美一二三不卡| 视频一区国产视频| 91视频在线免费| 亚洲欧洲av在线| 中文字幕精品无码一区二区| 日韩美女一区二区三区四区| 国产www.大片在线| 97激碰免费视频| 国产色99精品9i| 亚洲 国产 欧美一区| 男女精品网站| 岛国av免费观看| 国产精品久久久爽爽爽麻豆色哟哟| 毛片在线免费视频| 日韩一区二区免费在线观看| 福利在线视频导航| 69视频在线免费观看| 深夜福利一区二区三区| 亚洲欧洲精品一区二区| 午夜影院日韩| 国产精品一区二区无码对白| 18涩涩午夜精品.www| 中文字幕 视频一区| 亚洲精品一区二区久| 国产v日韩v欧美v| 97在线中文字幕| 久久久人成影片免费观看| 999在线免费视频| 久久一区二区三区四区| 日韩和一区二区| 精品免费视频.| gogogogo高清视频在线| 成人动漫网站在线观看| 久久精品播放| 少妇一级淫免费放| 久久精品亚洲乱码伦伦中文| www.日本精品| 亚洲国产精品成人av| 国精一区二区三区| 国产精品一区二区三区精品| 国内成人在线| 日韩大尺度视频| 亚洲综合视频网| 亚洲av无码国产综合专区| 精品中文字幕在线观看| 96视频在线观看欧美| 法国空姐在线观看免费| 狠狠色综合日日| 天堂网avav| 欧美一级高清大全免费观看| 午夜小视频在线观看| 99r国产精品视频| 欧美精品麻豆| 国产人妻精品午夜福利免费| 亚洲一区中文日韩| 黄色片网站免费在线观看| 韩国精品久久久999| 四虎5151久久欧美毛片| 久草精品在线播放| 中文字幕免费不卡在线| 一级黄色大毛片| 久久国产精品久久精品| h视频久久久| 日本中文字幕网址| 久久精品一区四区| 一本一道精品欧美中文字幕| 久久久精品久久久| 成人性生交大片免费看96| 男人添女人下面高潮视频| 久久丝袜美腿综合| 中日韩av在线| 久久成人精品电影| 国内自拍欧美| 999精品网站| 中文字幕亚洲一区二区av在线| 国产不卡av在线播放| 91av成人在线| 日韩激情免费| 人妻 丝袜美腿 中文字幕| 色综合久久久久综合体桃花网| 瑟瑟视频在线| 国产精品果冻传媒潘| 日日摸夜夜添夜夜添亚洲女人| 亚洲精品自拍视频在线观看|