日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TencentOS浅学过程记录

發(fā)布時間:2024/1/8 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TencentOS浅学过程记录 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

TencentOS淺學過程記錄

  • 前言
  • 一、RTOS
  • 二、學習資料來源
  • 三、初步學習過程中的疑難問題解決
    • 任務調(diào)度以及輪詢時間片
    • 消息隊列與郵箱隊列
    • 互斥鎖
    • 任務中為什么一定要加while(1)循環(huán)
    • 內(nèi)存管理
  • 三、實操問題解決
    • 使用TencentOS中的shell(即**CLI命令行**)
    • RTOS新手學習一定要注意**堆棧大小**
    • 使用動態(tài)內(nèi)存時記得要去tos_config.h文件中修改配置
    • 提醒

前言

大三下生產(chǎn)實習作業(yè),基于LoRaWAN的物聯(lián)網(wǎng)應用,剛好有一個選題是關于RTOS的,之前對于RTOS也有過一些了解,但是一直沒有真正的學習使用過,剛好借這個機會學習一波。(這里主要分享一下我在對于騰訊TencentOS學習使用過程中的一些收獲與問題解決過程)

一、RTOS

實時操作系統(tǒng)的概念這里不再贅述。相較于之前順序執(zhí)行的裸機編程,RTOS多任務執(zhí)行以及阻塞機制使得程序執(zhí)行效率更高,一些沒有必要執(zhí)行的代碼可以利用阻塞機制使它僅在必要的時候執(zhí)行,任務重要性可以按照優(yōu)先級分配,整體看起來就是我們想要哪些代碼執(zhí)行,哪些代碼不執(zhí)行都是可以控制調(diào)節(jié)的,這樣可以使重要的任務一直得到有效執(zhí)行,這樣程序執(zhí)行效率有很大提高。

二、學習資料來源

當前開源的RTOS非常多,剛開始我有了解到RT-Thread,Freertos,TencentOS,uCOS等等,但是對于新手大佬推薦RT-Thread比較多,畢竟是國產(chǎn)開源,相關資料手冊等等都是中文編寫,目前使用也比較廣泛,各處學習網(wǎng)站也有非常多的問題解決博客。當然TencentOS也是中文資料,只不過目前使用沒幾年使用量不是特別大,除過騰訊開源庫中的資料其他可借鑒的博客也比較少。至于為什么選擇TencentOS,作業(yè)時間留的有點短,杰杰大佬說TencentOS源碼實現(xiàn)非常精簡,沒有特別復雜的數(shù)據(jù)結(jié)構(gòu)在里面,對于新手接觸RTOS,簡單了解體驗RTOS中的一些任務通信機制非常友好好上手(當然C語言基礎得不錯)(不同公司開源的RTOS內(nèi)部任務同步以及通信機制大同小異),作業(yè)時間只有一個月,TencentOS正合我意。
我在學習過程中主要借鑒的學習資料有:

  • 騰訊TencentOS Github開源庫
  • _杰杰_大佬的TencentOS專欄
  • TencentOS QQ官方技術交流群:684946161
  • 以上以Github開源庫為主要資料,杰杰大佬的專欄寫于2019年左右,但是目前TencentOS在一些方面更新了很多,總之就是許多代碼不是以前的代碼了,但是大同小異,杰杰大佬專欄中對于郵箱,信號量,互斥鎖,事件等等的講解非常有助于對TencentOS中相關任務機制的理解。由于更新比較多,學習者在學習過程中還是有必要閱讀一下相關源碼的(會C就可以,源碼參考杰杰大佬的專欄會相對比較好理解)。
    GitHub中資料比較齊全

    其他的在CSDN上也是零零散散能找到多少是多少。

    三、初步學習過程中的疑難問題解決

    這里主要指在運行github提供的內(nèi)核開發(fā)指南中的例程源碼時,嘗試性的修改代碼產(chǎn)生的一系列問題以及對一些概念的理解。

    任務調(diào)度以及輪詢時間片

    1.任務調(diào)度:每一次任務調(diào)度即進入knl_sched()的時候,系統(tǒng)會去查找就緒態(tài)任務中優(yōu)先級最高的任務。如果優(yōu)先級最高的任務不止一個(相同優(yōu)先級的任務會按順序掛載在同一個列表中),系統(tǒng)會在同一優(yōu)先級任務列表中選取第一個進行執(zhí)行;

    2.輪詢時間片處理:當進入輪訓時間片處理程序時,系統(tǒng)會獲取當前任務以及當前任務的優(yōu)先級,然后判斷該優(yōu)先級列表中是否還有同優(yōu)先級的任務處于就緒態(tài),如果有就按照輪詢時間片機制,輪詢時間片數(shù)值依次減少。如果沒有同優(yōu)先級任務處于就緒狀態(tài),系統(tǒng)將不再執(zhí)行輪詢時間片機制。(這也就是說輪詢時間片僅在當任務就緒列表中同一個優(yōu)先級的任務有兩個以上時才會起作用,否則是不會起作用的);在輪詢時間片起作用的情況下,當一個任務執(zhí)行時間超出輪詢時間片的時間設定后,系統(tǒng)會把相同優(yōu)先級任務列表中第一個任務調(diào)換到最后一個,那么下一次系統(tǒng)調(diào)度即執(zhí)行knl_sched()時取最高優(yōu)先級的第一個任務(原先的任務插到了列表中的最后一個,這個時候已經(jīng)實現(xiàn)了任務被輪詢時間片強行切到了另外一個任務)
    代碼注釋簡單如下:

    //任務調(diào)度函數(shù) __KNL__ void knl_sched(void) {TOS_CPU_CPSR_ALLOC();if (unlikely(!tos_knl_is_running())) {return;}if (knl_is_inirq()) {return;}if (knl_is_sched_locked()) {return;}TOS_CPU_INT_DISABLE();k_next_task = readyqueue_highest_ready_task_get(); //取就緒態(tài)列表中最高優(yōu)先級列表中的第一個任務if (knl_is_self(k_next_task)) {//如果任務沒有發(fā)生切換(即正在執(zhí)行的任務就是當前就緒態(tài)列表中優(yōu)先級最高的那個任務),則不用設置上下文轉(zhuǎn)換TOS_CPU_INT_ENABLE();return;}cpu_context_switch();//如果切換到新的任務,那么需要進行上下文轉(zhuǎn)換TOS_CPU_INT_ENABLE(); } void SysTick_Handler(void) {HAL_IncTick();if(tos_knl_is_running()){tos_knl_irq_enter();tos_tick_handler();//時間片操作在這個里面tos_knl_irq_leave();} } __API__ void tos_tick_handler(void) {if (unlikely(!tos_knl_is_running())) {return;}tick_update((k_tick_t)1u); #if TOS_CFG_TIMER_EN > 0u && TOS_CFG_TIMER_AS_PROC > 0u//軟件定時器模塊soft_timer_update(); #endif#if TOS_CFG_ROUND_ROBIN_EN > 0urobin_sched(k_curr_task->prio);//執(zhí)行輪詢時間片 #endif } //時間片執(zhí)行函數(shù) __KNL__ void robin_sched(k_prio_t prio)//傳入當前運行任務的優(yōu)先級 {TOS_CPU_CPSR_ALLOC();k_task_t *task;TOS_CPU_INT_DISABLE();task = readyqueue_first_task_get(prio); //獲取就緒態(tài)任務中該優(yōu)先級列表中的第一個任務if (!task || knl_is_idle(task)) {TOS_CPU_INT_ENABLE();return;}if (readyqueue_is_prio_onlyone(prio)) { //查找就緒態(tài)任務中該優(yōu)先級列表中是否只有這一個任務,如果只有一個,就不需要使用輪詢時間片TOS_CPU_INT_ENABLE();return;}if (knl_is_sched_locked()) {TOS_CPU_INT_ENABLE();return;}if (task->timeslice > (k_timeslice_t)0u) { //如果就緒態(tài)任務中同一優(yōu)先級就緒列表中不止一個任務,那么按照輪詢時間片機制來處理--task->timeslice;//時間片數(shù)值減1}if (task->timeslice > (k_timeslice_t)0u) {TOS_CPU_INT_ENABLE();return;}readyqueue_move_head_to_tail(k_curr_task->prio); //任務執(zhí)行時間超過輪訓時間片設定時間,當前運行的任務會被移動到該優(yōu)先級列表中的尾部,使得其他任務移到前面,下次再進行任務調(diào)度時便實現(xiàn)了任務切換(即時間片起作用)task = readyqueue_first_task_get(prio); //這時當前任務已經(jīng)移動到了列表尾部,這里提取列表中的第一個,下面對該任務進行時間片數(shù)值設置if (task->timeslice_reload == (k_timeslice_t)0u) {task->timeslice = k_robin_default_timeslice;} else {task->timeslice = task->timeslice_reload;}TOS_CPU_INT_ENABLE();knl_sched();//執(zhí)行任務調(diào)度 }

    總結(jié):這個功能很雞肋,大部分時間沒什么用,而且這是一種強行切換,如果你的任務中存在互斥鎖,強行切換導致互斥鎖沒有來的及釋放,一定會出問題。(總之這是一種強行切換,一般情況下只有在任務中不加os_delay()時才會用到,而且在切換時不對原先任務中的互斥鎖等同步機制進行應急處理)。感覺沒什么用。

    消息隊列與郵箱隊列

    TencentOS里面提供了消息隊列,郵箱隊列以及優(yōu)先級消息隊列,優(yōu)先級郵箱隊列。底層實現(xiàn)主要是兩個分別是環(huán)形隊列和優(yōu)先級隊列來實現(xiàn),這兩個區(qū)別就是,環(huán)形隊列按照先入先出,優(yōu)先級隊列寫入時會記錄寫入的優(yōu)先級,彈出時會按照優(yōu)先級高低先后彈出。另外就是消息隊列和郵箱隊列的區(qū)別,消息隊列僅傳遞指針,郵箱隊列可以傳遞較大的內(nèi)存塊,底層實現(xiàn)都是環(huán)形隊列,只不過消息隊列存入的是指針即一個32位的地址,郵箱隊列可以存入一個結(jié)構(gòu)體中的所有數(shù)據(jù)。

    uint8_t msg_pool[MESSAGE_MAX * sizeof(void *)];//消息隊列存儲池MESSAGE_MAX*地址占內(nèi)存大小(更小)typedef struct mail_st {char *message;int payload; } mail_t; uint8_t mail_pool[MAIL_MAX * sizeof(mail_t)];//郵箱隊列存儲池MAIL_MAX*結(jié)構(gòu)體占內(nèi)存大小(更大)

    我的理解:郵箱隊列可以保證數(shù)據(jù)存入郵箱,數(shù)據(jù)沒有被接收之前不會丟失,但是消息隊列中的地址數(shù)據(jù)未被接收之前如果該地址指向的內(nèi)存數(shù)據(jù)發(fā)生變化,那么接收到之后的數(shù)據(jù)可能并不是你想傳遞的數(shù)據(jù)。(如果數(shù)據(jù)被更改時間間隔足夠長的話可以使用)。這個時候我覺得消息隊列還挺雞肋的,我還沒有想到一個消息隊列的合理利用場景,糾結(jié)于傳送地址,但地址數(shù)據(jù)發(fā)生改變不就亂了,希望大佬看到可以指點一下。這塊指出一下,不同的RTOS如騰訊還有FreeRTOS中的同步及通信機制原理上差不多但是使用時還是有區(qū)別的,比如FreeRTOS中的消息隊列和TencentOS中的郵箱一樣傳遞的是數(shù)據(jù)不是指針。

    互斥鎖

    互斥鎖中有一個優(yōu)先級翻轉(zhuǎn)的概念,優(yōu)先級翻轉(zhuǎn)會對程序中任務執(zhí)行產(chǎn)生很大的危害,高優(yōu)先級的任務得不到有效執(zhí)行,舉一個簡單的優(yōu)先級翻轉(zhuǎn)的例子:有四個任務A,B,C,優(yōu)先級分別為1,2,3,并且A與C在爭奪互斥鎖,某一時刻A,B均處于阻塞態(tài),任務C獲取到互斥鎖,此時鎖處于閉鎖狀態(tài)。接下來A任務到達就緒態(tài),因為優(yōu)先級高搶斷C執(zhí)行但是獲取不到鎖進入阻塞態(tài)。這是B到達就緒態(tài),由于B不需要互斥鎖且優(yōu)先級高于C,所以B搶斷C執(zhí)行。在這個過程中A想要執(zhí)行就必須等待B執(zhí)行完之后切換到C,C執(zhí)行完才能輪到A。然而A是優(yōu)先級最高的任務,這樣會使得系統(tǒng)中優(yōu)先級最高的任務無法得到有效執(zhí)行,嚴重的話會導致程序崩潰。

    TencentOS采用了優(yōu)先級繼承策略,當任務A申請鎖的時候,發(fā)現(xiàn)鎖在C的手里且C的優(yōu)先級低于A的優(yōu)先級,那么立馬將C的優(yōu)先級提高到和A等同的優(yōu)先級,那么C執(zhí)行過程中就不會被B打斷,即A只要等C執(zhí)行完就可以執(zhí)行了,不用等待B的執(zhí)行。這樣一定程度上削弱了優(yōu)先級翻轉(zhuǎn)的危害。

    當信號量為1的時候也可以當做互斥鎖用,但是由于信號量沒有設計優(yōu)先級繼承的東西,所有有可能造成優(yōu)先級翻轉(zhuǎn)。

    任務中為什么一定要加while(1)循環(huán)

    在RTOS初學過程中,有些時候就忘記寫while(1)了,執(zhí)行后發(fā)現(xiàn)咋突然就停下來了,甚是奇怪。每個任務也是一個函數(shù),切換任務時會保存上一個任務的上下文。如果沒有while(1),程序執(zhí)行完最后一句就結(jié)束了,函數(shù)執(zhí)行結(jié)束后函數(shù)里面的變量等等都會被釋放掉,該任務就被直接銷毀了,只有讓任務執(zhí)行函數(shù)處于循環(huán)當中,函數(shù)不會結(jié)束,任務才不會被銷毀。任務才能夠在調(diào)度時保存上下文,下次從原先離開的地方繼續(xù)執(zhí)行。這也就是我們在使用過程中看到任務函數(shù)只在while(1)內(nèi)部執(zhí)行,切換任務從哪里離開,下次就從哪里開始。

    內(nèi)存管理

    TencentOS中有兩種內(nèi)存管理,分別是靜態(tài)內(nèi)存管理和動態(tài)內(nèi)存管理。
    靜態(tài)內(nèi)存是在全局變量區(qū)開辟一塊待分配的內(nèi)存,可以對這片內(nèi)存進行管理(申請釋放定長內(nèi)存塊)。
    動態(tài)內(nèi)存是指在堆區(qū)申請釋放定長內(nèi)存塊。
    內(nèi)存泄漏:申請的內(nèi)存塊使用完之后一定要釋放,并且申請內(nèi)存的獲得的首地址不能丟失,相關內(nèi)存泄漏的知識可以參考其他博文。
    動態(tài)內(nèi)存管理參考示例:

    typedef struct {uint16_t rec_len;uint8_t rec_Buf[RECEIVELEN]; } usart_recv_mail;//接收郵箱消息的結(jié)構(gòu)體 uint8_t mail_lphuart1_pool[MAIL_MAX * sizeof(usart_recv_mail)];//郵箱內(nèi)存區(qū)存儲串口數(shù)據(jù) void entry_inf_get_from_lorawan_task(void *arg) {k_err_t err;usart_recv_mail recdata;size_t mail_size;while(1){usart_recv_mail *p = tos_mmheap_alloc(sizeof(usart_recv_mail));//在堆區(qū)申請一個usart_recv_mail大小的內(nèi)存,p指向分配的內(nèi)存的起始地址,這個指針不能丟失(即p只能指向這塊內(nèi)存的首地址),如果指向其他地方,這塊內(nèi)存就會發(fā)生內(nèi)存泄漏得不到利用。err = tos_mail_q_pend(&mail_lphuart1_inf, p, &mail_size, TOS_TIME_FOREVER);//等待郵箱中的消息,將等待到的消息存儲到p指向的內(nèi)存區(qū)if (err == K_ERR_NONE){TOS_ASSERT(mail_size == sizeof(usart_recv_mail));/* 等待lpuart1產(chǎn)生中斷 */if(UART_TO_LRM_RECEIVE_FLAG){UART_TO_LRM_RECEIVE_FLAG = 0;usart2_send_data((*p).rec_Buf,(*p).rec_len);//因為p就是usart_recv_mail結(jié)構(gòu)體類型,所以可以像結(jié)構(gòu)體一樣使用}}tos_mmheap_free(p);//使用完之后記得一定要釋放內(nèi)存tos_task_delay(500);//任務睡眠} }

    總結(jié):按照我的理解,動態(tài)內(nèi)存的使用是在當原先任務堆棧大小設置的較小,而實際任務中需要使用更大的內(nèi)存,也就是說,原先任務堆棧大小不能滿足程序運行的需要,為了程序正常運行,我們需要從堆區(qū)開辟一塊動態(tài)內(nèi)存來使得程序正常運行,程序運行完之后把內(nèi)存釋放掉用于其他。

    三、實操問題解決

    這塊主要是我在完成生產(chǎn)實習作業(yè)過程中即實際開始自己碼代碼過程中遇到的疑難問題解決。

    使用TencentOS中的shell(即CLI命令行)

    命令行類似一種對話框,基本邏輯就是PC端通過串口輸入命令,單片機破解命令執(zhí)行對應的功能函數(shù)。TencentOS自帶shell中包括了help(查詢有哪些命令,分別是哪些功能)、ps(每個任務的堆棧大小以及實際運行中的堆棧深度),還有free(查詢程序內(nèi)存使用情況)。我們也可以添加自己的命令對單片機進行控制。(總之使用起來非常方便)
    shell文件位置(開源庫中的文件)


    shell中的文件全部移進去,包含一些頭文件啥的,反正都在github下載的這些文件中,找一下就有。
    最后總共就這么多就夠了。

    TencentOS的shell是用字符輸入輸出隊列配合信號量實現(xiàn)的。簡單來說就是你在串口助手界面輸入一個字符,shell代碼會將獲取到的字符塞入到字符隊列中去,同時信號量加一。另一邊任務函數(shù)會根據(jù)信號量的多少進行字符循環(huán)獲取保存并回傳給PC,信號量為零則進行阻塞。當任務函數(shù)檢測到有\(zhòng)n,\r時則會跳出循環(huán),將之前保存的字符與命令庫中的命令進行對比,如果對比正確則執(zhí)行響應函數(shù),對比錯誤就回傳"command not found\r\n"
    核心代碼如下:

    __API__ void tos_shell_input_byte(uint8_t data) {if (tos_chr_fifo_push(&SHELL_CTL->shell_rx_fifo, data) == K_ERR_NONE) {//把獲取到的字符添加到字符隊列中去tos_sem_post(&SHELL_CTL->shell_rx_sem);//同時釋放一個信號量} }//這個函數(shù)是要放到串口接收中斷中去的 //shell任務執(zhí)行函數(shù) __STATIC__ void shell_parser(void *arg) {int rc;shell_prompt();while (K_TRUE) {rc = shell_readline();//按照信號量多少循環(huán)讀取字符并回傳給PC,信號量為0則阻塞,直到檢測到回車或換行才會跳出,rc指接收到的字符個數(shù)if (rc > 0) {shell_cmd_process();//如果接收到字符就進行命令對比并執(zhí)行相關函數(shù)}shell_prompt();//返回PC一個回車換行} }//這個任務沒有睡眠,僅僅根據(jù)信號量來控制執(zhí)行與阻塞。

    效果:

    RTOS新手學習一定要注意堆棧大小

    任務程序運行都是在分配的堆棧內(nèi)存中運行的,如果分配的堆棧內(nèi)存不夠,程序就會直接暴斃(進入硬件錯誤中斷)。所以新手在調(diào)試程序過程中可以嘗試:
    1.硬件錯誤中斷中加入printf函數(shù)用于提醒你進入了硬件中斷(這個時候首先考慮堆棧內(nèi)存不夠問題)
    2.如果直接導入了shell文件,可以通過"ps"命令直接進行獲取當前任務的吃棧深度。一般所有的任務堆棧大小盡量先設置的大一些,然后ps命令看一下最大吃棧深度有多深,最后根據(jù)最大吃棧深度調(diào)整任務堆棧大小(單片機內(nèi)存還是要省著用的)

    stk size代表設定的堆棧大小stk depth代表程序?qū)嶋H運行時所使用到的最大棧深度
    3.TencentOS提供了,獲取最大吃棧深度的函數(shù)

    k_err_t tos_task_stack_draught_depth(k_task_t *task, int *depth); //獲取一個任務棧的最大吃水深度

    使用動態(tài)內(nèi)存時記得要去tos_config.h文件中修改配置

    可以把最初給的大小根據(jù)實際情況改大一點,否則后邊的大內(nèi)存申請會有問題。

    #define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0xA00 // 配置TencentOS tiny默認動態(tài)內(nèi)存池大小

    提醒

    代碼中有詳細注釋

    總結(jié)

    以上是生活随笔為你收集整理的TencentOS浅学过程记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 中文字幕无码精品亚洲35 | 亚洲精品a区 | 午夜草草| 精品视频久久久久久 | 日韩经典一区二区三区 | 超碰网址 | 99热8| 日本久久一级片 | 天天干天天操天天碰 | 国产精品偷伦视频免费观看了 | 国产黄色一区二区 | 嫩草嫩草嫩草嫩草嫩草 | 午夜三级福利 | 午夜视频网站在线观看 | 天天操天天干天天操 | 久久午夜夜伦鲁鲁片 | 日韩熟妇一区二区三区 | 久久久久久久久91 | 色爱视频 | 制服av网 | 色欲AV无码精品一区二区久久 | 欧美成人一级视频 | 高潮无码精品色欲av午夜福利 | 黄色片在线看 | 福利在线免费 | h网站免费在线观看 | 欧美日韩国产麻豆 | 久久久久亚洲av无码专区 | 制服 丝袜 激情 欧洲 亚洲 | 国产激情无套内精对白视频 | 日日日日日日 | 三级毛毛片 | 成人精品久久 | 欧美日本在线观看 | 免费在线看污 | 精品人妻一区二区三区日产 | 成年人视频在线观看免费 | 91中文国产 | 性视频免费看 | 韩国三级hd中文字幕的背景音乐 | 19禁大尺度做爰无遮挡电影 | 公侵犯人妻中文字慕一区二区 | 国产a级精品 | 香港三级韩国三级日本三级 | 亚洲小说区图片区都市 | 国产精华7777777 | 天堂成人国产精品一区 | 国产伦精品一区二区三区视频我 | 久久最新免费视频 | 森林影视官网在线观看 | 夜夜爽妓女8888视频免费观看 | 日韩精品视频免费播放 | 瑟瑟视频免费观看 | 亚洲午夜精品久久久久久人妖 | 午夜va | 五月天综合婷婷 | 91九色在线观看 | 日韩一三区 | 福利电影在线播放 | 欧美性猛交xxxx黑人 | 少妇无码一区二区三区免费 | 美女裸片 | 中文字幕在线观看一区二区 | 精品国产一区二区三区无码 | 欧美另类xxxx野战 | 中文字幕一区二区三区手机版 | 国产精品扒开腿做爽爽爽a片唱戏 | 欧美大屁股熟妇bbbbbb | 天天国产视频 | 伊人艹| 国产精品入口a级 | 免费观看一级一片 | 四级黄色片 | 亚洲4p | 中文字幕日韩亚洲 | 中文字幕乱码人妻二区三区 | 日韩高清免费观看 | 丰满人妻熟妇乱偷人无码 | 天天爽天天爽 | 亚洲激情精品 | 中文字幕在线第一页 | 日韩精品第1页 | 岛国精品在线播放 | 国产午夜精品久久久久久久 | 日本视频不卡 | 国产黄色片免费看 | 欧美成人极品 | 久久在线播放 | 偷拍青青草 | 亚洲精品天堂网 | 日韩av无码一区二区三区 | 精品一区二区av | 久久婷婷亚洲 | 怡春院一区二区 | 国产性―交―乱―色―情人 | 欧美丝袜一区二区 | 好邻居韩国剧在线观看 | 亚洲区视频在线观看 | 在线日韩视频 |