日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

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

编程问答

os_mutex.c(全)

發布時間:2025/3/21 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 os_mutex.c(全) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  • 無等待地獲取互斥型信號量?OSMutexAccept (OS_EVENT ?*pevent,INT8U ?*perr):
  • 創建互斥型信號量OS_EVENT ?*OSMutexCreate (INT8U ? prio,INT8U ?*perr)
  • 刪除信號量OS_EVENT ?*OSMutexDel (OS_EVENT ?*pevent,INT8U ?opt,INT8U ?*perr)
  • 等待互斥型信號量void ?OSMutexPend (OS_EVENT ?*pevent,INT32U ?timeout,INT8U ?*perr)
  • 釋放一個互斥型信號量?OSMutexPost (OS_EVENT *pevent)
  • 查詢互斥量OSMutexQuery (OS_EVENT ?*pevent,OS_MUTEX_DATA ?*p_mutex_data)

?OSMutexAccept (OS_EVENT ?*pevent,INT8U ? ? *perr):

若是信號量可用就使用信號量,若是不可用就去執行其他代碼,不阻塞等待。 若是有可用的,那么其操作跟請求互斥信號量OSMutexPend的信號量可用時執行代碼部分是一樣的。 /*$PAGE*/ /*2018/2/19 ********************************************************************************************************* * ACCEPT MUTUAL EXCLUSION SEMAPHORE * 無等待地獲取互斥型信號量 * Description: This function checks the mutual exclusion semaphore to see if a resource is available. * Unlike OSMutexPend(), OSMutexAccept() does not suspend the calling task if the resource is * not available or the event did not occur. *描述: 檢查互斥型信號量,以判斷某資源是否可以使用,與 OSMutexPend()不同的是,若資源不能使用,則調用 OSMutexAccept()函數的任務并不被掛起, OSMutexAccept()僅查詢狀態。 * Arguments : pevent is a pointer to the event control block *參數: pevent:指向事件控制塊的指針 * perr is a pointer to an error code which will be returned to your application: * OS_ERR_NONE if the call was successful. * OS_ERR_EVENT_TYPE if 'pevent' is not a pointer to a mutex * OS_ERR_PEVENT_NULL 'pevent' is a NULL pointer * OS_ERR_PEND_ISR if you called this function from an ISR * OS_ERR_PIP_LOWER If the priority of the task that owns the Mutex is * HIGHER (i.e. a lower number) than the PIP. This error * indicates that you did not set the PIP higher (lower * number) than ALL the tasks that compete for the Mutex. * Unfortunately, this is something that could not be * detected when the Mutex is created because we don't know * what tasks will be using the Mutex. * perr: 指向錯誤碼的指針。可以有以下幾種選擇:OS_ERR_NONE:無錯誤OS_ERR_EVENT_TYPE:pevent不是指向mutex類型的指針OS_ERR_PEVENT_NULL:pevent為空指針OS_ERR_PEND_ISR:在中斷服務子程序中調用OS_ERR_PIP_LOWER:正在使用mutex的任務優先級高于PIP。 * Returns : == OS_TRUE if the resource is available, the mutual exclusion semaphore is acquired * == OS_FALSE a) if the resource is not available * b) you didn't pass a pointer to a mutual exclusion semaphore * c) you called this function from an ISR *返回值: ==OS_TRUE:資源可以獲得,互斥型信號量可以獲得==OS_FALSE:a)無法獲得資源b)沒有指向互斥型信號量的指針c)從中斷服務子程序中調用該功能 * Warning(s) : This function CANNOT be called from an ISR because mutual exclusion semaphores are * intended to be used by tasks only. 警告:該功能不能從中斷中調用,因為互斥型信號量只能被任務調用。 ********************************************************************************************************* */#if OS_MUTEX_ACCEPT_EN > 0u BOOLEAN OSMutexAccept (OS_EVENT *pevent,INT8U *perr) {INT8U pip; /* Priority Inheritance Priority (PIP)優先級繼承優先級*/#if OS_CRITICAL_METHOD == 3u /*中斷類型被設置為類型3*/OS_CPU_SR cpu_sr = 0u;#endif#ifdef OS_SAFETY_CRITICAL /*安全中斷*/if (perr == (INT8U *)0) {OS_SAFETY_CRITICAL_EXCEPTION();}#endif#if OS_ARG_CHK_EN > 0u /*參數檢查*/if (pevent == (OS_EVENT *)0) { *perr = OS_ERR_PEVENT_NULL;return (OS_FALSE);}#endifif (pevent->OSEventType != OS_EVENT_TYPE_MUTEX)/*有效化事件控制塊類型*/{ *perr = OS_ERR_EVENT_TYPE;return (OS_FALSE);}if (OSIntNesting > 0u) /*判斷是否從中斷服務子程序中調用*/{ *perr = OS_ERR_PEND_ISR;return (OS_FALSE);}OS_ENTER_CRITICAL(); /*進入中斷*/pip = (INT8U)(pevent->OSEventCnt >> 8u); /* 從mutex中獲得PIP,pip存放在OSEventCnt的高八位中*/if ((pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE)/*/獲得Mutex的值(0或1),OSEventCnt相與0x00ff后判斷。OSEventCnt低8為0xff*/{pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /*如果Mutex(高8位PIP)有效,將PIP保存到OSEventCnt的高8位(相與0xffoo)*/pevent->OSEventCnt |= OSTCBCur->OSTCBPrio; /*把該任務的優先級寫到OSEventCnt的低8位(相或OSTCBPrio)*/pevent->OSEventPtr = (void *)OSTCBCur; /*將Mutex的事件控制塊ECB鏈接到該任務的任務控制塊*/if (OSTCBCur->OSTCBPrio <= pip) /*如果當前TCB的優先級數值不大于pip,即優先級高*/{ OS_EXIT_CRITICAL(); /*退出中斷*/*perr = OS_ERR_PIP_LOWER; /*將錯誤類型設置為OS_ERR_PIP_LOWER,無法執行該任務*/} else /*如果當前TCB的優先級小于pip*/{ OS_EXIT_CRITICAL(); /*退出中斷*/*perr = OS_ERR_NONE;/*成功調用該函數*/}return (OS_TRUE);/*檢查狀態,可以獲得互斥型信號量*/}OS_EXIT_CRITICAL();/*退出中斷*/*perr = OS_ERR_NONE;/*將錯誤類型設置為無錯誤*/return (OS_FALSE); /*檢查狀態后確認不可以獲得互斥型信號量*/ } #

要注意該函數返回的是一個布爾值,表示能否獲得互斥量。

在這個函數中,需要對下面幾行進行解釋:

pip = (INT8U)(pevent->OSEventCnt >> 8u); /* 從mutex中獲得PIP,pip存放在OSEventCnt的高八位中*/ if ((pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE)

pip是priority inheritance priority,優先級繼承優先級。對于互斥型信號量,可能存在很多任務爭奪一個的情況,此時,可能發生優先級反轉現象(可以參考之前文章OS_CORE.C(6),點擊打開鏈接)。pip就是為了防止優先級反轉設置的。簡單來說,如果當前任務優先級比繼承優先級低,不會反轉,不需要pip。如果比繼承優先級高,會反轉,那么將當前任務優先級設置為pip,這樣就不會發生反轉了。

OSEventCnt的低8位存放的是OS_MUTEX_AVAILABLE,如果if判斷后檢查結果仍為OS_MUTEX_AVAILABLE,則說明互斥鎖沒有被占用,這時候就要保存當前運行任務的優先級到OSEventCnt的低8位中,語句為:

pevent->OSEventCnt |= OSTCBCur->OSTCBPrio;

然后比較一下當前任務的優先級是否比創建時的繼承優先級低(優先級值大),如果當前任務的優先級比繼承優先級高(數值小),則返回錯誤,語句為:

if (OSTCBCur->OSTCBPrio <= pip)????????/*如果當前TCB的優先級數值不大于pip,即優先級高*/{ OS_EXIT_CRITICAL(); /*退出中斷*/*perr = OS_ERR_PIP_LOWER;/*將錯誤類型設置為OS_ERR_PIP_LOWER,無法執行該任務*/}

因為繼承優先級是為了防止優先級翻轉而設定,如果當前任務優先級比繼承優先級低則不需要擔心優先級反轉,則返回正確值。


創建互斥型信號量OS_EVENT *OSMutexCreate(INT8U prio,INT8U *perr):

/*$PAGE*/ /*2018/2/19 ********************************************************************************************************* * CREATE A MUTUAL EXCLUSION SEMAPHORE * 創建互斥型信號量 * Description: This function creates a mutual exclusion semaphore. *描述:該功能用來新建互斥型信號量。 * Arguments : prio is the priority to use when accessing the mutual exclusion semaphore. In * other words, when the semaphore is acquired and a higher priority task * attempts to obtain the semaphore then the priority of the task owning the * semaphore is raised to this priority. It is assumed that you will specify * a priority that is LOWER in value than ANY of the tasks competing for the * mutex. *參數: --prio:獲得互斥型信號量的任務的優先級。換句話說,當有任務已經獲得了信號量,但是更高優先級任務嘗試獲得該信號量時,占有信號量的任務將其優先級提高到高優先級。。此時任務的優先級比所有競爭mutex的任務優先級都高。 * perr is a pointer to an error code which will be returned to your application: * OS_ERR_NONE if the call was successful. * OS_ERR_CREATE_ISR if you attempted to create a MUTEX from an ISR * OS_ERR_PRIO_EXIST if a task at the priority inheritance priority * already exist. * OS_ERR_PEVENT_NULL No more event control blocks available. * OS_ERR_PRIO_INVALID if the priority you specify is higher that the * maximum allowed (i.e. > OS_LOWEST_PRIO) * --perr:指向錯誤碼的指針,取值如下:OS_ERR_NONE:無錯誤;OS_ERR_CREATE_ISR:從中斷服務子程序中創建mutexOS_ERR_PRIO_EXIST:優先級為PIP的任務已經存在;OS_ERR_PEVENT_NULL:沒有可用的事件控制塊OS_ERR_PRIO_INVALID:定義的優先級非法,其值大于OS_LOWEST_PRIO. * Returns : != (void *)0 is a pointer to the event control clock (OS_EVENT) associated with the * created mutex. * == (void *)0 if an error is detected. *返回值: !=0 返回一個指針 ,該指針指向分配給mutex的事件控制塊。==0 有錯誤,返回空指針。 * Note(s) : 1) The LEAST significant 8 bits of '.OSEventCnt' are used to hold the priority number * of the task owning the mutex or 0xFF if no task owns the mutex. * * 2) The MOST significant 8 bits of '.OSEventCnt' are used to hold the priority number * to use to reduce priority inversion. 注釋: 1)OSEventCnt的低八位用來表示擁有互斥量任務的優先級,如果沒有任務擁有該互斥量,低八位為0xff2)OSEventCnt的高八位存放的優先級是用來減少優先級反轉 ********************************************************************************************************* */OS_EVENT *OSMutexCreate (INT8U prio,INT8U *perr) {OS_EVENT *pevent;/*指向事件控制塊的指針*/ mutex首先會檢查傳入優先級的任務的TCB有沒有已經被使用,如果傳入優先級已經被使用,則創建失敗,返回錯誤,如果參數傳入的優先級的TCB沒有被占用,則設置為reserved,保證該TCB不會被其他任務使用。語句如下: OS_ENTER_CRITICAL();/*進入中斷*/if (OSTCBPrioTbl[prio] != (OS_TCB *)0) /*檢查傳入優先級的任務的TCB是否被占用*/{ OS_EXIT_CRITICAL(); *perr = OS_ERR_PRIO_EXIST; return ((OS_EVENT *)0);}OSTCBPrioTbl[prio] = OS_TCB_RESERVED;/*如果沒有被占用,則設置為reserved*/

再檢查是否有空閑的事件控制塊,如果沒有返回空指針,如果有,進行相關操作:

pevent = OSEventFreeList;/*得到一個事件控制塊 */if (pevent == (OS_EVENT *)0) /*如果沒有空閑的事件控制塊*/{ OSTCBPrioTbl[prio] = (OS_TCB *)0; /*將優先級表對應的位置清0 */OS_EXIT_CRITICAL();/*退出中斷*/*perr = OS_ERR_PEVENT_NULL; /*將錯誤碼設置為OS_ERR_PEVENT_NULL*/return (pevent);/*返回一個空指針*/}/*如果有空閑的事件控制塊*/OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr; /*調整事件空閑列表*/OS_EXIT_CRITICAL();/*退出中斷*/pevent->OSEventType = OS_EVENT_TYPE_MUTEX;/*將事件類型設置為mutex*/pevent->OSEventCnt = (INT16U)((INT16U)prio << 8u) | OS_MUTEX_AVAILABLE;pevent->OSEventPtr = (void *)0; /*沒有任務使用mutex*/#if OS_EVENT_NAME_EN > 0upevent->OSEventName = (INT8U *)(void *)"?";/*如果事件有名稱,設置為未命名*/#endifOS_EventWaitListInit(pevent);/*事件等待列表初始化*/

這幾行語句中解釋一下:

pevent->OSEventCnt = (INT16U)((INT16U)prio << 8u) | OS_MUTEX_AVAILABLE;

prio左移8位,將優先級存放在OSEventCnt中的高八位,再與OS_MUTEX_AVAILABLE進行或運算,即OSEventCnt的低八位00與OS_MUTEX_AVAILABLE進行運算,如果運算結果為全ff,則說明可以獲得mutex,否則不可以獲得。


刪除信號量OS_EVENT ?*OSMutexDel (OS_EVENT ?*pevent,INT8U ?opt,INT8U ?*perr):(部分代碼)

/*$PAGE*/ /*2018/2/19 ********************************************************************************************************* * DELETE A MUTEX * 刪除信號量 * Description: This function deletes a mutual exclusion semaphore and readies all tasks pending on the it. *描述:該功能用來刪除互斥量并且將所有的任務就緒 * Arguments : pevent is a pointer to the event control block associated with the desired mutex. *參數: --pevent:指向事件控制塊的指針 * opt determines delete options as follows: * opt == OS_DEL_NO_PEND Delete mutex ONLY if no task pending * opt == OS_DEL_ALWAYS Deletes the mutex even if tasks are waiting. * In this case, all the tasks pending will be readied. * --opt:兩種刪除方式:OS_DEL_NO_PEND:只有沒有任務掛起時才能刪除該互斥量;OS_DEL_ALWAYS:無論有沒有掛起都刪除,這種情況下,所有的任務都從掛起狀態轉化為就緒態。 * perr is a pointer to an error code that can contain one of the following values: * OS_ERR_NONE The call was successful and the mutex was deleted * OS_ERR_DEL_ISR If you attempted to delete the MUTEX from an ISR * OS_ERR_INVALID_OPT An invalid option was specified * OS_ERR_TASK_WAITING One or more tasks were waiting on the mutex * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a mutex * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer. * --perr:指向錯誤碼的指針,可以有以下值:OS_ERR_NONE:無錯誤;OS_ERR_DEL_ISR:從中斷服務子程序刪除;OS_ERR_INVALID_OPT:opt為無效值;OS_ERR_TASK_WAITING:一個或者多個任務正在等待mutex;OS_ERR_EVENT_TYPE:沒有指向mutex的指針;OS_ERR_PEVENT_NULL:pevent為空指針。 * Returns : pevent upon error * (OS_EVENT *)0 if the mutex was successfully deleted. *返回值:如果mutex已經刪除,則返回空指針;如果mutex沒能刪除,則返回pevent * Note(s) : 1) This function must be used with care. Tasks that would normally expect the presence of * the mutex MUST check the return code of OSMutexPend(). *注釋: 1)該功能必須小心使用,因為其他任務可能會用到mutex。需要該信號量的任務必須檢測OSMutexPend()的返回值。 * 2) This call can potentially disable interrupts for a long time. The interrupt disable * time is directly proportional to the number of tasks waiting on the mutex. * 2)調用該函數時不能被中斷。中斷時間與等待該信號量的任務數量有關。 * 3) Because ALL tasks pending on the mutex will be readied, you MUST be careful because the * resource(s) will no longer be guarded by the mutex. * 3)因為在刪除信號量之后,所有掛起的任務都自動轉為就緒態,所以你必須小心,因為資源此時不再被mutex控制。 * 4) IMPORTANT: In the 'OS_DEL_ALWAYS' case, we assume that the owner of the Mutex (if there * is one) is ready-to-run and is thus NOT pending on another kernel object or * has delayed itself. In other words, if a task owns the mutex being deleted, * that task will be made ready-to-run at its original priority.4)重點:在OS_DEL_ALWAYS情況下,我們任務mutex的擁有者(假設只有一個)已經準備運行,并且不在其他內核對象中等待(掛起)或者自身延遲。換句話說,如果擁有互斥量的任務被刪除了,該任務將會以之前原始的優先級存在。 ********************************************************************************************************* */#if OS_MUTEX_DEL_EN > 0u OS_EVENT *OSMutexDel (OS_EVENT *pevent,INT8U opt,INT8U *perr) {BOOLEAN tasks_waiting;/*布爾值看是否有任務正在等待*/OS_EVENT *pevent_return;/*返回值*/INT8U pip; /*繼承優先級*/INT8U prio;/*原始優先級*/OS_TCB *ptcb;/*指向TCB的指針*/

先檢查是否有任務正在等待信號量。然后選擇刪除方式,進行刪除。

OS_ENTER_CRITICAL();/*進入中斷*/if (pevent->OSEventGrp != 0u)/*檢查是否有任務正在等待該信號量*/{ tasks_waiting = OS_TRUE; } else{tasks_waiting = OS_FALSE; }switch (opt) /*選擇刪除方式*/{case OS_DEL_NO_PEND:/*沒有等待信號量的任務時才刪除*/if (tasks_waiting == OS_FALSE) /*沒有任務等待*/{#if OS_EVENT_NAME_EN > 0upevent->OSEventName = (INT8U *)(void *)"?";/*如果有名稱,將名稱設置為未命名*/#endifpip = (INT8U)(pevent->OSEventCnt >> 8u);/*將OSEventCnt的高八位賦值給pip,獲得繼承優先級*/OSTCBPrioTbl[pip] = (OS_TCB *)0; /*在優先級表中釋放pip所在的tcb */pevent->OSEventType = OS_EVENT_TYPE_UNUSED;/*將事件類型設置為未使用類型*/pevent->OSEventPtr = OSEventFreeList;/*將事件控制塊返回給空閑事件列表 */pevent->OSEventCnt = 0u;OSEventFreeList = pevent;/*更新空閑事件列表*/OS_EXIT_CRITICAL();/*退出中斷*/*perr = OS_ERR_NONE;pevent_return = (OS_EVENT *)0;/*信號量已經被刪除,返回空指針*/} else/*有任務等待*/{OS_EXIT_CRITICAL();/*退出中斷*/*perr = OS_ERR_TASK_WAITING;pevent_return = pevent;}break;case OS_DEL_ALWAYS:/*無論怎樣都刪除*/pip = (INT8U)(pevent->OSEventCnt >> 8u); /*得到繼承優先級*/prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);/*得到原始的優先級*/ptcb = (OS_TCB *)pevent->OSEventPtr;/*指向TCB的指針*/if (ptcb != (OS_TCB *)0)/*如果有空閑的TCB*/{ /* See if any task owns the mutex */if (ptcb->OSTCBPrio == pip) /*看原始的優先級是否改變了,即是否解決過優先級反轉*/{ OSMutex_RdyAtPrio(ptcb, prio); /*原始優先級改變,將其存儲。待任務完成后恢復*/}}while (pevent->OSEventGrp != 0u) /*如果有事件組,即有任務在等待該信號量*/{ (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX, OS_STAT_PEND_OK);/*將所有任務轉為就緒態*/}#if OS_EVENT_NAME_EN > 0upevent->OSEventName = (INT8U *)(void *)"?";/*將事件名稱設置為未命名*/#endifpip = (INT8U)(pevent->OSEventCnt >> 8u);/*獲得pip*/OSTCBPrioTbl[pip] = (OS_TCB *)0; pevent->OSEventType = OS_EVENT_TYPE_UNUSED;pevent->OSEventPtr = OSEventFreeList; pevent->OSEventCnt = 0u;OSEventFreeList = pevent; OS_EXIT_CRITICAL();if (tasks_waiting == OS_TRUE) /*如果有任務等待*/{ OS_Sched();/*在就緒任務中找到優先級最高的任務進行調度*/}*perr = OS_ERR_NONE;pevent_return = (OS_EVENT *)0;break;default:/*其他情況*/OS_EXIT_CRITICAL();*perr = OS_ERR_INVALID_OPT;/*選擇無效*/pevent_return = pevent;break;}return (pevent_return); } #endif

該函數較為簡單,不贅述。


等待互斥型信號量void ?OSMutexPend (OS_EVENT ?*pevent,INT32U timeout,INT8U ?*perr):

/*$PAGE*/ /*2018/2/19 ********************************************************************************************************* * PEND ON MUTUAL EXCLUSION SEMAPHORE * 等待互斥型信號量 * Description: This function waits for a mutual exclusion semaphore. *描述:該功能用來等待互斥型信號量 * Arguments : pevent is a pointer to the event control block associated with the desired mutex. *參數: --pevent:指向事件控制塊的指針 * timeout is an optional timeout period (in clock ticks). If non-zero, your task will * wait for the resource up to the amount of time specified by this argument. * If you specify 0, however, your task will wait forever at the specified * mutex or, until the resource becomes available. * --timeout:可選擇的時間超時片。如果不為0,任務將等待資源直到時間到了該參數規定的時間。超時后,將不再等待。如果為0,任務將永遠處于等待,直到資源可以獲得。 * perr is a pointer to where an error message will be deposited. Possible error * messages are: * OS_ERR_NONE The call was successful and your task owns the mutex * OS_ERR_TIMEOUT The mutex was not available within the specified 'timeout'. * OS_ERR_PEND_ABORT The wait on the mutex was aborted. * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a mutex * OS_ERR_PEVENT_NULL 'pevent' is a NULL pointer * OS_ERR_PEND_ISR If you called this function from an ISR and the result * would lead to a suspension. * OS_ERR_PIP_LOWER If the priority of the task that owns the Mutex is * HIGHER (i.e. a lower number) than the PIP. This error * indicates that you did not set the PIP higher (lower * number) than ALL the tasks that compete for the Mutex. * Unfortunately, this is something that could not be * detected when the Mutex is created because we don't know * what tasks will be using the Mutex. * OS_ERR_PEND_LOCKED If you called this function when the scheduler is locked * --perr:指向錯誤信息的指針。有可能的錯誤信息如下:OS_ERR_NONE:無錯誤;OS_ERR_TIMEOUT:超時錯誤;OS_ERR_PEND_ABORT:等待信號量的任務被取消;OS_ERR_EVENT_TYPE:沒有指向mutex的指針;OS_ERR_PEVENT_NULL:pevent是空指針;OS_ERR_PEND_ISR:從中斷服務子程序中調用該功能;OS_ERR_PIP_LOWER:當前任務優先級比pip高。 * Returns : none *返回值:無 * Note(s) : 1) The task that owns the Mutex MUST NOT pend on any other event while it owns the mutex. *注釋:1)擁有信號量的任務不能再其他事件中處于掛起狀態。 * 2) You MUST NOT change the priority of the task that owns the mutex2)不能改變擁有mutex的任務的優先級。 ********************************************************************************************************* */void OSMutexPend (OS_EVENT *pevent,INT32U timeout,INT8U *perr) {INT8U pip; /*繼承優先級*/INT8U mprio; /*擁有信號量的任務的優先級*/BOOLEAN rdy; /*標志任務是否就緒*/OS_TCB *ptcb;/*指向TCB的指針*/OS_EVENT *pevent2;/*指向事件控制塊的指針*/INT8U y;檢測互斥量是否為可獲得的。如果可獲得,則判斷當前任務的優先級和pip優先級高低。如果不可獲得,需要判斷兩次:第一判斷擁有互斥量任務的優先級與pip優先級高低;第二判斷擁有互斥量任務的優先級與當前任務優先級的高低。

如果檢測互斥量是可獲得的,表示沒有任務使用互斥鎖,這時候運行該函數的任務將獲得互斥鎖并退出。如果不是可獲得的,表示一個新的任務在嘗試獲得互斥鎖,并且互斥鎖已經被占用時的操作。代碼如下:

OS_ENTER_CRITICAL();/*進入中斷*/pip = (INT8U)(pevent->OSEventCnt >> 8u);/*獲得PIP,繼承優先級*//*檢測互斥量是否為可獲得的*/if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE){pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;/*修改高8位的數據,這個時候高8位數據不變,還是表示繼承優先級,低8位清零*/pevent->OSEventCnt |= OSTCBCur->OSTCBPrio;/*將申請任務的優先級保存在低8位之中。低八位不可能全部都為零,所以依舊可以表示信號量是否被占用*/pevent->OSEventPtr = (void *)OSTCBCur; /*OSEventPtr指針指向任務控制塊 */if (OSTCBCur->OSTCBPrio <= pip)/*如果當前任務的優先級比pip優先級高*/{ OS_EXIT_CRITICAL(); *perr = OS_ERR_PIP_LOWER;}else /*當前任務優先級低*/{OS_EXIT_CRITICAL();*perr = OS_ERR_NONE;}return;}

上面這一段代碼是互斥量為可獲得的。

下面這段代碼為互斥量不可獲得的:

/*如果該互斥量不可獲得*/mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /*得到擁有互斥量的任務的優先級*/ptcb = (OS_TCB *)(pevent->OSEventPtr); /* 指針指向擁有互斥量的TCB*/if (ptcb->OSTCBPrio > pip) /*獲得互斥量的任務的優先級比pip優先級低*/{ if (mprio > OSTCBCur->OSTCBPrio)/*獲得互斥量任務的優先級比當前任務優先級低*/{y = ptcb->OSTCBY;if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0u) /*看擁有互斥量的任務是否就緒*/{ OSRdyTbl[y] &= (OS_PRIO)~ptcb->OSTCBBitX;/*如果就緒,將其從就緒表中移除*/if (OSRdyTbl[y] == 0u){ OSRdyGrp &= (OS_PRIO)~ptcb->OSTCBBitY;/*從就緒組中移除*/}rdy = OS_TRUE;/*將就緒標志設置為true*/} else/*擁有互斥量的任務沒就緒*/{pevent2 = ptcb->OSTCBEventPtr;/*pevent2指向擁有互斥量的事件*/if (pevent2 != (OS_EVENT *)0) /*如果該事件不為空,將其從事件表中刪除*/{ y = ptcb->OSTCBY;pevent2->OSEventTbl[y] &= (OS_PRIO)~ptcb->OSTCBBitX;if (pevent2->OSEventTbl[y] == 0u) {pevent2->OSEventGrp &= (OS_PRIO)~ptcb->OSTCBBitY;}}rdy = OS_FALSE; /*將其就緒狀態設置為false*/}ptcb->OSTCBPrio = pip; /*將有互斥量的任務的優先級改為pip */#if OS_LOWEST_PRIO <= 63uptcb->OSTCBY = (INT8U)( ptcb->OSTCBPrio >> 3u);ptcb->OSTCBX = (INT8U)( ptcb->OSTCBPrio & 0x07u);#elseptcb->OSTCBY = (INT8U)((INT8U)(ptcb->OSTCBPrio >> 4u) & 0xFFu);ptcb->OSTCBX = (INT8U)( ptcb->OSTCBPrio & 0x0Fu);#endifptcb->OSTCBBitY = (OS_PRIO)(1uL << ptcb->OSTCBY);ptcb->OSTCBBitX = (OS_PRIO)(1uL << ptcb->OSTCBX);if (rdy == OS_TRUE)/*就緒狀態為true*/{/*如果該任務處于就緒態,那么這個任務已不是處在它原來優先級上的就緒態*/ OSRdyGrp |= ptcb->OSTCBBitY;OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;} else/*就緒狀態為false*/{pevent2 = ptcb->OSTCBEventPtr;if (pevent2 != (OS_EVENT *)0) /*將事件控制塊添加到事件等待列表中*/{ pevent2->OSEventGrp |= ptcb->OSTCBBitY;pevent2->OSEventTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;}}OSTCBPrioTbl[pip] = ptcb;/*使占用mutex的任務以PIP優先級進入就緒態*/}}

上述過程如下圖所示:


此外還想多說一句:

OSTCBPrioTbl[pip] = ptcb;/*使占用mutex的任務以PIP優先級進入就緒態*/

下面這行語句為什么一定要讓任務以pip優先級進入就緒態?

個人理解是:對互斥量的操作中,pip的設置是為了防止優先級反轉。在操作時,要時刻保持任務是以最高優先級存在,否則就可能發生反轉。

如果互斥量不可獲取,進行完上面的判斷和操作后,后續的操作為:

OSTCBCur->OSTCBStat |= OS_STAT_MUTEX; /*無法獲得互斥量,將該任務掛起*/OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;/*掛起狀態設置為OS_STAT_PEND_OK*/OSTCBCur->OSTCBDly = timeout;OS_EventTaskWait(pevent); /*任務處于阻塞狀態,知道事件發生或超時*/ OS_EXIT_CRITICAL();/*退出中斷*/OS_Sched(); /* 找到就緒的最高優先級任務進行調度*/OS_ENTER_CRITICAL();/*進入中斷*/switch (OSTCBCur->OSTCBStatPend)/*看掛起的原因是什么?超時還是任務被取消*/{ case OS_STAT_PEND_OK:*perr = OS_ERR_NONE;break;case OS_STAT_PEND_ABORT:*perr = OS_ERR_PEND_ABORT; break;case OS_STAT_PEND_TO:default:OS_EventTaskRemove(OSTCBCur, pevent);*perr = OS_ERR_TIMEOUT; break;}OSTCBCur->OSTCBStat = OS_STAT_RDY; /*將任務狀態設置為就緒態*/OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK; /*清除掛起狀態 */OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* 清除事件指針*/ #if (OS_EVENT_MULTI_EN > 0u)OSTCBCur->OSTCBEventMultiPtr = (OS_EVENT **)0; #endifOS_EXIT_CRITICAL();/*退出中斷*/ }

釋放一個互斥型信號量OSMutexPost (OS_EVENT *pevent):

/*$PAGE*/ /*2018/2/19 ********************************************************************************************************* * POST TO A MUTUAL EXCLUSION SEMAPHORE * 釋放一個互斥型信號量 * Description: This function signals a mutual exclusion semaphore *描述:調用OSMutexPost()可以發出mutex * Arguments : pevent is a pointer to the event control block associated with the desired mutex. *參數: --pevent:指向有互斥量的事件控制塊的指針。 * Returns : OS_ERR_NONE The call was successful and the mutex was signaled. * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a mutex * OS_ERR_PEVENT_NULL 'pevent' is a NULL pointer * OS_ERR_POST_ISR Attempted to post from an ISR (not valid for MUTEXes) * OS_ERR_NOT_MUTEX_OWNER The task that did the post is NOT the owner of the MUTEX. * OS_ERR_PIP_LOWER If the priority of the new task that owns the Mutex is * HIGHER (i.e. a lower number) than the PIP. This error * indicates that you did not set the PIP higher (lower * number) than ALL the tasks that compete for the Mutex. * Unfortunately, this is something that could not be * detected when the Mutex is created because we don't know * what tasks will be using the Mutex.返回值:OS_ERR_NONE:調用成功,發出mutex;OS_ERR_EVENT_TYPE:沒有指向mutex的指針;OS_ERR_PEVENT_NULL:pevent為空指針;OS_ERR_POST_ISR:從中斷服務子程序中調用;OS_ERR_NOT_MUTEX_OWNER:發出信號的任務沒有占用互斥量。OS_ERR_PIP_LOWER:擁有互斥量的任務的優先級比pip高。 ********************************************************************************************************* */INT8U OSMutexPost (OS_EVENT *pevent) {INT8U pip;/*繼承優先級*/INT8U prio;#if OS_CRITICAL_METHOD == 3u OS_CPU_SR cpu_sr = 0u;#endifif (OSIntNesting > 0u){ return (OS_ERR_POST_ISR); }#if OS_ARG_CHK_EN > 0uif (pevent == (OS_EVENT *)0) { return (OS_ERR_PEVENT_NULL);}#endifif (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { return (OS_ERR_EVENT_TYPE);}OS_ENTER_CRITICAL();/*進入中斷*/pip = (INT8U)(pevent->OSEventCnt >> 8u); /*獲取pip*/prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);/*獲取擁有互斥量的任務的原始優先級*/if (OSTCBCur != (OS_TCB *)pevent->OSEventPtr)/*當前任務沒有占有互斥量*/{ OS_EXIT_CRITICAL();/*退出中斷*/return (OS_ERR_NOT_MUTEX_OWNER);//發出mutex的任務實際上并不占用mutex}if (OSTCBCur->OSTCBPrio == pip) /*當前任務優先級是pip,不需要提高優先級*/{ OSMutex_RdyAtPrio(OSTCBCur, prio); /*保存任務原始優先級,任務完成后進行恢復*/}OSTCBPrioTbl[pip] = OS_TCB_RESERVED; /*將pip對應在優先級表上的值設為reserved*/if (pevent->OSEventGrp != 0u) /*如果有任務正在等待互斥量,將最高優先級任務設置為就緒態*/{ prio = OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX, OS_STAT_PEND_OK);/*轉為就緒態任務的優先級*/pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /*新占用mutex的任務保存高8位(PIP) */pevent->OSEventCnt |= prio;/*將新任務優先級存放在低八位*/pevent->OSEventPtr = OSTCBPrioTbl[prio];/*指針指向新任務的TCB*/if (prio <= pip) /*當前任務比pip優先級高*/{ OS_EXIT_CRITICAL();/*退出中斷*/ OS_Sched();/*找到最高優先級任務進行調度*/return (OS_ERR_PIP_LOWER);/*返回錯誤值*/} else/*當前任務比pip優先級低*/{OS_EXIT_CRITICAL();/*退出中斷*/OS_Sched();/*找到最高優先級任務進行調度*/return (OS_ERR_NONE);/*返回無錯*/}}/*如果沒有任務等待互斥量*/pevent->OSEventCnt |= OS_MUTEX_AVAILABLE; /*互斥量是可獲得的 */pevent->OSEventPtr = (void *)0;OS_EXIT_CRITICAL();return (OS_ERR_NONE); }

該函數實際上是通知是否mutex為空閑的。如果當前的任務沒有占用該互斥量,返回OS_ERR_NOT_MUTEX_OWNER,即發出mutex的任務不占用互斥量。如果當前任務占用互斥量,看看是否有任務正在等待這個互斥量。如果有任務等待,那么在當前任務完成之前,將等待列表中的優先級最高的任務轉為就緒態。等當前任務完成,該任務就可以執行了。如果沒有任務等待該互斥量,就只簡單的發出“該互斥量是可獲得的”信號即可。


查詢互斥量信息OSMutexQuery (OS_EVENT ?*pevent,?OS_MUTEX_DATA ?*p_mutex_data):

/*$PAGE*/ /*2018/2/19 ********************************************************************************************************* * QUERY A MUTUAL EXCLUSION SEMAPHORE * 查詢互斥量 * Description: This function obtains information about a mutex *描述:該功能獲得關于互斥量的信息。 * Arguments : pevent is a pointer to the event control block associated with the desired mutex *參數: --pevent:指向需要互斥量的事件控制塊的指針 * p_mutex_data is a pointer to a structure that will contain information about the mutex * -- p_mutex_data :指向結構體的指針,該結構體包含互斥量的信息 * Returns : OS_ERR_NONE The call was successful and the message was sent * OS_ERR_QUERY_ISR If you called this function from an ISR * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer * OS_ERR_PDATA_NULL If 'p_mutex_data' is a NULL pointer * OS_ERR_EVENT_TYPE If you are attempting to obtain data from a non mutex.返回值:OS_ERR_NONE:調用成功,消息也被發出。OS_ERR_QUERY_ISR:從中斷服務子程序中調用該函數;OS_ERR_PEVENT_NULL:pevent為空指針;OS_ERR_PDATA_NULL:p_mutex_data為空指針;OS_ERR_EVENT_TYPE:獲得消息對象錯誤。 ********************************************************************************************************* */#if OS_MUTEX_QUERY_EN > 0u INT8U OSMutexQuery (OS_EVENT *pevent,OS_MUTEX_DATA *p_mutex_data) {INT8U i;OS_PRIO *psrc;OS_PRIO *pdest; OS_ENTER_CRITICAL();/*進入中斷*/p_mutex_data->OSMutexPIP = (INT8U)(pevent->OSEventCnt >> 8u);/*獲取pip*/p_mutex_data->OSOwnerPrio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);/*獲取擁有互斥量的任務的優先級*/if (p_mutex_data->OSOwnerPrio == 0xFFu) /*如果占用mutex任務的優先級為255時*/{p_mutex_data->OSValue = OS_TRUE; /*當前mutex的值。1表示可以使用。*/} else{p_mutex_data->OSValue = OS_FALSE;//當前mutex的值。0表示不能使用}/*將事件(互斥型信號量)結構中的等待任務列表復制到pdata數據結構中*/p_mutex_data->OSEventGrp = pevent->OSEventGrp; /*等待事件的任務組中的內容傳送到狀態數據結構中*/psrc = &pevent->OSEventTbl[0];/*保存pevent->OSEventTbl[0]對應的地址*/pdest = &p_mutex_data->OSEventTbl[0];/*保存pdata->OSEventTbl[0]對應的地址*/for (i = 0u; i < OS_EVENT_TBL_SIZE; i++) {*pdest++ = *psrc++;/*地址指針繼續下移一個類型地址,獲取互斥型信號量的值*/}OS_EXIT_CRITICAL();/*退出中斷*/return (OS_ERR_NONE); } #endif 將任務恢復到之前到優先級static ?void ?OSMutex_RdyAtPrio (OS_TCB ?*ptcb,INT8U ?prio):

該功能是將之前為了防止優先級反轉而提高的任務的優先級恢復。


到此,OS_mutex.c文件就看完了。

這個文件重點是介紹信號量的獲取、建立、刪除、掛起等待、查詢和釋放(通知)。

總結

以上是生活随笔為你收集整理的os_mutex.c(全)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久午夜电影网 | 中文电影网 | 超碰免费在线公开 | 久久天天综合网 | 天天操天天色天天射 | www.夜夜爱 | 国产精品免费不卡 | 欧美成人一二区 | 久久久高清一区二区三区 | 九九综合九九 | 免费中午字幕无吗 | 成人av一区二区在线观看 | 夜夜躁日日躁狠狠久久av | 久久久久久久久久久综合 | 99免费精品| 伊人资源视频在线 | 人人澡人 | 欧美另类网站 | 国产精品原创在线 | 超碰九九 | 日韩欧美有码在线 | 九月婷婷人人澡人人添人人爽 | 国产一区二区久久久久 | 亚洲欧洲中文日韩久久av乱码 | 色综合激情网 | 成人国产网站 | 日韩精品一区二区三区视频播放 | 国产精品高 | 成人免费看片网址 | 日韩,精品电影 | 在线免费观看视频一区二区三区 | 免费视频久久久 | 国产精品理论片在线观看 | 欧美一级特黄高清视频 | 亚洲国产视频在线 | 五月婷婷六月丁香激情 | 97免费视频在线播放 | 中文字幕在线视频一区 | 在线综合色 | 精品国产一区二区三区av性色 | 国产精品成人自产拍在线观看 | 色综合国产 | 开心激情婷婷 | 99热官网 | 天堂av在线网址 | 婷婷在线综合 | 中文字幕在线看视频国产 | 久草视频在线观 | 日韩在线观看一区二区三区 | 久久久精品日本 | 91色影院| 男女免费视频观看 | 91九色视频网站 | 天天射射天天 | 91亚洲精品国偷拍自产在线观看 | 91看成人 | 亚洲综合色播 | 免费av 在线 | 国产在线视频不卡 | 视频精品一区二区三区 | 午夜视频一区二区三区 | 国产精品一区免费观看 | 中文字幕在线免费 | 婷婷四房综合激情五月 | 日韩视频www | 亚洲成av人影片在线观看 | 免费在线观看a v | 九色porny真实丨国产18 | 人人干,人人爽 | 日韩av电影国产 | 日韩欧美69| 色婷婷综合在线 | 婷婷色六月天 | 久青草电影 | 欧美日韩裸体免费视频 | 日韩一区精品 | 免费成视频| 毛片一区二区 | 最新av中文字幕 | 国产字幕在线看 | 国产精品伦一区二区三区视频 | 人人玩人人添人人澡超碰 | 成年人黄色免费网站 | 国产精品视频免费看 | 久久怡红院| 免费日韩一区 | 久久99视频精品 | 久久99久久99免费视频 | 久久99精品视频 | 国产精品不卡在线观看 | 亚洲成人第一区 | 国产成人在线综合 | 国产精品成人免费精品自在线观看 | 日本夜夜草视频网站 | 日韩欧美在线一区二区 | 国产精品99久久久久 | 国产精品久久久久久久久费观看 | 久久久久久久久久免费 | 久久在线播放 | 亚洲精品国偷拍自产在线观看 | 亚洲国产精品日韩 | www..com毛片 | 国产免费黄视频在线观看 | 美女精品网站 | 免费精品视频在线观看 | 欧美亚洲另类在线视频 | 欧美一区二区三区激情视频 | 精品嫩模福利一区二区蜜臀 | 亚洲97在线 | 高潮久久久| 日韩高清一 | 日日噜噜噜噜夜夜爽亚洲精品 | 激情久久伊人 | 丁香婷婷深情五月亚洲 | 精品久久久久久国产偷窥 | 久久韩国免费视频 | 人人干在线| 五月婷综合 | 免费在线观看成人 | 色网址99 | 色婷婷福利| 黄色亚洲在线 | av动态图片 | 2019久久精品 | 中文字幕在线观看不卡 | 免费观看成人网 | 国产精品久久综合 | 亚洲一区二区视频在线播放 | 亚洲撸撸| 亚洲日本一区二区在线 | 免费成人在线观看视频 | 色噜噜日韩精品欧美一区二区 | 久草在线 | 欧美日韩在线电影 | 亚洲精品色婷婷 | 国产一级不卡毛片 | 99免费在线观看视频 | 日韩高清免费在线观看 | 国产欧美在线一区 | 精品久久亚洲 | 91av电影在线观看 | 国产精品一区二区三区免费看 | 成人黄色一级视频 | 久久久黄视频 | 人人添人人澡 | 91亚洲欧美 | 国产一区二区在线播放 | 日本黄色大片儿 | 国产精品99久久久精品 | 色偷偷av男人天堂 | 不卡国产在线 | 中文字幕亚洲五码 | 日韩区视频 | 美女福利视频在线 | 99国产在线 | 国产精品视频999 | 99久久久久免费精品国产 | 欧美成人精品xxx | 婷婷综合影院 | 久久综合色天天久久综合图片 | 日韩欧美国产视频 | 久久国产乱| 日韩欧美一区二区三区在线观看 | 狠狠色丁香九九婷婷综合五月 | 中文av在线播放 | 黄p网站在线观看 | 丰满少妇在线观看网站 | 在线观看av不卡 | 亚洲免费在线观看视频 | 特级毛片aaa | 免费福利在线播放 | 96av在线| 精品一二三四在线 | 成人91免费视频 | 偷拍精偷拍精品欧洲亚洲网站 | 狠狠狠色丁香婷婷综合久久88 | 91精品国产欧美一区二区成人 | 69av久久 | 精品国产aⅴ麻豆 | 美女视频一区二区 | 激情网五月婷婷 | 日韩最新av| 色综合久| 久久久久久久久久久高潮一区二区 | 五月激情五月激情 | 午夜在线免费观看视频 | 激情网在线视频 | 亚洲精品国内 | 久久久久综合精品福利啪啪 | 大型av综合网站 | 91福利视频在线 | 精品久久久久久久久久久院品网 | 一本一本久久a久久 | av不卡免费在线观看 | 午夜久久影视 | 久久深夜 | 中文字幕av免费在线观看 | 韩国av电影网 | 中文字幕欧美激情 | 免费高清在线观看成人 | 国产 日韩 欧美 在线 | 国产女v资源在线观看 | 亚洲国产精品成人女人久久 | 欧美精选一区二区三区 | 久久综合免费视频影院 | 99热高清| 免费观看黄色12片一级视频 | 成人国产精品久久久久久亚洲 | 国产黄色资源 | 日本视频不卡 | 免费看片成人 | 黄色av一区二区三区 | 国产精品丝袜在线 | 五月综合婷 | 欧美日韩在线视频观看 | 中文字幕精品一区二区精品 | 毛片随便看 | 日韩在线观看视频网站 | 91精品秘密在线观看 | 亚洲精品美女在线 | 狠狠色丁香久久婷婷综合_中 | 精品视频一区在线观看 | aaa亚洲精品一二三区 | 中文字幕视频播放 | 粉嫩aⅴ一区二区三区 | 免费在线观看一级片 | 欧美99精品| 日免费视频 | 午夜婷婷在线观看 | 久久久久综合 | 99久久er热在这里只有精品66 | 欧美激情视频在线观看免费 | 国产不卡在线播放 | 中文字幕在线观看网 | 国产精品高清免费在线观看 | 99热官网 | 国产亚洲精品电影 | 日本精品一区二区在线观看 | 久久视影 | 中文字幕在线播放视频 | 在线亚洲成人 | 最新极品jizzhd欧美 | 成 人 黄 色 视频播放1 | 91精品视屏 | 国产va在线 | 一区二区视频在线播放 | 久久九九免费视频 | 精品国产一区二区三区久久久 | 亚洲人在线视频 | 久久免费黄色大片 | 在线观看日韩一区 | 亚洲黄色小说网址 | 免费黄色网止 | 99久久精品国产免费看不卡 | 欧美精品在线免费 | 91看成人 | 亚洲日韩精品欧美一区二区 | 69国产精品视频免费观看 | 国内视频一区二区 | av不卡中文字幕 | 国产一二三区av | 伊人色综合久久天天网 | 成年人免费电影在线观看 | 91精品久久久久久久久久入口 | 外国av网 | 久久综合久久综合这里只有精品 | 黄色成人在线观看 | 91九色在线播放 | 久久这里有精品 | 免费福利在线播放 | 免费国产一区二区视频 | av大全在线看 | 国产女做a爱免费视频 | 九九九在线观看视频 | 中文字幕在线日 | 中文字幕中文中文字幕 | 丁香网婷婷 | 欧美精品免费视频 | 在线观看岛国片 | 久久久婷| 日韩欧美一区二区三区免费观看 | 亚洲男男gaygay无套同网址 | 色婷婷九月 | 国产精品中文久久久久久久 | 香蕉视频在线免费看 | 韩日色视频| 亚洲欧美日韩国产一区二区三区 | 91av小视频 | 开心丁香婷婷深爱五月 | 成人亚洲综合 | 久久精品精品电影网 | 亚洲国产美女精品久久久久∴ | 四虎免费在线观看 | 国产视频一二区 | 99久久9| 国产在线精品二区 | 日本精a在线观看 | 97超碰国产精品 | 久久综合五月天婷婷伊人 | 五月开心网 | 99免费看片 | 四虎影视www | 在线免费观看黄色小说 | 一级a毛片高清视频 | 亚洲视频 一区 | 中文字幕在线精品 | 91成人精品在线 | 亚洲1级片 | 国产高清视频在线播放 | 91成人免费电影 | 亚洲人人爱 | 91av蜜桃| 国产 视频 高清 免费 | 久久不卡视频 | 久久久久久久久久久久久久免费看 | 久久国产精品视频观看 | 中文字幕在线观看第一页 | 日韩在线高清视频 | 国产欧美精品一区二区三区 | 国产精品网红福利 | 国产精品免费观看久久 | 99久久日韩精品视频免费在线观看 | 探花视频免费在线观看 | 99r在线精品| 日韩资源视频 | 国外av在线 | 中文字幕综合在线 | 久久成人视屏 | 狠狠色综合网站久久久久久久 | 伊人伊成久久人综合网小说 | 在线看一区 | 在线精品观看 | 久久精品中文字幕一区二区三区 | 丝袜美女在线观看 | 免费视频久久久 | 天天操天天添 | 亚洲日韩欧美一区二区在线 | 久久99亚洲网美利坚合众国 | 中文字幕日韩高清 | 一区二区三区播放 | 91视频免费播放 | 91成人黄色| 久久五月婷婷丁香社区 | 91香蕉视频在线下载 | 就要色综合 | 日韩久久久 | 蜜臀av性久久久久蜜臀av | 日韩高清一二区 | 中文字幕中文字幕在线中文字幕三区 | 天天色成人 | 中文字幕在线第一页 | 久久看片 | 美女黄久久 | 日韩中文幕 | av免费黄色| 亚洲最新av网址 | 日韩成人邪恶影片 | 丁香 久久 综合 | 亚洲成av人影院 | 中文区中文字幕免费看 | 亚洲精品国产精品国自产观看 | 欧美日韩精品国产 | 成人av电影免费观看 | 色天天| 九色91av| 欧美专区亚洲专区 | 国产一二区在线观看 | 国产一级片视频 | 日韩视频在线不卡 | 丁香5月婷婷 | 国产精品区二区三区日本 | 伊人夜夜 | 中文字幕 国产 一区 | 日韩av不卡在线播放 | 精品在线二区 | 九九在线高清精品视频 | 五月激情丁香婷婷 | 亚洲国产中文字幕在线观看 | 午夜影院一级片 | 国产黄网在线 | 蜜臀av性久久久久蜜臀av | 欧美精品久久久久久 | 18久久久久 | 九九色综合 | 国产精品一区免费观看 | 中文字幕日韩一区二区三区不卡 | 天天干天天操天天操 | 亚洲免费av一区二区 | 亚洲精品小区久久久久久 | 久久电影国产免费久久电影 | 国产精品国内免费一区二区三区 | 欧美日韩精品区 | 午夜视频日本 | 亚洲最大av在线播放 | 欧美日韩国产综合网 | 91福利在线观看 | 99精品99 | 福利av影院 | 日韩丝袜在线 | www久久| 国产传媒中文字幕 | 在线a视频免费观看 | 国产精品理论在线观看 | 久草在线综合 | 日日干天天插 | 国产成人黄色片 | 久久精品国产精品亚洲精品 | 久久精品一区二区三区国产主播 | 欧美精品一区二区在线观看 | 97视频在线观看网址 | 久久免费视频观看 | 国产精品v欧美精品v日韩 | 欧美一级xxxx | www久| 国产xxxx做受性欧美88 | 精品在线播放视频 | 91精品免费在线视频 | 久久久久五月 | 久草网在线 | av在线网站大全 | 一区二区三区在线视频111 | 国产精品av免费在线观看 | 99久久精品国产免费看不卡 | 99中文在线 | 亚洲一区二区三区精品在线观看 | 日日日干 | 丁香九月婷婷综合 | 国产精品区免费视频 | 亚洲欧美视频一区二区三区 | 亚洲天堂精品 | 午夜精品影院 | 开心婷婷色 | 国产视频久久久久 | 欧美一级淫片videoshd | 超碰人人舔 | 中文字幕日韩无 | av女优中文字幕在线观看 | 日日操日日插 | 最新av观看 | 中文字幕国产亚洲 | 六月丁香激情网 | 中文字幕日韩电影 | 综合网婷婷 | 四虎永久国产精品 | 成人久久免费视频 | 日本99精品 | 日本一区二区不卡高清 | 九色视频网 | 不卡的av电影在线观看 | 日韩一区二区三区免费视频 | 亚洲国产成人久久 | 国产一级性生活视频 | 精品久久综合 | 国产精品久久久久久久av大片 | 黄av在线 | 亚洲精品美女久久久久 | 久久99视频免费观看 | 激情综合亚洲精品 | 久久黄色小说 | 天堂av色婷婷一区二区三区 | 午夜久久电影网 | 奇米四色影狠狠爱7777 | 欧美久草网 | 天天综合久久综合 | av在线免费在线 | 麻豆果冻剧传媒在线播放 | 日韩视频www | 天堂网一区二区三区 | 99久久99久久免费精品蜜臀 | 日韩欧美一区二区三区在线 | 成人国产网站 | 久久免费一 | 久久久免费电影 | 天天爽夜夜爽人人爽一区二区 | 久久a久久 | 99视频免费观看 | 草久视频在线 | 九九九九精品九九九九 | 成人一级免费电影 | 91伊人影院 | 久久午夜网 | 天天干天天操天天入 | 日韩精品国产一区 | 精品极品在线 | 成人网页在线免费观看 | 国产999精品久久久久久绿帽 | 国产成人av在线影院 | 国产一级一片免费播放放 | 色综合久久久久久久 | 日韩在线高清视频 | 狠狠插天天干 | 色a在线观看 | 射射射综合网 | 日韩视频一区二区三区在线播放免费观看 | 伊人天天干 | 天天做日日爱夜夜爽 | 天堂网中文在线 | 欧美亚洲国产精品久久高清浪潮 | 特级西西444www大精品视频免费看 | 日韩av网站在线播放 | 国产麻豆精品久久一二三 | 三级黄色网址 | 成人av电影免费观看 | 激情五月播播久久久精品 | 久久99精品国产99久久6尤 | 在线天堂亚洲 | 日韩精品一区二区三区第95 | 麻花传媒mv免费观看 | 激情 一区二区 | 国产另类xxxxhd高清 | 96久久久| 九九热在线观看 | 久久一视频 | 亚洲在线网址 | 国产精品午夜8888 | 91污污视频在线观看 | 国产精品久久一区二区无卡 | 亚州精品在线视频 | 久久综合之合合综合久久 | 韩国精品在线 | 久久精品国产亚洲a | 国产午夜在线观看 | 在线 视频 一区二区 | 国产精品成人av电影 | 又黄又刺激视频 | 国产高清专区 | 一级性视频| 日韩精品一区二区电影 | 色综合欧洲 | 久草电影免费在线观看 | 国产精品一区免费看8c0m | 亚洲男男gaygay无套同网址 | 日韩精品欧美专区 | 欧美日韩一区二区三区视频 | 999久久久久 | 日日草天天干 | 日韩美精品视频 | 精品国产欧美一区二区三区不卡 | 中文字幕中文字幕在线中文字幕三区 | 欧美贵妇性狂欢 | 玖玖视频免费在线 | 特片网久久 | 欧美a性 | 国产破处在线视频 | 久久超级碰视频 | 丁香婷五月 | 久久久久久久久久久黄色 | 日产乱码一二三区别免费 | 亚洲综合成人在线 | 激情五月婷婷 | 欧美极度另类性三渗透 | 久久图 | 三级av片| 成人一区不卡 | 在线观看视频一区二区三区 | 91日韩在线专区 | 免费黄色av | 久久久午夜剧场 | 亚洲美女免费精品视频在线观看 | 中文字幕在线观看视频网站 | 亚洲精品视频在线看 | 狠狠干在线播放 | 亚洲精品乱码久久久久久写真 | 亚洲永久精品一区 | 婷婷激情欧美 | 国产成人精品av在线观 | 日韩v在线91成人自拍 | 欧美日韩一区二区在线观看 | 日韩午夜在线播放 | 国产精品久久99综合免费观看尤物 | 69av久久| 日韩激情片在线观看 | 欧美91视频| 波多野结衣久久资源 | 中文字幕专区高清在线观看 | 国模视频一区二区三区 | 狠狠狠狠狠狠狠干 | 一级黄色免费网站 | 久久久 精品 | 精品国模一区二区三区 | 国产在线一区二区 | 中文字幕成人在线 | 亚洲欧美视频在线观看 | 久久久久中文 | 免费看的黄色 | 国产亚洲成av人片在线观看桃 | 亚洲精品免费播放 | 激情欧美日韩一区二区 | 婷婷在线播放 | 欧美日韩精品影院 | 91看片在线观看 | 深爱五月网 | 天天插天天狠 | 久久国产系列 | 96久久久| 色在线中文字幕 | 国产伦精品一区二区三区无广告 | 亚洲高清视频在线播放 | 啪啪凸凸 | 中文字幕av在线电影 | 亚洲人成人在线 | 国产91全国探花系列在线播放 | 福利视频午夜 | 亚洲a色| 欧美男男tv网站 | 国产大片免费久久 | 中中文字幕av在线 | 最新国产精品拍自在线播放 | 一级欧美日韩 | 九九精品视频在线 | 欧美日韩国产一区二区在线观看 | 十八岁免进欧美 | 黄色av高清 | 国产精品久久久久久久久久久久午夜 | 激情综合网五月激情 | 精品毛片在线 | 国产精品久久久久久久久搜平片 | 黄色高清视频在线观看 | 激情久久久久久久久久久久久久久久 | 亚洲免费国产视频 | 色噜噜在线观看视频 | 欧美精品久久久久久 | 色妞色视频一区二区三区四区 | 久久久国际精品 | 日韩亚洲在线观看 | 欧美日韩一级久久久久久免费看 | 黄色亚洲大片免费在线观看 | 中文在线字幕观看电影 | 最近2019年日本中文免费字幕 | 天天干天天做天天操 | www五月婷婷 | 色噜噜色噜噜 | 伊人官网| 国产在线国偷精品产拍免费yy | 国产福利91精品张津瑜 | 三级黄色a| 精品一区二区在线免费观看 | 日本九九视频 | 国产精品女人网站 | 欧美一区二区三区激情视频 | 久久久久久久久久久久99 | 久久精品亚洲精品国产欧美 | 久久久国际精品 | 99精品视频在线观看视频 | 亚洲天堂社区 | 草久在线播放 | 日韩毛片在线一区二区毛片 | 日韩理论片在线观看 | 亚洲国产中文在线观看 | 免费观看www小视频的软件 | 亚洲精品字幕 | 久草视频在线看 | 婷婷成人综合 | 中文字幕免费在线看 | 岛国精品一区二区 | 亚洲综合导航 | 中文在线最新版天堂 | 日日摸日日添夜夜爽97 | 欧美a级成人淫片免费看 | 在线观看不卡的av | 国产精品综合久久久久 | 91av观看| 综合网伊人 | 免费久草视频 | 日韩黄色一区 | 亚洲人成精品久久久久 | 日韩精品欧美一区 | av福利电影| 中文字幕不卡在线88 | 国产精品久久久久久久久久白浆 | 中国美女一级看片 | 欧美a级在线 | 日本久久久精品视频 | 日韩欧美高清在线 | 精品一区二区精品 | 色婷婷狠狠 | 99热国产在线 | 国产午夜视频在线观看 | 午夜视频欧美 | 精品视频在线观看 | 在线观看久 | 精品福利在线观看 | 日本三级全黄少妇三2023 | 日本成人黄色片 | 手机在线小视频 | 一本一道久久a久久综合蜜桃 | 色片网站在线观看 | 九九热视频在线播放 | www一起操 | 91精品视频网站 | 国产精品久久久毛片 | 亚洲欧美国产精品久久久久 | 精品久久久久久久久久久久久久久久久久 | 99精品视频一区二区 | 日韩精品在线免费播放 | 久久精品中文字幕 | av性在线| 正在播放 国产精品 | 久久在线视频在线 | 久久在视频 | 久久丁香| 久久精品视频国产 | 国产精品影音先锋 | 国产精品亚洲人在线观看 | 欧美一区在线看 | 日本99精品 | 亚洲日本一区二区在线 | 成人av一区二区三区 | 免费网站黄 | 久二影院 | 亚洲激情久久 | 成人av视屏 | 久久久999精品视频 国产美女免费观看 | 在线观看国产一区 | 国产精品久久麻豆 | 久久6精品 | 日韩理论在线视频 | 又黄又刺激的网站 | 91在线视频观看免费 | 2024国产精品视频 | 韩日电影在线观看 | 九九99 | 米奇狠狠狠888 | 久久99久久99精品免视看婷婷 | 成人a视频在线观看 | 久热这里有精品 | 黄色一级大片免费看 | 日日爱影视 | 夜添久久精品亚洲国产精品 | 麻豆传媒视频观看 | 免费视频一区二区 | 久久爽久久爽久久av东京爽 | 国产精品一区在线观看 | 一区二区亚洲精品 | 欧美日韩一区二区三区在线免费观看 | 国产色在线观看 | 亚洲狠狠操 | 日韩欧美高清一区二区三区 | 91天天操| 精品一区二区在线免费观看 | 黄色网www | 国产一二三四在线观看视频 | 黄色av网站在线观看免费 | 亚洲区二区| 久久爱综合 | 久久久久久蜜av免费网站 | 亚洲精品日韩在线观看 | 亚洲一区二区三区四区在线视频 | 久久9精品 | 精品99免费 | 在线观看网站你懂的 | 91亚洲狠狠婷婷综合久久久 | 免费看污污视频的网站 | 亚州人成在线播放 | 天天操操操操操 | 丁香激情综合国产 | 成人av影视在线 | 免费观看完整版无人区 | 午夜手机电影 | 久久久久网站 | 天天综合久久综合 | 欧美激情另类文学 | 日操操| 久久精品视频4 | www.色午夜.com | 久久精品91久久久久久再现 | av在线成人| 果冻av在线| 999久久久久久久久久久 | 国精产品一二三线999 | 91欧美精品 | 黄色特一级片 | 99在线热播精品免费 | 国产精品91一区 | 久久永久视频 | 色姑娘综合 | 色婷婷欧美 | 亚洲国产精品99久久久久久久久 | 丰满少妇在线观看网站 | 夜夜视频资源 | 999视频在线观看 | 国产剧情一区在线 | 免费av大片 | 人人爽人人 | 国产精品中文字幕在线观看 | 国产成人三级在线观看 | h动漫中文字幕 | 日韩在线第一 | 免费黄色激情视频 | 国产精品欧美一区二区三区不卡 | 免费av在线网站 | 欧美日韩免费一区二区 | 国产精品美女视频网站 | 亚洲激色| 97成人免费视频 | 天天草天天干 | 亚洲第一中文网 | 丁香国产视频 | 国产999精品 | 区一区二区三区中文字幕 | 国产特级毛片aaaaaaa高清 | 播五月综合 | 黄网站色视频免费观看 | 国产精品久久久久婷婷二区次 | 久久久久久99精品 | 久久九九精品久久 | 在线亚洲高清视频 | 国产成人久久精品一区二区三区 | 成 人 黄 色 视频 免费观看 | 超碰在线免费97 | 91精品一区国产高清在线gif | 五月婷婷在线视频观看 | 永久免费看av | 91在线视频免费播放 | 69亚洲视频 | 中文在线免费看视频 | 国产高清成人av | 国精产品999国精产品视频 | 欧美午夜剧场 | 美女黄频在线观看 | 天天综合操 | 久久久久欧美精品 | 欧美黑人xxxx猛性大交 | 久久久久久久久久国产精品 | 97精品国产97久久久久久久久久久久 | 福利一区二区在线 | 久久在线免费视频 | 久久精品久久久久电影 | 国产96视频| 中文字幕网站 | 久久久视频在线 | 国产成人一区二区精品非洲 | 久久国产美女 | 福利视频一区二区 | 国产一区二区中文字幕 | 天天射天天色天天干 | 国产精品专区一 | 成人久久久久久久久久 | 五月婷婷黄色网 | 亚洲综合视频在线播放 | 午夜在线观看 | av大全在线免费观看 | 91热| 最新婷婷色 | 久久视频这里有精品 | 国产手机免费视频 | 日韩理论在线 | 国内精品二区 | 超级碰99 | 日韩欧美高清在线观看 | 欧美日韩高清一区二区 国产亚洲免费看 | 日韩高清成人在线 | 免费精品| 91热这里只有精品 | 色偷偷88欧美精品久久久 | 成人国产精品一区二区 | 日韩最新av| 日韩精品久久久久久久电影竹菊 | 91丨九色丨蝌蚪丨对白 | 三级在线视频观看 | 最新av观看 | 干av在线| 国产亚洲精品xxoo | 国产成人精品久久亚洲高清不卡 | 亚洲婷婷在线视频 | 正在播放国产精品 | 四虎永久精品在线 | 久久精品电影网 | 91麻豆精品国产91久久久久久 | 亚洲一级片在线看 | 国产97色在线 | 日韩电影一区二区在线观看 | 九九导航 | 亚洲第一中文网 | 91免费在线看片 | 综合天堂av久久久久久久 | 久影院 | 国产大片免费久久 | 久久久久免费精品 | 麻豆视传媒官网免费观看 | 精品国偷自产国产一区 | 国产精品久久久久一区二区 | 一区二区免费不卡在线 | 午夜久久久久 | 96精品视频| 伊人国产在线播放 | 午夜天使 | 在线黄色免费av | 免费99精品国产自在在线 | 欧美性生活免费 | 日韩a免费 | 中文字幕在线不卡国产视频 | 亚洲 成人 欧美 | 69av视频在线 | 久久久久久国产精品久久 | 四虎在线免费观看视频 | 婷婷综合av | 欧美精品一二三 | 国产黄a三级三级三级三级三级 | 亚洲91精品在线观看 | 中文字幕在线观看一区二区 | 久久理论片 | www日| 国产色综合天天综合网 | 欧洲精品一区二区 | 2018精品视频| 美女中文字幕 | 国产福利一区在线观看 | www最近高清中文国语在线观看 | 999免费视频 | 日韩精品一区二区在线视频 | 日韩高清精品免费观看 | 狠狠色丁香婷婷综合视频 | 国产成人精品午夜在线播放 | 日本性xxx | 蜜臀久久99精品久久久久久网站 | 亚洲精品久久久久久中文传媒 | 国产精品女| 在线观看av不卡 | 亚洲影视九九影院在线观看 | 色综合久久精品 | 国产高清在线观看 | 91免费在线| 天天做天天干 | 色婷婷视频网 | 日韩videos | 国产美女精品 | 91九色蝌蚪国产 | 四虎国产精品免费观看视频优播 | 人人cao | 国产精品免费在线 | 国内精品久久久久影院一蜜桃 | 超碰日韩在线 | 人人狠狠| 成人午夜电影在线播放 | 久久免费视频播放 | 成人毛片在线观看 | 亚洲精品国产精品国产 | 激情九九 | 97在线精品国自产拍中文 | 色无五月 | 色一级片 | 777xxx欧美| 成人天堂网 | 久久精品欧美视频 | 超碰97人人射妻 | 国产韩国精品一区二区三区 | 国产精品自拍av | 国产精品激情在线观看 | 懂色av一区二区在线播放 | 国产999精品 | 久久久久久久网 | 中文字幕在线国产精品 | 国产视频一区二区三区在线 | 国产午夜精品理论片在线 | 天天操天天色天天射 | 91久久偷偷做嫩草影院 | 国产精品久久久久永久免费 | 特级黄色一级 | 激情狠狠干 | 99久久精品久久久久久动态片 | 国产+日韩欧美 | 91av短视频| 久久dvd| 九九导航| av超碰在线 | 999电影免费在线观看2020 | 91av在线不卡 | 国产最新在线视频 | 欧洲性视频 | 国产乱老熟视频网88av | 亚洲精品乱码久久久久久蜜桃欧美 | 成人在线观看免费 | 天堂久久电影网 | 五月婷婷综合激情网 | 国产精品第72页 | 91一区二区在线 | 国产一区二三区好的 | 91麻豆精品国产自产 | 国产视频美女 | 亚洲永久国产精品 | 最近在线中文字幕 | 99 色 | 午夜久久影视 | 女女av在线 | 国产亚洲精品日韩在线tv黄 | 国产精品久久久久四虎 | 91黄色影视 | 亚洲高清视频在线观看 | 国产精品美女久久久网av | 中文字幕免费一区 | 中文字幕色在线视频 | 久久精视频 | 精品五月天 | 日韩资源在线播放 | 国产小视频网站 | 日韩欧美在线第一页 | 午夜久久影视 |