久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11266|回復: 6
收起左側

合泰單片機Holtek C Compiler V3編譯器使用手冊與FAQ資料下載

[復制鏈接]
ID:223582 發表于 2018-10-13 22:41 | 顯示全部樓層 |閱讀模式
合泰單片機編譯器和Touch MCU Workshop v3.0使用手冊資料分享給大家學習

本手冊主要講述了 C語言的基礎語言,再以此為基礎,進而講述 C compiler V3的語法結構和其優化功能,幫助程序員快速使用 C compiler V3 開發應用程序。C compiler V3 是由 GCC 4.6.2 以上版本移植過來的,除后端輸出,其余部份都可參考GCC 與機器無關的相關使用手冊。
這里假定讀者已具備如下基本素質:
  ● 知道如何編寫 C 程序
  ● 已經閱讀并理解所使用單片機的數據手冊
0.png 0.png
第一章 C 語言基礎知識
本章將由淺到深的概括 C 語言的基礎語法及結構特點,方便后面學習 C compiler V3,由于受限于單片機的硬件結構,因此本章的描述基于標準 C 語言( 這里指 C99 標準 ),兼容 C compiler V3 之語法。
主要包含如下內容:
  ● 數據類型、運算符與表達式
  ● 函數
  ● 數組與指針
  ● 結構體、聯合體與枚舉
  ● 預處理
  ● 流程控制
  ● 作用域
1.1 數據類型、運算符與表達式
1.1.1 C的數據類型
數據類型確定了變量在內存中占用的存儲單元,所以在聲明變量時首先必須要確定變量的類型,數據類型可以分為基本數據類型、構造數據類型、指針類型(Pointer) 和空類型 (void),基本數據類型有整型、字符型、浮點型,構造類型則有數組、結構體、共享體和枚舉,利用這些構造類型可以構造出所需要的數據結構。
列舉基本數據類型 (C compiler V3) 如表 1-1-1:
0.png
0.png
1.1.2.2 變量及其定義
變量是在程序運行時,其值可以變化的,每個變量都應該有一個名字,以便被引用,并區分大小寫,C 語言規定,所有的變量都必須先宣告,后使用,變量在定義時必指定數據類型,這樣編譯時才可為其分配對應的存儲單元。如int a;。標識符是用來標識變量、常量、函數、類型等的字符系列,C 語言規定標識符只能由字母、數字、下劃線構成,且必須以字母和下劃線作為起始符。
1.1.2.3 變量的存儲方式
在 C 語言中每個變量和函數都有兩個屬性:數據類型和數據的存儲方式,存儲方式可分為 2 種,靜態存儲和動態存儲,具體又包含 4 種,自動的 (auto)、靜態的(static)、寄存器的(register)、外部的(extern)。
1、auto:函數中的局部變量,如果不專門聲明為 static 的存儲方式,則默認為auto,所以在函數內 auto char a與 char a是等價的。
2、static:可分為全局靜態存儲和局部靜態存儲,全局變量加了 static 后,變量只能在本文件中引用,局部靜態存儲則是局部變量的值在函數調用結束后不消失而保留原值,在下一次調用該函數時,該變量已經有值了。
3、register:上述兩種變量是存放在內存中的,而 register 則是把變量存放在寄存器中,基于單片機的特殊情況,這里不展開敘述。
4、extern:使用另一個檔中定義的變量,表示該變量是一個已經在外部定義過的變量,只要加上extern 就可以使用該變量了,后面有專門的講述。

5、volatile:一個類型修飾符 (type specifier)。它是被設計用來修飾被不同程序
訪問和修改的變量,使用 volatile 修飾的變量,不會因編譯程序的優化而被省去。
建議定義成 volatile 的變量:特殊寄存器,中斷函數使用到的變量,為某些特殊用途的代碼定義的變量 ( 比如 delay 功能 )。
其它一般變量不建議定義成volatile,這樣會大大降低編譯程序的優化功能。

1.1.3 C語言運算簡介
C 語言的運算十分豐富,主要包括算術運算,邏輯運算、位運算、賦值運算、條件運算、逗號運算等,各種運算及其之間的優先級見附錄 B。
1.1.3.1 類型轉換
類型轉換規則:
  ● 混合類型的算術運算
  ♦ 小于int類型的轉換為 int 類型
  ♦ 小類型向大類型轉換(轉換過程見圖 2_1_1)
  ● 不同類型之間的賦值
  ♦ 以賦值語句左邊的類型為轉換后類型
  ● 函數參數 / 返回值的傳遞
  ♦ 以參數/ 返回值的類型為轉換后類型
0.png

FAQ目錄:
目錄

Part I V3 基本介紹  5
11 V3 的版本歷程 ? 5
12 新版改進的功能  5
13 V3 的使用手冊有哪些 ? 6
14 V3 不支持的 MCU 有哪些 ?  6
15 什么是長指令架構 MCU?  7
Part II V3 與 V2 的不同  8
21 V3 與 V2 語法有何不同 ? 與 V1, V2,標準 C 的比較 ? 8
22 V3 對 V2 改進的功能  8
23 將 V2 程序改至 V3 常見的錯誤  8
231 ISR warning  8
232 內嵌匯編 error  9
233 bit 變數 error  9
234 標志位 error  9
235 內部函數 error  9
236 絕對地址變數 error  10
237 函式指標 error  10
Part III V3 的特殊語法及用法  11
31 如何將一個變量定義于指定 bank? 11
32 如何將函數定義于指定地址 ?  11
33 如何在 V3 中使用混合語言 (mixed language)?  11
34 V3 代碼生成器  11
Part IV V3 常見的 error, warning 及其解決方式 13
41 error“multi-ram-bank should be equipped with mp1” 13
42 error“internal compiler error:xxxx”  13
43 error (L1038)“RAM (bank0) overflow, memory allocation fails for section …” 13
44 error (L1038)“ROM/RAM (bank*) overflow, memory allocation fails for section …”
13
45 warning (L3010) (absolute address: xxh, length: x) is overlay with (absolute address: xxh, length: x) 13
46 warning (L3009): Same sub function exists between ISR(04H) CMG and MAIN CMG:
_func  13
Part V V3 常見的問題及其解決方式  14
51 如何在 V3 使用 bit 變量 ?  14
52 如何在 V3 使用外部定義 bit 變量 ?  14
53 程序 reset 后,變量被清 0 的解決方式 ?  14
54 指定地址的變量,其他文件如何引用 ?  15
55 對于寫 EEPROM 有限制的 MCU( 需連續 set wren, wr, flag),如何使用 V3 寫
EEPROM?  15
56 使用 V3 給 bit flag 賦值變量的注意事項  17
57 在 V3 使用 ROM BP 的注意事項  18



58 混合語言使用 ROM BP 的注意事項  18
59 如何使用 CMD 命令編譯 C 工程?  19
510  混合語言工程在 asm 文件中使用 table read 的注意事項  19
511  中斷函數中使用 inline assembly 注意事項  19
512 用其它方式修改 const 變量值 ( 比如燒錄時修改 ROM),compiler 執行結果不變, 如何解決 ?  20
513 使用內嵌匯編語言的注意事項  20
Part VI V3 常見的優化問題 21
61 使用 V3 優化參數后,在 watch window 上看不到某些變數的 debug 信息 ?  21
62 中斷與一般函數訪問同一個全局變量,此全局變量的相關語句被優化掉 ?  21
63 V3 的優化功能及其對 debug 的影響 ?  21
64 使用 V3 compiler, debug 時行號出錯 ? 21
65 使用 V3 compiler,用于延時的循環代碼被優化,怎么解決 ?  22
66 使用內嵌匯編,被優化掉 ?  23
67 選擇優化參數后,延時函數時間發生變化。  23

1.5 什么是長指令架構 MCU?
A:具有 LMOV,LSET 等長指令(長度為 2word)的 MCU,如 HT66F70A,一顆 MCU 是否有長指令,可以查看它的 datasheet,是否有 LMOV 等長指令,每條 長指令比對應的普通指令增加 1 個指令周期。

2.3 將 V2 程序改至 V3 常見的錯誤

2.3.1 ISR warning
e.g.
#pragma vector Int_isr @ 0x04 void Int_isr() {}
warning: ignoring #pragma vector Int_isr [-Wunknown-pragmas]
解決方式:
使用正確的中斷函式語法:void    attribute((interrupt(0x04))) Int_isr() {}
詳見《C Compiler V3 使用手冊》2.2.1 節
注意:
i:因為是 warning,如果不修改也可以編譯通過,只是編譯程序會將它當一般 函式處理,而不是中斷函式
ii:#pragma 的其他關鍵詞 rambank/function 等,也會報此 warning,表示在 V3
版此功能無效。

2.3.2 內嵌匯編 error
e.g.
#asm nop
#endasm
error: invalid preprocessing directive #asm error: invalid preprocessing directive #endasm 解決方式:
選擇參數“兼容 Holtek C V2 內嵌匯編語言”
詳見語法書《 C Compiler V3 使用手冊》2.2.5 節
2.3.3 bit 變數 error
e.g.bit a;
error: unknown type name 'bit'
解決方式:使用 HT-IDE3000 V7.93 以上版本
2.3.4 標志位 error
e.g. _40_1 = 1;
error: '_40_1' undeclared (first use in this function)
解決方式:
1. 用結構體位域定義 bit flag:
bit_type bit_var  attribute  ((at(0x40)));
#define _40_1 bit_var.bit1
詳見《C Compiler V3 使用手冊》2.2.3 節
2. 使用 bit 定義:
static volatile bit flag1  attribute  ((at(0x40),bitoffset(1)));
詳見《C Compiler V3 使用手冊》2.2.11 節
2.3.5 內部函數 error
e.g. _delay(2);
Error(L2001): Unresolved external symbol '    delay' in file
解決方式:
改成:
#include “ht66f50.h”
GCC_DELAY(2);
詳見《C Compiler V3 使用手冊》2.2.3 節



2.3.6 絕對地址變數 error
e.g.
unsigned char a @ 0x40;
error: stray '@' in program
error: expected '=', ',', ';', 'asm' or '    attribute   ' before numeric constant
解決方式:
改成以下語法:
volatile static unsigned char var_name  attribute  ((at(0x40)));
詳見《C Compiler V3 使用手冊》2.2.2 節
2.3.7 函式指標 error
e.g.
void FileFunc(){} void EditFunc(){} void main()
{
typedef void (*funcp)(void);
funcp pfun= FileFunc;
pfun();
pfun = EditFunc;
pfun();
}
error: incompatible types when initializing type 'funcp' using type 'void()' error: incompatible types when assigning to type 'funcp' from type 'void()' 解決方式:目前 V3 尚不支持 function pointer

Part III V3 的特殊語法及用法
3.1 如何將一個變量定義于指定 bank?
A:若是無長指令架構的 MCU,只能將變量定義在指定地址,如:
volatile static unsigned char var_name    attribute    ((at(0x140)));
詳見《C Compiler V3 使用手冊》2.2.2 節
若 是 長 指 令 架 構 的 MCU, 無 需 特 別 指 定,linker 會 自 動 分 配 變 量 到 任 意
bank。
3.2 如何將函數定義于指定地址 ?
A:IDE 7.8 以上版本才支持此功能,語法:
char  attribute ((at(0x373))) foo (char parm)
{}
表示將函數 foo 指定在地址 0x373. 詳見《C Compiler V3 使用手冊》2.2.6 節
3.3 如何在 V3 中使用混合語言 (mixed language)?
A:參考《C Compiler V3 使用手冊》第 2.5 節
3.4 V3 代碼生成器
為協助用戶更好的使用 V3 專用語法,IDE3000 7.83 以上版本增加工具“V3 代 碼生成器”,位于菜單欄 → 工具 → V3 代碼生成器。它可以成生 bit 變量,中 斷語法,絕對地址變量,內嵌匯編,delay 函數及指定其它 bank 的變量等語法, 具體可查看 HT-IDE3000 使用手冊第三章“V3 代碼生成器”部份。
0.png

Part IV V3 常見的 error, warning 及其解決方式
4.1 error“multi-ram-bank should be equipped with mp1”
A:請確認 MCU 是否為長指令架構,若是,請使用 IDE7.8 以上版本
4.2 error“internal compiler error:xxxx”
A:compiler 內部錯誤,請與 Holtek 公司返饋

4.3 error (L1038)“RAM (bank0) overflow, memory allocation fails for section ….”
A:對于短指令架構的 MCU,C Compiler 會默認把變量配置到 RAM bank0( 長指 令的 MCU 可以自動配置到任意 bank),當 bank0 滿了之后,會報 RAM bank 0 overflow 出現此信息后,做法如下:
● 確認 unsigned int/long 類型的大小 ( 特別是從 V1 C Compiler 移植過來的程序 )
● 若為 multi RAM bank MCU,可手動將全局變量調到其它 bank,參考 3.1

4.4 error (L1038)“ROM/RAM (bank*) overflow, memory allocation fails for section ….”
A:ROM 或 RAM 空間不夠出現此信息后,做法如下:
● 檢查是否打開優化參數 -Os,參考《C Compiler V3 使用手冊》2.1.4 節
● 刪減不必要的程序

4.5 warning (L3010) (absolute address: xxh, length: x) is overlay with (absolute address: xxh, length: x)
A:出現此 warning 的情況:
不同變量定義的地址重迭,如下,_b 與 _a 地址重迭,需將 _b 定義在 0x0142
DEFINE_SFR(unsigned int _a, 0x0140); DEFINE_SFR(unsigned char _b, 0x0141);    //error

4.6 warning (L3009): Same sub function exists between ISR(04H) CMG and
MAIN CMG: _func
A:中斷服務程序(04H)與主函數共同調用子函數 func,解決方式:
● 避免共同調用
詳見《C Compiler V3 使用手冊》2.2.1 節

Part V V3 常見的問題及其解決方式
5.1 如何在 V3 使用 bit 變量 ?
A:bit flag1; 詳見《C Compiler V3 使用手冊》2.2.11 節。
5.2 如何在 V3 使用外部定義 bit 變量 ?
A:extern bit flag1;
5.3 程序 reset 后,變量被清 0 的解決方式 ?
A:IDE7.8 版本將提供選擇不初始化的方式:不選擇下面選項“將未初始化的…”
即可。
0.png

5.4 指定地址的變量,其他文件如何引用 ?
A:因指定地址的變量 ( 非 const) 需定義成 static,其它作用域只在本文件,所以可 以將其定義在頭文件里面,若有其它文件需要用到,直接 include 這個頭文件 即可,例:
//Define_var.h
static volatile unsigned var1  attribute  ((at(0x180)));
//test1.c
#include “Define_var.h”
void foo1()
{


}
//test2.c

var1 = 1;

#include “Define_var.h”
void foo2()
{
var1 = 2;
}
注:若是 const 變量,不需要定義成 static,用 extern 即可,例:
//test1.c
const int  attribute ((at(0x3400))) bb[3]={1,2,3};
//test2.c
extern const int bb[3];
int b;
void fun()
{
b=bb[2];
}
5.5 對于寫 EEPROM 有限制的 MCU( 需連續 set wren, wr, flag),如何使用
V3 寫 EEPROM?
A:
i:在 V3 中,因為 _rden 與 _rd 是在 bank1,使用長指令,與 datasheet 所規定的 指定不同。
ii:這種對指令有嚴格要求的功能,建議使用內嵌匯編達成,因為 C 不敢保證 按特定的方式翻譯。
iii:若要產出與 datasheet 中的連續指令,V3 需改成如下寫法:
1.png

5.6 使用 V3 給 bit flag 賦值變量的注意事項
范例:
unsigned char flag;
_pa2=flag;
0.png
說明:
編譯程序只關心計算的結果,而不管計算過程,為減少 CODE 的指令輸出,編 譯程序會翻譯左邊的指令。
C 語言與匯編不同的是,一條語句不只翻譯出一條指令,所以在語句執行結束 前,計算未完成。
影響:
不管 flag 值為多少,PA2 都會被先 CLR,如果在此時進入中斷,而中斷中有用 到 PA,則會影響到執行結果。
解決方式:
● 在 bit 賦值前先把中斷關掉,等計算完后再打開 總結: 多字節變量的計算,如果中斷中有判斷此變量,在計算未完成前,都不可進入
中斷。

5.7 在 V3 使用 ROM BP 的注意事項
對于多 ROM BANK MCU,若整個工程都用 C 語言寫,那么,任何時候,用戶 都不需要設定 ROM BP,Linker 會自動設置 ROM BP,特別注意,若用戶在程 序中改動到 ROM BP,那么程序將有可能跑飛,用戶需特別小心,在設置 RAM BP 時,也應注意不要用到 ROM BP。若工程使用混合語言編程,用 C 函數 call 匯編 section 時,應使用 C 語言或 fcall,在匯編 section call C 函數時,需在 CALL 前設 BP,前在 CALL 之后恢復 BP。
范例:
;;Test1.asm
extern _fun2:near public _fun1
_fun1 .section ‘code’
_fun1 proc
mov a, bank _fun2
mov [04H],a ;; 假設 ROM BP 在 04h
call _fun2
mov a,bank_fun1 mov [04H],a
_fun1 endp
//Test2.c
extern void FUN1();
// 或者 asm(“extern _FUN1:near”);
void main()
{
FUN1();
// 或者 asm(“fcall _FUN1”);
}
void fun2()
{}
5.8 混合語言使用 ROM BP 的注意事項
參考 5.7 節
5.9 如何使用 CMD 命令編譯 C 工程?
compiler,assembler,linker 的參數詳見《V3 C Compiler 使用手冊》附錄 C
例:
a. 設置環境變量:
set HTCFG=C:\Program Files\Holtek MCU Development Tools\HT-IDE3000V7.x\MCU set HTBIN=C:\Program Files\Holtek MCU Development Tools\HT-IDE3000V7.x\BIN set HTINCLUDE=C:\Program Files\Holtek MCU Development Tools\HT-IDE3000V7. x\INCLUDE_V3
set HTLIB=C:\Program Files\Holtek MCU Development Tools\HT-IDE3000V7.x\LIB

b. 編譯 .c 文件
…\hgcc32.exe  t1.c –g –Os –I “%HTINCLUDE%” -o t1.asm
…\hgcc32.exe  t2.c –g –Os –I “%HTINCLUDE%” –o t2.asm

c. 編譯 .asm 文件
…\hasmgcc32.exe /hide=12345678 /chip=HT66F50 /case /z “t1.asm”
…\hasmgcc32.exe /hide=12345678 /chip=HT66F50 /case /z “t2.asm”

d. link 所有 obj,lib 產生 .tsk 文件
…\hlinker32.exe /MCU=HT66F50 @ “C:\link-test.bat”
link-test.bat 內容:
“t1.obj”+ “t2.obj”, “test.tsk”, “test.map”, “test.dbg”, “libholtekgcc.lib”;

5.10  混合語言工程在 asm 文件中使用 table read 的注意事項 如果一個工程即有 .c 又有 .asm 文件,那么在 .asm 文件中使用 table read 應注意 , 先將中斷關掉,執行完后再打開。比如:
clr emi tabrd r0 inc tblp mov a,tblh

set emi

5.11  中斷函數中使用 inline assembly 注意事項 在中斷及其調用的函數中如果有使用 inline assembly,且 inline assembly 有使用 到特殊寄存器 ( 如 MP, TBLP, TBHP, TBLH 等 ),則用戶需要自己保存這些寄存
器,如下語句:
DEFINE_ISR(isr04,0x04)
{
asm(“mov a,[01h]”); // mp0 = [01h]
asm(“mov temp_mp0,a”); asm(“mov a,80h”); asm(“mov [01h],a ”); asm(“mov a,[00h]”); asm(“mov a,temp_mp0”); asm(“mov [01h],a”);
}

5.12 用其它方式修改 const 變量值 ( 比如燒錄時修改 ROM),compiler 執行 結果不變,如何解決 ?
比如:定義
  attribut ((at(0x400)))
const unsigned char array[] = {0,1,2,3,4,5,6,7};
燒錄時把 ROM 的 400H~410H 清 0,執行 temp = array[7]; 時,temp 值仍為 7。
解決方式:
把 array[] 定義在與 temp = array[7]; 不同的 C 文件。
5.13 使用內嵌匯編語言的注意事項
匯編語言中使用到的變量、函數名、寄存器、標志位應遵循匯編語言的定義。
1. 如果全局變量 / 函數本文件只在內嵌匯編語言中使用,應增加匯編語言聲明, 比如:
asm(“extern _a:byte”); asm(“extern _func:near”); void main()
{
asm(“clr _a”);
asm(“call _func”);
}
2. 寄存器 / 標志位應先定義后使用,可 include INC 文件,比如:
asm(“#include HT66F60.INC”)
void main()
{
asm(“CLR ACC”); asm(“MOV TBHP,A”); asm(“CLR C”);
}
3. 匯編語言中的名字要區分大小寫。
Part VI V3 常見的優化問題
6.1 使用 V3 優化參數后,在 watch window 上看不到某些變數的 debug 信息 ?
A:因啟用優化參數,變量有可能被優化刪除,故沒有 debug 信息,若要在 debug
時觀察變量值,可以將此變量暫時定義為 volatile,debug 結束后再刪去,比如:
volatile int i, j, k;
6.2 中斷與一般函數訪問同一個全局變量,此全局變量的相關語句被優化掉 ?
A:一般函數與中斷沒有調用關系,compiler 不知中斷何時發生,會影響到一般函 數中的變量,因此,建議將此變量用 volatile 修飾,比如:
flag 在中斷 ISR_INT0 中使用到,又在 main 函數中用到,則應定義成 volatile:
volatile unsigned char flag;
0.png
說明:volatile:一個類型修飾符(type specifier)。它是被設計用來修飾被不同 函數訪問和修改的變數,使用 volatile 修飾的變量,不會因編譯程序的優 化而被省去。
建議定義成 volatile 的變量:特殊寄存器,中斷函式使用到的變量,為某些特殊 用途的代碼定義的變量 ( 比如 delay 功能 )。
6.3 V3 的優化功能及其對 debug 的影響 ?
A:詳見《C Compiler V3 使用手冊》第 3 章
6.4 使用 V3 compiler, debug 時行號出錯 ?
A:可能出現的情況:
a. 某些語句被優化掉而不譯出 code,自然也沒有 debug 信息。
1.png
b. 幾條語句翻譯出同一堆的 code,只顯示一條 line number。
2.png
這些情況會可能會影響 debug,但執行結果不會出錯,若不是這兩種情況,請回報。


6.5 使用 V3 compiler,用于延時的循環代碼被優化,怎么解決 ?
A:如下:
0.png
解決方法:將變量定義為 volatile,如下:
0.png
6.6 使用內嵌匯編,被優化掉 ?
如下:
asm(“mov %0,a”:”=m”(i));// 表示把 ACC 的值賦給 i,
因為之后變量 i 沒有被用到,所以這條語句被編譯程序優化掉,
0.jpg
如果要保留,可以改成:
asm volatile (“mov %0,a”:”=m”(i));
防止被優化
1.png
6.7 選擇優化參數后,延時函數時間發生變化。
A:延時函數的延時時間通常依賴于執行的指令數,選擇優化參數后,compiler 編 譯出的指令更精簡,從而影響延時時間,程序開發者應注意這點,在選擇優化 參數后,調整延時函數或使用 compiler 自帶的延時函數 GCC_DELAY(n)。

全部資料51hei下載地址:
合泰.pdf (2.21 MB, 下載次數: 81)
回復

使用道具 舉報

ID:17771 發表于 2019-5-10 15:29 | 顯示全部樓層
剛想用HT單片機,請幫助
回復

使用道具 舉報

ID:529540 發表于 2019-5-11 11:44 | 顯示全部樓層
ysy6450 發表于 2019-5-10 15:29
剛想用HT單片機,請幫助

同樣在學習
回復

使用道具 舉報

ID:342848 發表于 2019-8-28 11:05 | 顯示全部樓層
合泰單片機性價比高,學習中
回復

使用道具 舉報

ID:342848 發表于 2019-8-28 11:07 | 顯示全部樓層
正在學習合泰觸摸單片機
回復

使用道具 舉報

ID:721169 發表于 2020-4-3 12:48 來自手機 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:465596 發表于 2023-9-22 17:32 | 顯示全部樓層
下載文件是 Touch MCU Workshop v3.0
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区麻豆 | 国产乱肥老妇国产一区二 | 一区二区三区电影网 | 日本在线网站 | 亚洲欧美在线视频 | 成人国产在线观看 | 久久新| 欧美国产精品一区二区三区 | 亚洲一区二区三区观看 | 黄色片在线免费看 | 欧美日一区二区 | 国产一区91精品张津瑜 | 小草久久久久久久久爱六 | 欧美v免费 | 天天舔天天 | 亚洲一区视频在线 | 在线观看国产视频 | 性xxxxx| 殴美成人在线视频 | 国产传媒毛片精品视频第一次 | 亚洲国产高清在线观看 | 午夜影院在线观看 | 欧美一级在线 | 人人种亚洲 | 亚洲免费福利视频 | 青青草原精品99久久精品66 | 国产精品一区二区三区四区 | 国产欧美一区二区三区日本久久久 | 精品国产免费人成在线观看 | 天天操天天摸天天爽 | 69亚洲精品| 久久久精品网站 | 99热精品久久| 国产伦精品一区二区三区精品视频 | 国产一区| 成人激情视频在线观看 | 伦理片97| 欧美一卡二卡在线观看 | 精品国产精品国产偷麻豆 | 天天操网| 婷婷综合在线 |