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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

CleanFlight 源码分析 一,任务调度

發布時間:2023/12/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CleanFlight 源码分析 一,任务调度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

CleanerFlight的任務調度用的是時間片查詢的方式。每個任務沒有自己的堆棧,不會進行強行跳轉。任何一個任務時間過長都會導致其它任務時間延遲(所以不要亂用Delay()).

A.基本的調度方式,如果當前系統時間 > (任務的最后一次運行時間+任務的運行周期),則執行當前任務,否則繼續查找到期的任務。

B.任務優先級,先查詢優先級數字低的任務,A, 遍歷完所有任務后,下個優先級

C.任務可以是事件驅動型,或者是周期型,或者兩者都是。先執行事件驅動,然后是周期運行。

D.系統時間,微秒計時。設置systick的中斷時間為1毫秒,中斷內負責毫秒計時,則

????? 微秒計數=毫秒計數 * 1000 + (系統時鐘頻率 / 1000 - systick計數值) / (系統時鐘頻率 / 1000000)

E.執行任務,使用函數指針指向當前任務函數,加入輸入變量即可運行:selectedTask->taskFunc(currentTimeUs),

系統工作步驟:

1.初始化任務列表

2.任務循環調度

任務系統就兩個文件:scheduler.h,scheduler.c

自定義任務:

[TASK_SERIAL] = {
? ? ? ? .taskName = "SERIAL",
? ? ? ? .taskFunc = taskHandleSerial,
#ifdef USE_OSD_SLAVE
? ? ? ? .checkFunc = taskSerialCheck,
? ? ? ? .desiredPeriod = TASK_PERIOD_HZ(100),
? ? ? ? .staticPriority = TASK_PRIORITY_REALTIME,
#else
? ? ? ? .desiredPeriod = TASK_PERIOD_HZ(1), ? ? ? // 100 Hz should be enough to flush up to 115 bytes @ 115200 baud
? ? ? ? .staticPriority = TASK_PRIORITY_LOW,
#endif
? ? },

任務內容:

void taskHandleSerial()
{
?? ?Serial_puts(USART3, "HELLODWORLD\n"); /*while (1);*/
}

允許任務運行:

setTaskEnabled(TASK_SERIAL, true);

任務開始:

void schedulerInit(void)
{
? ? calculateTaskStatistics = true;
? ? queueClear();
? ? queueAdd(&cfTasks[TASK_SYSTEM]);
}

任務調度:

void scheduler(void)
{
? ? // Cache currentTime
? ? const timeUs_t currentTimeUs = micros();

? ? // Check for realtime tasks
? ? bool outsideRealtimeGuardInterval = true;
? ? for (const cfTask_t *task = queueFirst(); task != NULL && task->staticPriority >= TASK_PRIORITY_REALTIME; task = queueNext())
? ? {
? ? ? ? const timeUs_t nextExecuteAt = task->lastExecutedAt + task->desiredPeriod;
? ? ? ? if ((timeDelta_t)(currentTimeUs - nextExecuteAt) >= 0)
? ? ? ? {
? ? ? ? ? ? outsideRealtimeGuardInterval = false;
? ? ? ? ? ? break;
? ? ? ? }
? ? }

? ? // The task to be invoked
? ? cfTask_t *selectedTask = NULL;
? ? uint16_t selectedTaskDynamicPriority = 0;

? ? // Update task dynamic priorities
? ? uint16_t waitingTasks = 0;
? ? for (cfTask_t *task = queueFirst(); task != NULL; task = queueNext())?
? ? {
? ? ? ? // Task has checkFunc - event driven
? ? ? ? if (task->checkFunc)?
? ? ? ? {
#if defined(SCHEDULER_DEBUG)
? ? ? ? ? ? const timeUs_t currentTimeBeforeCheckFuncCall = micros();
#else
? ? ? ? ? ? const timeUs_t currentTimeBeforeCheckFuncCall = currentTimeUs;
#endif
? ? ? ? ? ? // Increase priority for event driven tasks
? ? ? ? ? ? if (task->dynamicPriority > 0)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? task->taskAgeCycles = 1 + ((currentTimeUs - task->lastSignaledAt) / task->desiredPeriod);
? ? ? ? ? ? ? ? task->dynamicPriority = 1 + task->staticPriority * task->taskAgeCycles;
? ? ? ? ? ? ? ? waitingTasks++;
? ? ? ? ? ? }?
? ? ? ? ? ? else if (task->checkFunc(currentTimeBeforeCheckFuncCall, currentTimeBeforeCheckFuncCall - task->lastExecutedAt))
? ? ? ? ? ? {
#if defined(SCHEDULER_DEBUG)
? ? ? ? ? ? ? ? DEBUG_SET(DEBUG_SCHEDULER, 3, micros() - currentTimeBeforeCheckFuncCall);
#endif
#ifndef SKIP_TASK_STATISTICS
? ? ? ? ? ? ? ? if (calculateTaskStatistics)?
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? const uint32_t checkFuncExecutionTime = micros() - currentTimeBeforeCheckFuncCall;
? ? ? ? ? ? ? ? ? ? checkFuncMovingSumExecutionTime += checkFuncExecutionTime - checkFuncMovingSumExecutionTime / MOVING_SUM_COUNT;
? ? ? ? ? ? ? ? ? ? checkFuncTotalExecutionTime += checkFuncExecutionTime; ? // time consumed by scheduler + task
? ? ? ? ? ? ? ? ? ? checkFuncMaxExecutionTime = MAX(checkFuncMaxExecutionTime, checkFuncExecutionTime);
? ? ? ? ? ? ? ? }
#endif
? ? ? ? ? ? ? ? task->lastSignaledAt = currentTimeBeforeCheckFuncCall;
? ? ? ? ? ? ? ? task->taskAgeCycles = 1;
? ? ? ? ? ? ? ? task->dynamicPriority = 1 + task->staticPriority;
? ? ? ? ? ? ? ? waitingTasks++;
? ? ? ? ? ? } else?
? ? ? ? ? ? {
? ? ? ? ? ? ? ? task->taskAgeCycles = 0;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? else?
? ? ? ? {
? ? ? ? ? ? // Task is time-driven, dynamicPriority is last execution age (measured in desiredPeriods)
? ? ? ? ? ? // Task age is calculated from last execution
? ? ? ? ? ? task->taskAgeCycles = ((currentTimeUs - task->lastExecutedAt) / task->desiredPeriod);
? ? ? ? ? ? if (task->taskAgeCycles > 0) {
? ? ? ? ? ? ? ? task->dynamicPriority = 1 + task->staticPriority * task->taskAgeCycles;
? ? ? ? ? ? ? ? waitingTasks++;
? ? ? ? ? ? }
? ? ? ? }

? ? ? ? if (task->dynamicPriority > selectedTaskDynamicPriority) {
? ? ? ? ? ? const bool taskCanBeChosenForScheduling =
? ? ? ? ? ? ? ? (outsideRealtimeGuardInterval) ||
? ? ? ? ? ? ? ? (task->taskAgeCycles > 1) ||
? ? ? ? ? ? ? ? (task->staticPriority == TASK_PRIORITY_REALTIME);
? ? ? ? ? ? if (taskCanBeChosenForScheduling) {
? ? ? ? ? ? ? ? selectedTaskDynamicPriority = task->dynamicPriority;
? ? ? ? ? ? ? ? selectedTask = task;
? ? ? ? ? ? }
? ? ? ? }
? ? }

? ? totalWaitingTasksSamples++;
? ? totalWaitingTasks += waitingTasks;

? ? currentTask = selectedTask;

? ? if (selectedTask)?
? ? {
? ? ? ? // Found a task that should be run
? ? ? ? selectedTask->taskLatestDeltaTime = currentTimeUs - selectedTask->lastExecutedAt;
? ? ? ? selectedTask->lastExecutedAt = currentTimeUs;
? ? ? ? selectedTask->dynamicPriority = 0;

? ? ? ? // Execute task
#ifdef SKIP_TASK_STATISTICS
? ? ? ? selectedTask->taskFunc(currentTimeUs);
#else
? ? ? ? if (calculateTaskStatistics)?
? ? ? ? {
? ? ? ? ? ? const timeUs_t currentTimeBeforeTaskCall = micros();
? ? ? ? ? ? selectedTask->taskFunc(currentTimeBeforeTaskCall);
? ? ? ? ? ? const timeUs_t taskExecutionTime = micros() - currentTimeBeforeTaskCall;
? ? ? ? ? ? selectedTask->movingSumExecutionTime += taskExecutionTime - selectedTask->movingSumExecutionTime / MOVING_SUM_COUNT;
? ? ? ? ? ? selectedTask->totalExecutionTime += taskExecutionTime; ? // time consumed by scheduler + task
? ? ? ? ? ? selectedTask->maxExecutionTime = MAX(selectedTask->maxExecutionTime, taskExecutionTime);
? ? ? ? } else {
? ? ? ? ? ? selectedTask->taskFunc(currentTimeUs);
? ? ? ? }

#endif
#if defined(SCHEDULER_DEBUG)
? ? ? ? DEBUG_SET(DEBUG_SCHEDULER, 2, micros() - currentTimeUs - taskExecutionTime); // time spent in scheduler
? ? } else {
? ? ? ? DEBUG_SET(DEBUG_SCHEDULER, 2, micros() - currentTimeUs);
#endif
? ? }

? ? GET_SCHEDULER_LOCALS();
}

main函數

int main()

{

systemInit();

fcTasksInit();
? ? while (true) { ??
? ? ? ? scheduler();

}

}

運行效果

/** This file is part of Cleanflight.** Cleanflight is free software: you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation, either version 3 of the License, or* (at your option) any later version.** Cleanflight is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.** You should have received a copy of the GNU General Public License* along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.*/#pragma once #include "stm32f30x.h" #define STATIC_UNIT_TESTED static #define UNUSED(x) (void)(x) #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define ABS(x) ((x) > 0 ? (x) : -(x)) #define SCHEDULER_DELAY_LIMIT 1 #define GET_SCHEDULER_LOCALS() {} // time difference, 32 bits always sufficienttypedef int32_t timeDelta_t; // millisecond time typedef uint32_t timeMs_t; // microsecond time typedef uint32_t timeUs_t; typedef enum {TASK_PRIORITY_IDLE = 0, // Disables dynamic scheduling, task is executed only if no other task is active this cycleTASK_PRIORITY_LOW = 1,TASK_PRIORITY_MEDIUM = 3,TASK_PRIORITY_MEDIUM_HIGH = 4,TASK_PRIORITY_HIGH = 5,TASK_PRIORITY_REALTIME = 6,TASK_PRIORITY_MAX = 255 } cfTaskPriority_e;typedef struct {timeUs_t maxExecutionTime;timeUs_t totalExecutionTime;timeUs_t averageExecutionTime; } cfCheckFuncInfo_t;typedef struct {const char * taskName;const char * subTaskName;bool isEnabled;uint8_t staticPriority;timeDelta_t desiredPeriod;timeDelta_t latestDeltaTime;timeUs_t maxExecutionTime;timeUs_t totalExecutionTime;timeUs_t averageExecutionTime; } cfTaskInfo_t;typedef enum ActualTasks {/* Actual tasks */TASK_SYSTEM = 0,//TASK_GYROPID,//TASK_ACCEL,//TASK_ATTITUDE,//TASK_RX,TASK_SERIAL,//TASK_DISPATCH,//TASK_BATTERY_VOLTAGE,//TASK_BATTERY_CURRENT,//TASK_BATTERY_ALERTS, #ifdef BEEPERTASK_BEEPER, #endif #ifdef GPSTASK_GPS, #endif #ifdef MAGTASK_COMPASS, #endif #ifdef BAROTASK_BARO, #endif #ifdef SONARTASK_SONAR, #endif #if defined(BARO) || defined(SONAR)TASK_ALTITUDE, #endif #ifdef USE_DASHBOARDTASK_DASHBOARD, #endif #ifdef TELEMETRYTASK_TELEMETRY, #endif #ifdef LED_STRIPTASK_LEDSTRIP, #endif #ifdef TRANSPONDERTASK_TRANSPONDER, #endif #ifdef STACK_CHECKTASK_STACK_CHECK, #endif #ifdef OSDTASK_OSD, #endif #ifdef USE_OSD_SLAVETASK_OSD_SLAVE, #endif #ifdef USE_BSTTASK_BST_MASTER_PROCESS, #endif #ifdef USE_ESC_SENSORTASK_ESC_SENSOR, #endif #ifdef CMSTASK_CMS, #endif #ifdef VTX_CONTROLTASK_VTXCTRL, #endif#ifdef USE_RCSPLITTASK_RCSPLIT, #endif/* Count of real tasks */TASK_COUNT,/* Service task IDs */TASK_NONE = TASK_COUNT,TASK_SELF } cfTaskId_e;typedef struct {// Configurationconst char * taskName;const char * subTaskName;bool (*checkFunc)(timeUs_t currentTimeUs, timeDelta_t currentDeltaTimeUs);void (*taskFunc)(timeUs_t currentTimeUs);timeDelta_t desiredPeriod; // target period of executionconst uint8_t staticPriority; // dynamicPriority grows in steps of this size, shouldn't be zero// Schedulinguint16_t dynamicPriority; // measurement of how old task was last executed, used to avoid task starvationuint16_t taskAgeCycles;timeDelta_t taskLatestDeltaTime;timeUs_t lastExecutedAt; // last time of invocationtimeUs_t lastSignaledAt; // time of invocation event for event-driven tasks#ifndef SKIP_TASK_STATISTICS// StatisticstimeUs_t movingSumExecutionTime; // moving sum over 32 samplestimeUs_t maxExecutionTime;timeUs_t totalExecutionTime; // total time consumed by task since boot #endif } cfTask_t;extern cfTask_t cfTasks[TASK_COUNT]; extern uint16_t averageSystemLoadPercent;void getCheckFuncInfo(cfCheckFuncInfo_t *checkFuncInfo); void getTaskInfo(cfTaskId_e taskId, cfTaskInfo_t *taskInfo); void rescheduleTask(cfTaskId_e taskId, uint32_t newPeriodMicros); void setTaskEnabled(cfTaskId_e taskId, bool newEnabledState); timeDelta_t getTaskDeltaTime(cfTaskId_e taskId); void schedulerSetCalulateTaskStatistics(bool calculateTaskStatistics); void schedulerResetTaskStatistics(cfTaskId_e taskId);void schedulerInit(void); void scheduler(void); void taskSystem(timeUs_t currentTime);#define LOAD_PERCENTAGE_ONE 100#define isSystemOverloaded() (averageSystemLoadPercent >= LOAD_PERCENTAGE_ONE) /** This file is part of Cleanflight.** Cleanflight is free software: you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation, either version 3 of the License, or* (at your option) any later version.** Cleanflight is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.** You should have received a copy of the GNU General Public License* along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.*/#define SRC_MAIN_SCHEDULER_C_#include <stdbool.h> #include <stdint.h> #include <string.h> #include "scheduler.h" #include "system.h" //#include "platform.h" // //#include "build/build_config.h" //#include "build/debug.h" // //#include "scheduler/scheduler.h" // //#include "config/config_unittest.h" // //#include "common/maths.h" //#include "common/time.h" //#include "common/utils.h" // //#include "drivers/time.h"// DEBUG_SCHEDULER, timings for: // 0 - gyroUpdate() // 1 - pidController() // 2 - time spent in scheduler // 3 - time spent executing check functionstatic cfTask_t *currentTask = NULL;static uint32_t totalWaitingTasks; static uint32_t totalWaitingTasksSamples;static bool calculateTaskStatistics; uint16_t averageSystemLoadPercent = 0;static int taskQueuePos = 0; STATIC_UNIT_TESTED int taskQueueSize = 0;// No need for a linked list for the queue, since items are only inserted at startupSTATIC_UNIT_TESTED cfTask_t* taskQueueArray[TASK_COUNT + 1]; // extra item for NULL pointer at end of queuevoid queueClear(void) {memset(taskQueueArray, 0, sizeof(taskQueueArray));taskQueuePos = 0;taskQueueSize = 0; }bool queueContains(cfTask_t *task) {for (int ii = 0; ii < taskQueueSize; ++ii) {if (taskQueueArray[ii] == task) {return true;}}return false; }bool queueAdd(cfTask_t *task) {if ((taskQueueSize >= TASK_COUNT) || queueContains(task)) {return false;}for (int ii = 0; ii <= taskQueueSize; ++ii) {if (taskQueueArray[ii] == NULL || taskQueueArray[ii]->staticPriority < task->staticPriority) {memmove(&taskQueueArray[ii+1], &taskQueueArray[ii], sizeof(task) * (taskQueueSize - ii));taskQueueArray[ii] = task;++taskQueueSize;return true;}}return false; }bool queueRemove(cfTask_t *task) {for (int ii = 0; ii < taskQueueSize; ++ii) {if (taskQueueArray[ii] == task) {memmove(&taskQueueArray[ii], &taskQueueArray[ii+1], sizeof(task) * (taskQueueSize - ii));--taskQueueSize;return true;}}return false; }/** Returns first item queue or NULL if queue empty*/ cfTask_t *queueFirst(void) {taskQueuePos = 0;return taskQueueArray[0]; // guaranteed to be NULL if queue is empty }/** Returns next item in queue or NULL if at end of queue*/ cfTask_t *queueNext(void) {return taskQueueArray[++taskQueuePos]; // guaranteed to be NULL at end of queue }void taskSystem(timeUs_t currentTimeUs) {UNUSED(currentTimeUs);// Calculate system loadif (totalWaitingTasksSamples > 0) {averageSystemLoadPercent = 100 * totalWaitingTasks / totalWaitingTasksSamples;totalWaitingTasksSamples = 0;totalWaitingTasks = 0;} #if defined(SIMULATOR_BUILD)averageSystemLoadPercent = 0; #endif }#ifndef SKIP_TASK_STATISTICS #define MOVING_SUM_COUNT 32 timeUs_t checkFuncMaxExecutionTime; timeUs_t checkFuncTotalExecutionTime; timeUs_t checkFuncMovingSumExecutionTime;void getCheckFuncInfo(cfCheckFuncInfo_t *checkFuncInfo) {checkFuncInfo->maxExecutionTime = checkFuncMaxExecutionTime;checkFuncInfo->totalExecutionTime = checkFuncTotalExecutionTime;checkFuncInfo->averageExecutionTime = checkFuncMovingSumExecutionTime / MOVING_SUM_COUNT; }void getTaskInfo(cfTaskId_e taskId, cfTaskInfo_t * taskInfo) {taskInfo->taskName = cfTasks[taskId].taskName;taskInfo->subTaskName = cfTasks[taskId].subTaskName;taskInfo->isEnabled = queueContains(&cfTasks[taskId]);taskInfo->desiredPeriod = cfTasks[taskId].desiredPeriod;taskInfo->staticPriority = cfTasks[taskId].staticPriority;taskInfo->maxExecutionTime = cfTasks[taskId].maxExecutionTime;taskInfo->totalExecutionTime = cfTasks[taskId].totalExecutionTime;taskInfo->averageExecutionTime = cfTasks[taskId].movingSumExecutionTime / MOVING_SUM_COUNT;taskInfo->latestDeltaTime = cfTasks[taskId].taskLatestDeltaTime; } #endifvoid rescheduleTask(cfTaskId_e taskId, uint32_t newPeriodMicros) {if (taskId == TASK_SELF) {cfTask_t *task = currentTask;task->desiredPeriod = MAX(SCHEDULER_DELAY_LIMIT, newPeriodMicros); // Limit delay to 100us (10 kHz) to prevent scheduler clogging} else if (taskId < TASK_COUNT) {cfTask_t *task = &cfTasks[taskId];task->desiredPeriod = MAX(SCHEDULER_DELAY_LIMIT, newPeriodMicros); // Limit delay to 100us (10 kHz) to prevent scheduler clogging} }void setTaskEnabled(cfTaskId_e taskId, bool enabled) {if (taskId == TASK_SELF || taskId < TASK_COUNT) {cfTask_t *task = taskId == TASK_SELF ? currentTask : &cfTasks[taskId];if (enabled && task->taskFunc) {queueAdd(task);} else {queueRemove(task);}} }timeDelta_t getTaskDeltaTime(cfTaskId_e taskId) {if (taskId == TASK_SELF) {return currentTask->taskLatestDeltaTime;} else if (taskId < TASK_COUNT) {return cfTasks[taskId].taskLatestDeltaTime;} else {return 0;} }void schedulerSetCalulateTaskStatistics(bool calculateTaskStatisticsToUse) {calculateTaskStatistics = calculateTaskStatisticsToUse; }void schedulerResetTaskStatistics(cfTaskId_e taskId) { #ifdef SKIP_TASK_STATISTICSUNUSED(taskId); #elseif (taskId == TASK_SELF) {currentTask->movingSumExecutionTime = 0;currentTask->totalExecutionTime = 0;currentTask->maxExecutionTime = 0;} else if (taskId < TASK_COUNT) {cfTasks[taskId].movingSumExecutionTime = 0;cfTasks[taskId].totalExecutionTime = 0;cfTasks[taskId].maxExecutionTime = 0;} #endif }void schedulerInit(void) {calculateTaskStatistics = true;queueClear();queueAdd(&cfTasks[TASK_SYSTEM]); }void scheduler(void) {// Cache currentTimeconst timeUs_t currentTimeUs = micros();// Check for realtime tasksbool outsideRealtimeGuardInterval = true;for (const cfTask_t *task = queueFirst(); task != NULL && task->staticPriority >= TASK_PRIORITY_REALTIME; task = queueNext()){const timeUs_t nextExecuteAt = task->lastExecutedAt + task->desiredPeriod;if ((timeDelta_t)(currentTimeUs - nextExecuteAt) >= 0){outsideRealtimeGuardInterval = false;break;}}// The task to be invokedcfTask_t *selectedTask = NULL;uint16_t selectedTaskDynamicPriority = 0;// Update task dynamic prioritiesuint16_t waitingTasks = 0;for (cfTask_t *task = queueFirst(); task != NULL; task = queueNext()) {// Task has checkFunc - event drivenif (task->checkFunc) { #if defined(SCHEDULER_DEBUG)const timeUs_t currentTimeBeforeCheckFuncCall = micros(); #elseconst timeUs_t currentTimeBeforeCheckFuncCall = currentTimeUs; #endif// Increase priority for event driven tasksif (task->dynamicPriority > 0){task->taskAgeCycles = 1 + ((currentTimeUs - task->lastSignaledAt) / task->desiredPeriod);task->dynamicPriority = 1 + task->staticPriority * task->taskAgeCycles;waitingTasks++;} else if (task->checkFunc(currentTimeBeforeCheckFuncCall, currentTimeBeforeCheckFuncCall - task->lastExecutedAt)){ #if defined(SCHEDULER_DEBUG)DEBUG_SET(DEBUG_SCHEDULER, 3, micros() - currentTimeBeforeCheckFuncCall); #endif #ifndef SKIP_TASK_STATISTICSif (calculateTaskStatistics) {const uint32_t checkFuncExecutionTime = micros() - currentTimeBeforeCheckFuncCall;checkFuncMovingSumExecutionTime += checkFuncExecutionTime - checkFuncMovingSumExecutionTime / MOVING_SUM_COUNT;checkFuncTotalExecutionTime += checkFuncExecutionTime; // time consumed by scheduler + taskcheckFuncMaxExecutionTime = MAX(checkFuncMaxExecutionTime, checkFuncExecutionTime);} #endiftask->lastSignaledAt = currentTimeBeforeCheckFuncCall;task->taskAgeCycles = 1;task->dynamicPriority = 1 + task->staticPriority;waitingTasks++;} else {task->taskAgeCycles = 0;}}else {// Task is time-driven, dynamicPriority is last execution age (measured in desiredPeriods)// Task age is calculated from last executiontask->taskAgeCycles = ((currentTimeUs - task->lastExecutedAt) / task->desiredPeriod);if (task->taskAgeCycles > 0) {task->dynamicPriority = 1 + task->staticPriority * task->taskAgeCycles;waitingTasks++;}}if (task->dynamicPriority > selectedTaskDynamicPriority) {const bool taskCanBeChosenForScheduling =(outsideRealtimeGuardInterval) ||(task->taskAgeCycles > 1) ||(task->staticPriority == TASK_PRIORITY_REALTIME);if (taskCanBeChosenForScheduling) {selectedTaskDynamicPriority = task->dynamicPriority;selectedTask = task;}}}totalWaitingTasksSamples++;totalWaitingTasks += waitingTasks;currentTask = selectedTask;if (selectedTask) {// Found a task that should be runselectedTask->taskLatestDeltaTime = currentTimeUs - selectedTask->lastExecutedAt;selectedTask->lastExecutedAt = currentTimeUs;selectedTask->dynamicPriority = 0;// Execute task #ifdef SKIP_TASK_STATISTICSselectedTask->taskFunc(currentTimeUs); #elseif (calculateTaskStatistics) {const timeUs_t currentTimeBeforeTaskCall = micros();selectedTask->taskFunc(currentTimeBeforeTaskCall);const timeUs_t taskExecutionTime = micros() - currentTimeBeforeTaskCall;selectedTask->movingSumExecutionTime += taskExecutionTime - selectedTask->movingSumExecutionTime / MOVING_SUM_COUNT;selectedTask->totalExecutionTime += taskExecutionTime; // time consumed by scheduler + taskselectedTask->maxExecutionTime = MAX(selectedTask->maxExecutionTime, taskExecutionTime);} else {selectedTask->taskFunc(currentTimeUs);}#endif #if defined(SCHEDULER_DEBUG)DEBUG_SET(DEBUG_SCHEDULER, 2, micros() - currentTimeUs - taskExecutionTime); // time spent in scheduler} else {DEBUG_SET(DEBUG_SCHEDULER, 2, micros() - currentTimeUs); #endif}GET_SCHEDULER_LOCALS(); }

?

?

總結

以上是生活随笔為你收集整理的CleanFlight 源码分析 一,任务调度的全部內容,希望文章能夠幫你解決所遇到的問題。

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

久久久久影视 | 久久伊人八月婷婷综合激情 | 日韩欧美综合在线视频 | 在线中文字幕视频 | 美女黄频网站 | 欧洲视频一区 | 久久激情视频 久久 | 久久 精品一区 | 成人免费一级 | 就要色综合 | 九九有精品 | 日日爱999 | 五月天婷婷免费视频 | 国产精品高潮呻吟久久久久 | 欧美极品xxxx| 日韩偷拍精品 | wwwwww色| 亚洲最大的av网站 | 久久人人添人人爽添人人88v | 亚洲午夜精品久久久久久久久 | 精品在线二区 | 亚洲成人av片在线观看 | 国产一级二级在线 | 成人a视频在线观看 | 探花视频免费观看 | 美女视频网站久久 | 婷婷色在线资源 | 中文字幕专区高清在线观看 | 日韩黄色一级电影 | 久草| 国产精品欧美 | 99精品电影 | 日韩成人免费在线 | 国产一区二区影院 | 亚洲国产片色 | www.婷婷色| 日韩视频在线不卡 | 一区二区不卡 | 国产精品女同一区二区三区久久夜 | 亚洲精品免费视频 | 97超碰人人模人人人爽人人爱 | www.狠狠干| 正在播放一区二区 | 国产精品久久久久久久久婷婷 | 欧美日韩一区久久 | 91精品国产自产在线观看永久 | 国产精品永久在线 | 成人午夜精品久久久久久久3d | 久草香蕉在线 | 欧美日韩中文在线视频 | 久久老司机精品视频 | 亚洲视频在线播放 | 久久国产精品一区二区三区 | 91av资源在线 | 一本一本久久aa综合精品 | 最近免费在线观看 | 香蕉在线视频播放网站 | 天天射综合 | 国产精品久久精品国产 | 色婷婷97| 91麻豆精品| 91.精品高清在线观看 | 久久黄网站| 亚洲一级电影在线观看 | 一级性生活片 | 国产在线观看午夜 | 国产精品99久久久久 | 成人福利在线观看 | 成人免费观看视频网站 | 91精品网站在线观看 | 久久中国精品 | 性色av一区二区三区在线观看 | 国产福利中文字幕 | 久操久| 国产99中文字幕 | www.久久99 | 天天射天| 国产高清综合 | 免费国产在线精品 | 国产夫妻自拍av | 99精品在线视频观看 | 久久国产精品99久久久久久老狼 | 国产精品男女视频 | 午夜精品久久久久久久99无限制 | 18国产精品福利片久久婷 | 免费色视频 | 一级黄色片在线播放 | 久久久综合电影 | 一区二区三区免费在线观看 | 日韩免费高清在线观看 | 男女激情片在线观看 | 日韩二区三区在线观看 | 成人午夜精品福利免费 | 久久人人爽爽人人爽人人片av | 国产精品免费视频一区二区 | 欧美性视频网站 | 色欧美视频 | 天天射狠狠干 | 成人一级在线 | 一区 二区 精品 | 蜜臀久久99精品久久久无需会员 | 日韩精品一区二区在线视频 | 玖玖爱免费视频 | 亚洲欧美视频在线观看 | 国内精品久久久久久久97牛牛 | 久久视频在线视频 | 综合国产在线 | 91精品成人 | 91视视频在线直接观看在线看网页在线看 | 天天操伊人 | 九九亚洲视频 | 精品久久1| 亚洲电影影音先锋 | 美女久久久久 | 国产精品18久久久久久久网站 | 国产精品一级视频 | 国产日本亚洲高清 | 国际精品久久久久 | 色综合天天综合在线视频 | 韩国av在线 | 九九久久婷婷 | 有码中文在线 | 日韩精品视频一二三 | 日韩美在线 | 日韩高清久久 | 国产亚洲成人网 | 成人av片在线观看 | 亚洲免费国产视频 | 在线观看亚洲成人 | 日韩欧美在线视频一区二区三区 | 97视频免费在线看 | 五月天婷婷在线视频 | 97热视频 | 国产手机在线观看视频 | 亚洲国产精品成人综合 | 99精品在线观看视频 | 青青河边草免费视频 | 成人a级网站 | 欧美激情视频在线观看免费 | 天天躁日日躁狠狠躁av麻豆 | 日韩一区视频在线 | 91亚洲精品久久久蜜桃借种 | 天天操夜| 五月天亚洲综合 | 成人黄色大片在线观看 | 日韩欧美区 | 日韩一区二区三区观看 | 日韩精品aaa| 久人人 | 国产精品热视频 | 亚洲1区 在线 | av免费在线播放 | 综合网婷婷 | 黄网站免费久久 | 国产精久久久 | 99久久久国产精品免费99 | 91黄色影视 | 久久久精品国产免费观看一区二区 | 91桃色免费视频 | 国语麻豆 | 免费中文字幕视频 | 91av小视频 | www.色的 | 狠狠撸电影 | 人人爽人人爽人人爽学生一级 | 99视频+国产日韩欧美 | 午夜国产在线 | 国产明星视频三级a三级点| 成年人黄色在线观看 | 人人dvd| 国产区第一页 | 一区二区三区在线播放 | 免费看一级 | 亚洲视频h | 日本久久不卡视频 | 久久人人爽爽人人爽人人片av | 91少妇精拍在线播放 | 亚洲年轻女教师毛茸茸 | 国产黄色片免费 | 成年人在线电影 | 999久久久 | 日日碰狠狠躁久久躁综合网 | 91理论片午午伦夜理片久久 | 深爱五月激情五月 | 激情久久综合网 | 在线观看色网 | 精品国产免费观看 | 色99网| 成人97视频一区二区 | 粉嫩av一区二区三区四区五区 | 99精品热视频只有精品10 | 韩国av一区二区三区 | 波多野结衣一区 | 91色九色 | 欧美精品在线视频 | 黄色一二级片 | 91视频 - 88av | 五月天婷婷在线播放 | 97夜夜澡人人双人人人喊 | 欧美性爽爽 | 亚洲精品免费在线播放 | 亚洲视频 在线观看 | 91色欧美| 久久久不卡影院 | 一区二区 不卡 | 国产毛片在线 | 992tv人人网tv亚洲精品 | 激情综合色播五月 | 久久精品99久久 | 97精品超碰一区二区三区 | 最近中文字幕免费av | 亚洲国产中文在线 | 亚洲激精日韩激精欧美精品 | 亚洲伊人色 | 五月婷婷六月丁香激情 | 午夜精品一区二区三区在线 | 欧美一区二区三区四区夜夜大片 | 亚洲精品国精品久久99热一 | 最近中文字幕高清字幕免费mv | 激情丁香在线 | 99久久精品国产毛片 | 久精品视频在线 | 97高清视频| 日韩av片无码一区二区不卡电影 | 狠狠狠干 | 欧美日韩国产精品一区二区亚洲 | 日韩成人中文字幕 | 国产精品久久久久久五月尺 | 久久一级电影 | 中文免费观看 | 欧美国产日韩一区二区三区 | 国产精品毛片一区视频播 | 国产精品福利在线播放 | 在线亚洲观看 | 狠狠狠色丁香婷婷综合久久五月 | 日韩网站在线观看 | 国产精品区在线观看 | 中文字幕在线观看不卡 | 色噜噜噜 | 日日碰夜夜爽 | www婷婷| 日韩精品免费在线播放 | 五月开心六月伊人色婷婷 | 天堂av最新网址 | 黄视频网站大全 | 97免费在线观看视频 | 激情视频在线高清看 | 久久99网站 | 中文字幕第一页在线视频 | 国产视频在线看 | 欧美精品久久久久久久久久丰满 | 亚洲无人区小视频 | 黄色软件在线观看免费 | a'aaa级片在线观看 | 天天操操操操操操 | 亚洲午夜精品一区 | 久久国产美女视频 | 最新av免费在线 | 伊人久久一区 | 国产 欧美 在线 | 久久久精品午夜 | 婷婷丁香九月 | 91av影视 | 又黄又爽的免费高潮视频 | 韩国精品视频在线观看 | 日韩欧美精品一区二区三区经典 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 欧美aa一级片| 日本精品久久久久中文字幕5 | 蜜臀av性久久久久av蜜臀妖精 | 日韩高清不卡一区二区三区 | 欧美日韩一区二区三区在线观看视频 | 91麻豆精品| 97精品国产97久久久久久春色 | 欧美午夜一区二区福利视频 | 在线看片a| 中文字幕亚洲精品在线观看 | 午夜精品一区二区三区可下载 | 亚洲六月丁香色婷婷综合久久 | 天堂va在线高清一区 | 天天干,天天射,天天操,天天摸 | 精品一区二区三区电影 | 99国产在线观看 | 美女黄久久 | 日韩精品免费一区二区在线观看 | 99精品视频网站 | 91九色在线 | 久操伊人 | 99精品视频播放 | 国产在线视频不卡 | 在线播放亚洲 | 五月香视频在线观看 | 精品成人网 | 日韩va欧美va亚洲va久久 | 丁五月婷婷 | 视频成人 | 成人免费看黄 | 91精品国产91久久久久 | 天堂网一区二区 | 精品99视频 | 免费视频网 | 精品久久久久久久久久久久 | 最近日本韩国中文字幕 | 在线看一区 | 中文字幕高清视频 | 亚洲精品动漫久久久久 | 97成人在线观看视频 | 亚洲精品乱码久久久久v最新版 | 丁香六月综合网 | 国产亚州精品视频 | 精品国产福利在线 | 在线视频成人 | 在线免费观看欧美日韩 | 国产精品免费一区二区三区在线观看 | 久久精品欧美视频 | 国产成a人亚洲精v品在线观看 | 国产一级在线 | 91精品亚洲影视在线观看 | 欧美日韩电影在线播放 | 国产精品一区二区久久精品爱微奶 | 欧美成人高清 | 国产精品成人久久久久久久 | 婷婷综合成人 | 色91在线视频| 免费热情视频 | 免费韩国av | 热久精品 | 深爱婷婷久久综合 | 日韩久久久久久久久久 | 黄色资源在线观看 | 欧美国产三区 | 国产午夜三级 | 欧美日韩在线视频观看 | 精品1区2区3区 | 亚洲人成影院在线 | 久久国产免费 | 国产成在线观看免费视频 | 国产在线精品播放 | 亚洲一区精品人人爽人人躁 | 四虎在线免费观看视频 | 黄色片视频在线观看 | 国产成人在线免费观看 | 香蕉视频18| 伊人久在线 | 国产精品一二 | 国产精品久久久久久999 | 亚洲精品日韩一区二区电影 | 国产免费区 | 国产美女黄网站免费 | 色吧av色av | 91高清在线看 | 中文字幕欧美日韩va免费视频 | 亚洲高清国产视频 | 久久观看免费视频 | 亚洲天堂色婷婷 | 国产 色| 久久综合久久久 | 国产精品久久久久久久免费 | 人人澡人 | 久久久国产精品一区二区中文 | 国产精品白丝jk白祙 | 日韩毛片在线一区二区毛片 | 波多野结衣电影一区 | 久久久久久久久久久久久国产精品 | 久久 精品一区 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 亚洲日本va午夜在线影院 | 麻豆视频在线免费 | 亚洲国产操 | 91视频国产免费 | 精品久久影院 | 久草在线视频免赞 | 91丨九色丨国产在线 | 久草在在线 | 91亚洲激情| 久久综合精品国产一区二区三区 | 日本在线免费看 | 久久免视频 | 久久好看免费视频 | 免费看成人片 | 亚洲天堂在线观看完整版 | 在线成人欧美 | 国产剧情一区二区 | 香蕉蜜桃视频 | 亚洲视频播放 | 欧美99精品 | 在线观看亚洲国产精品 | 日韩理论片中文字幕 | 欧美日韩高清在线观看 | 日本成址在线观看 | 成人av电影在线 | 一区二区三区 亚洲 | 国产又粗又猛又黄视频 | 亚洲国产片| 成人一级黄色片 | 亚洲毛片视频 | 九九热re | 人人看黄色| 国产成人三级在线播放 | 亚洲精品乱码久久久久久蜜桃91 | 69亚洲乱| 男女激情麻豆 | 在线观看中文字幕视频 | 国产大片黄色 | 中文字幕乱码电影 | 欧美精品国产综合久久 | 激情综合网五月激情 | 久草www| 国产精品久久久av久久久 | 色久网| 99r在线观看 | 九九在线播放 | 久久精品综合视频 | 成年免费在线视频 | 天天操夜夜拍 | 日韩久久视频 | 激情视频区 | 国产精品白丝jk白祙 | 亚洲精品国产第一综合99久久 | 中文欧美字幕免费 | 日韩精品在线视频免费观看 | 免费看污黄网站 | 成人久久免费视频 | 97国产精品久久 | 黄网在线免费观看 | 在线看一级片 | 在线观看成人 | 久久精品国产美女 | 久久久久久久久久久国产精品 | zzijzzij亚洲日本少妇熟睡 | 免费视频一级片 | 色婷婷久久久 | 夜夜天天干 | 天天操狠狠操 | 国产高清在线观看 | www最近高清中文国语在线观看 | 天天曰天天爽 | 一级精品视频在线观看宜春院 | 黄色不卡av | 欧美亚洲一级片 | 欧美日韩精品在线 | 国产一区 在线播放 | 国产婷婷视频在线 | 日本在线h | 麻豆 videos | 伊人午夜| 极品美女被弄高潮视频网站 | 黄色的片子 | 91av美女| 色噜噜在线观看 | 观看免费av | 99精品免费久久久久久久久日本 | 不卡视频在线 | 青青河边草观看完整版高清 | 久久久精品视频网站 | 国产婷婷视频在线 | 天天干天天干天天射 | 成人a级黄色片 | 国产高清日韩欧美 | 999久久久国产精品 高清av免费观看 | 香蕉在线影院 | 国产资源网站 | 天天做日日做天天爽视频免费 | 成年人毛片在线观看 | 亚洲精品观看 | 日韩av进入 | 91人人视频在线观看 | 韩日三级在线 | 免费人做人爱www的视 | 操操碰 | 久久久精品 一区二区三区 国产99视频在线观看 | 国产精品不卡在线播放 | 狠狠色丁香久久婷婷综 | 伊人夜夜 | zzijzzij亚洲成熟少妇 | 成年人app网址 | 久草免费福利在线观看 | 精产嫩模国品一二三区 | 欧美一级特黄aaaaaa大片在线观看 | 伊人狠狠| 日韩免费av网址 | 在线播放av网址 | 乱男乱女www7788 | 免费观看91视频大全 | 91亚洲精品久久久中文字幕 | 黄色一级影院 | 成年人电影免费在线观看 | 久9在线| 国产女人40精品一区毛片视频 | 久久国产网站 | 国产成人精品在线 | 天天综合91 | 久久第四色 | 奇米影视8888 | a级免费观看 | 欧美日韩高清在线观看 | 免费看片成年人 | 天天操人人要 | 日韩精品久久久久久久电影99爱 | 日韩一区二区三区不卡 | 欧美精品一区二区在线播放 | 亚洲区另类春色综合小说校园片 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 中文不卡视频 | 天天操天天操天天操天天操 | 国内精品中文字幕 | 久艹在线免费观看 | 日韩在线视频国产 | 亚洲天堂网在线视频观看 | 久爱综合 | 午夜在线免费视频 | 久久久.com | www.在线看片.com | 欧美激情va永久在线播放 | 91精品夜夜 | 中文字幕一区二区三区在线观看 | 91爱爱电影 | 在线观看91精品视频 | 国产成人精品综合久久久 | 日韩免费b | 成人h电影在线观看 | 九九热在线精品视频 | 看国产黄色大片 | 精品国产精品一区二区夜夜嗨 | 超碰97成人| 9在线观看免费高清完整版 玖玖爱免费视频 | 国产手机在线观看 | 国内丰满少妇猛烈精品播放 | 欧洲亚洲女同hd | 一区二区三区福利 | 国产高清视频在线免费观看 | 十八岁以下禁止观看的1000个网站 | 最近日本韩国中文字幕 | 天天添夜夜操 | 免费看v片 | 国产精品一区二区吃奶在线观看 | 国产免费黄视频在线观看 | 一区二区三区免费在线播放 | 国产视频网站在线观看 | 日韩成人精品 | 日本精品一区二区三区在线观看 | 干干夜夜 | 国产精品国产三级在线专区 | 丁香花在线视频观看免费 | 国产在线免费观看 | 2019中文在线观看 | 欧美性性网| 日韩av电影一区 | 丁香九月婷婷 | 91污污视频在线观看 | 久久久精品国产一区二区 | 一二区av | 久草在线视频免费资源观看 | 免费看在线看www777 | 九九精品视频在线 | 久草综合在线 | 国产成人精品一二三区 | 在线免费黄 | 国产在线观看国语版免费 | 黄色小说视频在线 | a级片久久久 | 精品欧美一区二区三区久久久 | 国产福利精品在线观看 | 久草在线视频中文 | 国产97av| 欧美精品二区 | 免费av大片| 免费中文字幕视频 | 六月丁香在线观看 | 国产乱码精品一区二区三区介绍 | 国产免费激情久久 | 精品免费久久久久 | 爱爱av在线 | 欧洲亚洲国产视频 | 中文字幕在线看人 | 色噜噜噜噜| 国产在线视频在线观看 | 91精品导航| 曰韩在线| 国产免费黄色 | 91欧美国产 | 色婷婷狠狠五月综合天色拍 | 亚洲国产精品日韩 | 久操久 | 国产色在线 | 免费a v观看 | 国产黄色免费电影 | 色婷婷激情电影 | 国产一级特黄毛片在线毛片 | 国产精品一区二区视频 | 中文字幕在线观看网址 | www.97色.com| 国产在线观看av | 天天操天天射天天 | 超碰国产97| 91中文字幕在线视频 | 国产品久精国精产拍 | 免费看三级黄色片 | 99久久精品久久久久久动态片 | 久久不射影院 | 中文字幕国产精品一区二区 | 成人在线视| 蜜臀精品久久久久久蜜臀 | 国产精品女主播一区二区三区 | 不卡视频国产 | 久久精品99国产 | 2019中文在线观看 | 天天草天天插 | 天天草天天操 | 激情综合啪 | 少妇bbw揉bbb欧美 | 中文字幕在线国产精品 | 免费高清在线观看电视网站 | 国产一区二区高清视频 | 成人久久久久久久久 | 久久免费视频网 | 亚洲香蕉视频 | 久久视频精品在线 | 最近最新最好看中文视频 | 黄色亚洲大片免费在线观看 | 亚洲 精品在线视频 | 97理论片 | 国产区精品区 | 日韩天天干 | 国产精品毛片久久久久久久 | 免费视频二区 | 国产在线欧美 | 四虎精品成人免费网站 | 精品视频不卡 | 91精品小视频 | 精品99免费视频 | 最新色站 | 操久久网 | 97在线观看视频免费 | 国产精品免费视频观看 | 天天干天天操天天拍 | 免费视频一二三区 | 一区二区三区免费网站 | 国产手机视频在线 | 精品视频区 | 国产精品区一区 | 999久久久久久久久6666 | av福利第一导航 | 91一区啪爱嗯打偷拍欧美 | 99热99热 | 97手机电影网 | 激情综合网在线观看 | 婷婷深爱网 | 黄色一级在线免费观看 | 在线观看黄网 | 久久这里只有精品9 | 中文字幕在线国产精品 | 91在线观 | 久久免费视频网 | 国产精品久久久久久久久软件 | 中文字幕资源站 | 97人人模人人爽人人喊网 | 狠狠色丁香久久婷婷综合_中 | 成人理论在线观看 | 伊人久久在线观看 | 一级片免费观看 | 久久综合九色综合久久久精品综合 | 国产大尺度视频 | 国产成人精品在线播放 | 波多野结衣电影一区 | 国产一级高清 | 夜色成人av | 日韩在线 | 亚洲精品美女久久17c | 天天爱av导航 | 成年一级片 | 在线观看视频日韩 | 黄色小说免费观看 | 久久视精品 | www.狠狠操.com| 一级a性色生活片久久毛片波多野 | 视频在线99 | av成人在线网站 | 成人在线你懂得 | 91精品综合在线观看 | 成人免费网站视频 | 九九国产精品视频 | 天天干婷婷| 91av在线视频免费观看 | 久久91久久久久麻豆精品 | 日韩精品一区二区三区三炮视频 | av免费成人 | 91丨九色丨蝌蚪丰满 | 国产精品久久久网站 | 999久久国精品免费观看网站 | 免费国产一区二区 | 中文字幕免费观看全部电影 | 久久久久久毛片精品免费不卡 | 久久久久久久久久久国产精品 | 中文字幕av在线 | 毛片区| 亚洲国产中文在线观看 | 99精品视频一区 | av色影院| 中文字幕在线影视资源 | 色婷婷视频| 五月开心综合 | 国产精品视频专区 | 97国产精品视频 | 国产一区二区在线免费观看 | 99精品国自产在线 | 日韩av免费一区 | 91亚洲精 | 99r在线视频 | 欧美成人在线免费观看 | 日韩av网页 | 亚洲欧美在线综合 | 狠狠干中文字幕 | 色婷婷免费 | 精品一区二三区 | 91av精品| 亚洲va韩国va欧美va精四季 | 日韩av一区二区在线 | 五月婷婷综 | 国产精品久久久久久久久岛 | 中国一级特黄毛片大片久久 | 日韩专区在线观看 | 久在线观看视频 | 一区二区电影网 | 天天拍天天色 | 在线观看成人福利 | 天天操夜夜干 | 国产在线美女 | 97超碰人人澡人人爱学生 | 国产福利久久 | 欧美激情视频一二区 | 亚洲精品中文字幕在线观看 | 日本久久中文 | 日韩a在线观看 | 欧美一级电影片 | 美女视频黄免费的 | 亚洲91中文字幕无线码三区 | 在线看不卡av | 一区二区三区四区五区六区 | 日p视频 | 亚洲精品久久久久久国 | 久久婷婷网 | 欧美坐爱视频 | 久青草国产在线 | 一区二区三区在线观看免费 | 手机看片99 | 国产在线第三页 | 国产成人精品一区在线 | 在线免费精品视频 | 国产二区精品 | www日| 在线免费观看黄色 | 欧美人人爱| 激情喷水 | 日本高清dvd| 亚洲最新视频在线播放 | 免费中文字幕 | 久久国产精品久久精品国产演员表 | 国产亚洲综合在线 | 91麻豆高清视频 | 欧美日bb| 国产手机精品视频 | 久久久91精品国产 | 久久99久久99精品免观看粉嫩 | 精品一二 | 色综合久久天天 | 亚洲最大成人免费网站 | 亚洲精品视频在线观看免费视频 | 国产在线视频一区 | 精品一区精品二区高清 | 天天爽夜夜爽人人爽曰av | 欧美日韩一区二区三区视频 | av动图| 欧美日韩亚洲国产一区 | 日韩av片免费在线观看 | 欧美另类xxx | 国产黄a三级三级三级三级三级 | 国产精品久久嫩一区二区免费 | 91黄色小视频 | 久久影院中文字幕 | 色婷婷视频在线 | 人人干人人搞 | 日韩精品一区在线观看 | 亚洲精品中文在线观看 | 手机在线观看国产精品 | 成人免费91 | 色99在线| 精品99视频 | 操操操干干干 | 色婷婷九月| 五月综合激情 | 开心激情五月网 | av高清在线观看 | 久久免费看a级毛毛片 | 黄网站色 | 人人干人人爽 | 天天操综合网 | 日韩一级电影网站 | 久久99热这里只有精品 | www.av小说 | 草在线视频 | 免费情缘 | 久草在线资源视频 | 国产成人不卡 | 中文在线字幕免费观看 | 国产乱码精品一区二区三区介绍 | 国产视频精品免费播放 | 久久成| 日韩在线观看a | 国产亚洲婷婷免费 | 日韩精品欧美视频 | 就要干b| 日韩黄色网络 | 最近中文字幕在线播放 | 亚洲最大成人免费网站 | 91精品办公室少妇高潮对白 | 色婷婷成人网 | 国产区网址 | 国产精品女同一区二区三区久久夜 | 国产精品成人a免费观看 | 亚洲精品九九 | 久草国产在线 | 免费av视屏| 亚州性色 | 伊人狠狠色丁香婷婷综合 | 国产一区在线看 | 国产一级久久久 | 九九热av | 久久久久国产精品免费免费搜索 | 色综合五月天 | 午夜视频在线观看一区二区三区 | 欧美日韩中文在线观看 | 日本精品中文字幕 | 久久成人国产精品一区二区 | 国产一级精品在线观看 | 奇米网444| 国产成a人亚洲精v品在线观看 | 天天色天天射天天操 | 久久精品视频3 | 99久久精 | 人人看人人爱 | 瑞典xxxx性hd极品 | 丁香av| 人人狠狠 | 91精品视频观看 | 特级黄录像视频 | 久久黄色a级片 | 久久综合偷偷噜噜噜色 | 国产乱对白刺激视频在线观看女王 | 黄色天堂在线观看 | 久久久久久久av | 精品视频123区在线观看 | 精品国产乱码久久久久久1区2匹 | 91精品免费在线 | 国产精品女 | 欧美极品裸体 | 麻豆视频一区二区 | www久久99| 人人干人人搞 | 免费在线国产 | 日日射天天射 | 欧美日韩后 | 国产精品国产三级国产aⅴ入口 | 97超碰在线久草超碰在线观看 | 国产精品毛片一区二区在线看 | 日韩美女高潮 | 国产日本高清 | 91亚色视频在线观看 | 黄色大片网 | 91麻豆精品国产午夜天堂 | 中文字幕一区二区在线播放 | 日日碰狠狠躁久久躁综合网 | 九九精品久久久 | 五月婷婷综合在线观看 | 天天摸夜夜操 | www最近高清中文国语在线观看 | av理论电影| 黄色小说免费观看 | 久久久精品午夜 | 日日夜夜天天人人 | 国产亚洲精品女人久久久久久 | 五月天综合色 | 日韩一区正在播放 | 免费日韩一区二区三区 | 91福利试看 | 97在线观视频免费观看 | 久久久久麻豆 | 欧美一区二区在线 | 黄色av免费在线 | 婷婷爱五月天 | 中文字幕资源网 国产 | 啪啪免费试看 | 中文字幕在线视频一区二区 | 欧美日韩91| 婷婷综合影院 | 天天爽网站 | 精品国产免费人成在线观看 | www.五月天婷婷.com | 超碰精品在线 | 日日爽视频 | 四虎国产精品成人免费影视 | 狠狠色狠狠色综合日日小说 | 中文字幕日韩国产 | 亚洲激精日韩激精欧美精品 | 综合国产在线观看 | 国产麻豆视频 | 97成人在线 | 久久99精品国产一区二区三区 | 国产精品高清在线 | 亚洲激精日韩激精欧美精品 | 91爱爱免费观看 | 日韩精品免费在线播放 | 婷婷丁香激情网 | 6080yy午夜一二三区久久 | 91香蕉视频色版 | 欧美精品国产综合久久 | 国产成人综合图片 | 久久久首页 | 欧美一区二区在线看 | 天天操夜夜想 | 日韩三级视频在线观看 | av资源在线看 | 国产一级不卡毛片 | 天天操天天爱天天爽 | 久久亚洲二区 | 国内99视频 | 人人操日日干 | 国产在线视频一区二区三区 | 手机色站 | 亚洲视频久久久久 | 国产一区二区在线视频观看 | 免费久久片 | 欧美激情视频三区 | 91视频在线自拍 | 久久一区二 | 国产特级毛片aaaaaa | 亚洲免费永久精品国产 | 久久精品一级片 | 亚洲综合小说 | 国内久久久久久 | 人人爱人人舔 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 91系列在线观看 | 在线直播av| 波多野结衣一区 | 亚洲精品午夜aaa久久久 | 欧洲精品一区二区 | 日韩久久精品一区二区 | 天天玩天天干 | 99热这里只有精品免费 | 国产 日韩 在线 亚洲 字幕 中文 | 深爱激情综合 | 久久久精品电影 | 99在线视频观看 | 一级黄色片毛片 | 中文字幕电影在线 | 天天草天天摸 | 在线之家免费在线观看电影 | 欧美日韩精 | 天天干,天天干 | 国产精品免费久久久 | 在线a亚洲视频播放在线观看 | 成人av在线亚洲 | 丁香激情综合国产 | 国产成人综 | 日韩有码第一页 | 亚洲国产免费 | 午夜视频在线观看欧美 | 国产视频精选在线 | 国产精品久久久久久久久久久久午夜 | 一区二区三区四区久久 | 欧美人交a欧美精品 | 经典三级一区 | 欧美精品在线一区二区 | 91精品蜜桃 | 中文国产成人精品久久一 | 狠狠色噜噜狠狠狠狠2021天天 | 精品欧美一区二区三区久久久 | 久久精选 | 日本中文字幕电影在线免费观看 | 亚洲va综合va国产va中文 | 成人97人人超碰人人99 | 日一日干一干 | 日日躁夜夜躁aaaaxxxx | 91chinese在线 | 日本性生活免费看 | 亚洲成a人片在线观看网站口工 | 国产黄影院色大全免费 | 亚洲,播放 | 91精品视频播放 | 天天综合成人网 | 国产亚洲精品女人久久久久久 | 激情综合亚洲精品 | 久久香蕉国产精品麻豆粉嫩av | 久久黄色a级片 | 精品一区二区三区电影 | 91久久精品一区二区二区 | 9999精品免费视频 |