嵌入式軟件定時器的兩種實現方式!

嵌入式大雜燴 2023-03-07 21:30

原文:https://blog.csdn.net/qq_35333978

簡介

在一般的嵌入式產品設計中,介于成本、功耗等,所選型的MCU基本都是資源受限的,而里面的定時器的數量更是有限。在我們軟件設計中往往有多種定時需求,例如脈沖輸出、按鍵檢測、LCD切屏延時等等 ,我們不可能讓每一個定時業務都去開一個硬件定時器,一來硬件資源可能不足,二來會使軟件過度依賴于硬件平臺,從而導致較差的可移植性。

而若我們有一個軟件定時器,所有定時業務都依賴于軟件定時器,不僅節省硬件資源,以后在移植的時候也只需要將軟件定時器和硬件相關的部分修改就行了,其他部分都不用動。

軟件定時器實現方式:

一、用結構體數組的方式實現軟件定時器

用結構體數組的方式實現起來較簡單,也容易理解,除此之外和之后的鏈表實現方式比起來沒有其他優點。但還是介紹一下實現方法:在結構體數組內定義一個start標志和定時時長duration,還有一個為計數值count,這3個變量為最基本的3個變量,其他的可以自己補充,比如運行模式、回調函數指針等。還有就是每一個結構體數組就是一個定時器,需要我們提前定義好這個結構體數組有多大。

定義好之后,在開啟定時器的時候我們將對應的數組內start標志置位,在硬件tick中斷服務函數里面我們去查所有結構體數組內的start標志是否置位,當查到當前start被置位時,將此數組內的duration和count做比較,如果相等就說明此定時器定時時間到了,如果不等就將count++,然后接著查其他數組的start標志,以此無限循環。

此種方式缺點非常明顯,那就是在硬件tick中斷服務函數內,我們得輪詢所有數組,如果我們軟件業務需求是20個定時任務,那我們就得在軟件定時器的實現里定義20個數組,空間浪費倒是其次的,關鍵是硬件tick輪詢的數組越多,執行到某個數組的時間就越長,若以后有50個、100個定時需求時,將會導致定時時間極不精準。

二、用鏈表實現軟件定時器

介于以上用結構體數組實現軟件定時器的種種缺點,我們提出改進方案。經過分析,在大多數定時業務中,往往只需要在某個時間段定時一次,也就是說定時器會開啟定時和結束定時,當然,用數組的實現的定時器也可以開啟定時和關閉定時,只需要用start標志去決定就行了,但是用數組實現的方式中,即使你關閉了定時器,也就是去掉了start標志,此定時器雖然不運行了,但是數組的空間不會減少,硬件 tick依然要輪詢所有數組。

所以我們需要用鏈表來實現軟件定時器,在硬件tick中輪詢所有節點,開啟一個定時器就加入一個節點,關閉定時器就刪除一個節點,可以保證在當前時刻只輪詢需要定時的節點,可以極大的保證定時準確性。

在加上可以讓用戶選擇定時時間到了直接在硬件tick內執行或者在硬件tick內置標志,然后在while循環內排隊執行,可以非常有效的解決關鍵業務定時不精準的問題,比如脈沖輸出這種需要定時準確的業務。

鏈表實現方式

H文件:

/**
?*?sfor_timer_list.h
?*?鏈表實現的軟件定時器庫
?*/

#ifndef?__SOFT_TIMER_LIST_H
#define?__SOFT_TIMER_LIST_H


/**
?*?硬件中斷tick
?*/

#define?TIMER_HARD_TICK??????????????????????100U????//ms,硬件tick取決于硬件定時中斷時間
#define?TIMER_200MS_TICK?????????????????????(200U/TIMER_HARD_TICK)?//TIMER_HARD_TICK?*?(2)?=?100mS
#define?TIMER_SEC_TICK???????????????????????(1000U/TIMER_HARD_TICK)?//TIMER_HARD_TICK?*?(20)?=?1S



/**
?*?定時模式選擇
?*/

typedef?enum
{
????ONCE_MODE,????????????????????????????/*?單次定時模式,即超時后自動關閉定時器?*/
????CONTINUE_MODE,????????????????????????/*?持續定時模式,只要開啟除非手動關閉否則永不停歇?*/
????DEFINE_NUM_MODE,??????????????????????/*?定義次數的模式,運行指定的次數后關閉定時器?*/
}TimerTimingModeType;


/**
?*?定時超時后運行的回調函數可以選擇在中斷直接運行或者掛起任務輪詢執行
?*?只要在定時需求準確的時候才建議選擇中斷模式執行,類似無磁傳感器脈沖測量
?*?像一些超時判斷類的應用以輪詢的方式進行執行
?*?中斷執行模式越多,其他定時器越不準,畢竟中斷允許占時間,查詢其他定時器時
?*?會有延時
?*/

typedef?enum
{
????RUN_IN_LOOP_MODE,??????????????????????/*?輪詢執行模式?*/
????RUN_IN_INTERRUPT_MODE,?????????????????/*?中斷實時執行模式?*/
}TimerRunModeType;


/**
?*?軟件定時器基本類型
?*/

typedef?struct?SoftTimer
{
????unsigned?long?counter;????????????????/*?計數??????????????*/
????unsigned?long?duration;???????????????/*?定時時長??????????*/
????unsigned?long?run_num;????????????????/*?自定義的定時次數??*/
????BOOL?start_flag;??????????????????????/*?啟動標志??????????*/
????BOOL?loop_flag;???????????????????????/*?輪詢標志??????????*/
????TimerRunModeType?run_mode;
????TimerTimingModeType?timing_mode;
????void?(*callback_function)(void);??????/*?回調函數??????????*/
????struct?SoftTimer?*next;
}SoftTimer;


/*
?*?初始化軟件定時器的硬件tick
?*/

extern?void?soft_timer_tick_init(void);

/*
?*?創建一個只運行一次的軟件定時器并立刻開始計時
?*?參數表:p:?定時器結構體指針,由用戶創建
?*????????mode:?選擇運行模式,可選定時器到了之后是直接在tick中斷內執行還是置起標志在while循環內輪詢執行
?*????????duration:?要計時的時長,單位為硬件中斷的tick
?*????????timeout_handler:?定時到了之后要執行的函數指針
?*?return:無
?*/

extern?void?creat_single_soft_timer(SoftTimer?*p,?TimerRunModeType?mode,?unsigned?long?duration,?void(*timeout_handler)(void));

/*
?*?創建永遠運行的軟件定時器并立刻開始計時
?*?參數表:p:?定時器結構體指針,由用戶創建
?*????????mode:?選擇運行模式,可選定時器到了之后是直接在tick中斷內執行還是置起標志在while循環內輪詢執行
?*????????duration:?要計時的時長,單位為硬件中斷的tick
?*????????timeout_handler:?定時到了之后要執行的函數指針
?*?return:無
?*/

extern?void?creat_continue_soft_timer(SoftTimer?*p,?TimerRunModeType?mode,?unsigned?long?duration,?void(*timeout_handler)(void));

/*
?*?創建指定次數運行的軟件定時器并立刻開始計時
?*?參數表:p:?定時器結構體指針,由用戶創建
?*????????mode:?選擇運行模式,可選定時器到了之后是直接在tick中斷內執行還是置起標志在while循環內輪詢執行
?*????????run_num:要定時的次數,比如1就是定時1次,5就是定時5次以后自動關閉定時器
?*????????duration:?要計時的時長,單位為硬件中斷的tick
?*????????timeout_handler:?定時到了之后要執行的函數指針
?*?return:無
?*/

extern?void?creat_limit_num_soft_timer(SoftTimer?*p,?TimerRunModeType?mode,unsigned?long?run_num,?unsigned?long?duration,?void(*timeout_handler)(void));


/*
?*?重啟指定的單次軟件定時器
?*?參數表:p:?定時器結構體指針,由用戶創建
?*????????mode:?選擇運行模式,可選定時器到了之后是直接在tick中斷內執行還是置起標志在while循環內輪詢執行
?*????????duration:?要計時的時長,單位為硬件中斷的tick
?*????????timeout_handler:?定時到了之后要執行的函數指針
?*?return:無
?*/

extern?void?restart_single_soft_timer(SoftTimer?*p,?TimerRunModeType?mode,?unsigned?long?duration,?void(*timeout_handler)(void));

/**
?*?刪除一個軟件定時器
?*/

extern?void?stop_timer(SoftTimer?*p);


/**
?*?系統main循環進程,用于執行輪詢模式的回調函數
?*/

extern?void?soft_timer_main_loop(void);


/**
?*?此函數為tick中斷服務函數,需要掛載在外部硬件定時器上
?*?因此軟件定時器的定時精度由此函數掛載的硬件定時時間決定,
?*?比如此函數掛載在定時50ms的外部定時器上,那么定時dutation
?*?為20時定時時間就是20*50ms=1S
?*/

extern?void?system_tick_IrqHandler(void);



#endif?/*?!1__SOFT_TIMER_LIST_H?*/

C文件:

/**
?*?sfor_timer_list.c
?*?鏈表實現的軟件定時器庫
?*/

#define?NULL?((void?*)0)
typedef?enum?{FALSE?=?0,?TRUE?=?!FALSE}?BOOL;

#include?"meter_include.h"?//包含用戶的硬件定時器初始化函數
#include?"soft_timer_list.h"

/**
?*?軟件定時器內部變量
?*/

static?SoftTimer?*head_point?=?NULL;

static?struct?SoftTimer?*creat_node(SoftTimer?*node);
static?char?delete_node(SoftTimer?*node);
static?BOOL?is_node_already_creat(SoftTimer?*node);


/**
?*?初始化軟件定時器的硬件tick
?*/

void?soft_timer_tick_init(void)
{
????R_IT_Create();?/*?由用戶初始化一個硬件定時器,當前tick?100ms?*/
????R_IT_Start();
}


/**
?*?系統main循環進程,用于執行輪詢模式的回調函數
?*/

void?soft_timer_main_loop(void)
{
????struct?SoftTimer?*p1?=?head_point;

????while?(p1?!=?NULL)?//下一個節點如果不為空
????{
????????if(p1->loop_flag?==?TRUE)
????????{
????????????p1->loop_flag=?FALSE;
????????????p1->callback_function();
????????????if(p1->start_flag?!=?TRUE)
????????????????delete_node(p1);???/*?如果定時器被刪除就刪除節點?*/
????????}
????????/*??尋找下一個有意義的節點??*/
????????p1?=?p1->next;
????}
}


/*
?*?創建一個只運行一次的軟件定時器并立刻開始計時
?*?參數表:p:?定時器結構體指針,由用戶創建
?*????????mode:?選擇運行模式,可選定時器到了之后是直接在tick中斷內執行還是置起標志在while循環內輪詢執行
?*????????duration:?要計時的時長,單位為硬件中斷的tick
?*????????timeout_handler:?定時到了之后要執行的函數指針
?*?return:無
?*/

void?creat_single_soft_timer(SoftTimer?*p,?TimerRunModeType?mode,?unsigned?long?duration,?void(*timeout_handler)(void))
{
????if?((p?==?NULL)||(timeout_handler?==?NULL)?||?duration?==?0)?return;

????p->start_flag?=?TRUE;
????p->counter?=?0;
????p->loop_flag?=?FALSE;
????p->duration?=?duration;
????if(mode?==?RUN_IN_LOOP_MODE)
????????p->run_mode?=?RUN_IN_LOOP_MODE;
????else
????????p->run_mode?=?RUN_IN_INTERRUPT_MODE;
????p->callback_function?=?timeout_handler;
????p->timing_mode?=?ONCE_MODE;
????p->run_num?=?0;?/*?只有在自定義運行次數的情況下此值才有效?*/
????head_point?=?creat_node(p);
}


/*
?*?創建永遠運行的軟件定時器并立刻開始計時
?*?參數表:p:?定時器結構體指針,由用戶創建
?*????????mode:?選擇運行模式,可選定時器到了之后是直接在tick中斷內執行(除非實在必要)還是置起標志在while循環內輪詢執行
?*????????duration:?要計時的時長,單位為硬件中斷的tick
?*????????timeout_handler:?定時到了之后要執行的函數指針
?*?return:無
?*/

void?creat_continue_soft_timer(SoftTimer?*p,?TimerRunModeType?mode,?unsigned?long?duration,?void(*timeout_handler)(void))
{
????if?((p?==?NULL)||(timeout_handler?==?NULL)?||?duration?==?0)?return;

????p->start_flag?=?TRUE;
????p->counter?=?0;
????p->loop_flag?=?FALSE;
????p->duration?=?duration;
????if(mode?==?RUN_IN_LOOP_MODE)
????????p->run_mode?=?RUN_IN_LOOP_MODE;
????else
????????p->run_mode?=?RUN_IN_INTERRUPT_MODE;
????p->callback_function?=?timeout_handler;
????p->timing_mode?=?CONTINUE_MODE;
????p->run_num?=?0;???????/*?只有在自定義運行次數的情況下此值才有效?*/
????head_point?=?creat_node(p);
}



/*
?*?創建指定次數運行的軟件定時器并立刻開始計時
?*?參數表:p:?定時器結構體指針,由用戶創建
?*????????mode:?選擇運行模式,可選定時器到了之后是直接在tick中斷內執行還是置起標志在while循環內輪詢執行
?*????????run_num:要定時的次數,比如1就是定時1次,5就是定時5次以后自動關閉定時器
?*????????duration:?要計時的時長,單位為硬件中斷的tick
?*????????timeout_handler:?定時到了之后要執行的函數指針
?*?return:無
?*/

void?creat_limit_num_soft_timer(SoftTimer?*p,?TimerRunModeType?mode,unsigned?long?run_num,?unsigned?long?duration,?void(*timeout_handler)(void))
{
????if?((p?==?NULL)||(timeout_handler?==?NULL)?||?duration?==?0)?return;
????p->start_flag?=?TRUE;
????p->counter?=?0;
????p->loop_flag?=?FALSE;
????p->duration?=?duration;
????if(mode?==?RUN_IN_LOOP_MODE)
????????p->run_mode?=?RUN_IN_LOOP_MODE;
????else
????????p->run_mode?=?RUN_IN_INTERRUPT_MODE;
????p->callback_function?=?timeout_handler;
????p->timing_mode?=?DEFINE_NUM_MODE;
????p->run_num?=?run_num;???????/*?只有在自定義運行次數的情況下此值才有效?*/
????head_point?=?creat_node(p);
}


/*
?*?重啟指定的單次軟件定時器
?*?參數表:p:?定時器結構體指針,由用戶創建
?*????????mode:?選擇運行模式,可選定時器到了之后是直接在tick中斷內執行還是置起標志在while循環內輪詢執行
?*????????duration:?要計時的時長,單位為硬件中斷的tick
?*????????timeout_handler:?定時到了之后要執行的函數指針
?*?return:無
?*/

void?restart_single_soft_timer(SoftTimer?*p,?TimerRunModeType?mode,?unsigned?long?duration,?void(*timeout_handler)(void))
{
????if?((p?==?NULL)||(timeout_handler?==?NULL)?||?duration?==?0)?return;

????p->start_flag?=?TRUE;
????p->counter?=?0;
????p->loop_flag?=?FALSE;
????p->duration?=?duration;
????if(mode?==?RUN_IN_LOOP_MODE)
????????p->run_mode?=?RUN_IN_LOOP_MODE;
????else
????????p->run_mode?=?RUN_IN_INTERRUPT_MODE;
????p->callback_function?=?timeout_handler;
????p->timing_mode?=?ONCE_MODE;
????p->run_num?=?0;?/*?只有在自定義運行次數的情況下此值才有效?*/
????if?(is_node_already_creat(p)?!=?TRUE)?/*?若之前的節點已被刪除就重新創建?*/
????????head_point?=?creat_node(p);
}


/**
?*?封裝后給用戶使用
?*/

void?stop_timer(SoftTimer?*p)
{
????if?(p?!=?NULL)?{
????????p->counter?=?0;
????????p->start_flag?=?FALSE;
????????delete_node(p);
????}
}


static?struct?SoftTimer?*creat_node(SoftTimer?*node)
{??
????struct?SoftTimer?*p1;???//p1保存當前需要檢查的節點的地址
????if(node?==?NULL)
????????return?head_point;

????if(is_node_already_creat(node)!=FALSE)?{
????????delete_node(node);??/*?當節點已經存在的時候在這里選擇退出還是刪除后重新創建,目前重新創建?*/
????}
????//當頭節點為空時,將傳入的節點作為頭節點,返回頭節點??
????if?(head_point?==?NULL)?????????{????
????????head_point?=?node;?
????????node->next?=?NULL;
????????return?head_point;
????}
????p1?=?head_point;??
????while(p1->next?!=?NULL)??
????{??
????????p1?=?p1->next;???????//后移一個節點??
????}??
?
????if(p1->next?==?NULL)??//將該節點插入鏈表的末尾
????{??
????????p1->next?=?node;
????????node->next?=?NULL;
????}??
????else
????{
????????
????}
????return?head_point;??
}


static?char?delete_node(SoftTimer?*node)
{??
????struct?SoftTimer?*p1;???//p1保存當前需要檢查的節點的地址??
????struct?SoftTimer?*temp;
????if(node?==?NULL)
???????return?1;

????p1?=?head_point;
????if(node?==?head_point)?{
????????head_point?=?head_point->next;????/*?如果要刪除頭指針,就將頭指針后移??*/
????}?else?{
????????while?(p1?!=?NULL)?/*頭節點如果不為空?*/
????????{
????????????temp?=?p1;?????/*?記錄當前節點?*/
????????????p1?=?p1->next;?/*?檢索的是下一個節點??*/
????????????if?(p1?==?NULL)?{
????????????????return?1;
????????????}
????????????if?(p1?==?node)?{
????????????????temp->next?=?p1->next;?/*?刪除此節點?*/
????????????????return?0;
????????????}
????????}
????}
????return?0;
}


static?BOOL?is_node_already_creat(SoftTimer?*node)
{??
????struct?SoftTimer?*p1;???//p1保存當前需要檢查的節點的地址??
????if(node?==?NULL)
???????return?FALSE;

????p1?=?head_point;??
????while(p1?!=?NULL)??
????{??
????????if(p1?==?node)
????????????return?TRUE;
????????p1?=?p1->next;???????//后移一個節點??
????}
????return?FALSE;
}


/**
?*?此函數為tick中斷服務函數,需要掛載在外部硬件定時器上
?*?因此軟件定時器的定時精度由此函數掛載的硬件定時時間決定,
?*?比如此函數掛載在定時50ms的外部定時器上,那么定時dutation
?*?為20時定時時間就是20*50ms=1S
?*/

void?system_tick_IrqHandler(void)
{
????struct?SoftTimer?*p1?=?head_point;
????close_global_ir();??//關閉中斷,根據硬件平臺修改
????while?(p1?!=?NULL)?//下一個節點如果不為空
????{
????????if(p1->start_flag?!=?FALSE)????/*?判斷當前定時器是否被開啟??*/
????????{
????????????if(++p1->counter?>=?p1->duration)??/*?判斷當前計時有沒有到達?*/
????????????{
????????????????switch?(p1->timing_mode)
????????????????{
????????????????case?ONCE_MODE:
????????????????????p1->start_flag?=?FALSE;
????????????????????break;
????????????????case?CONTINUE_MODE:
????????????????????break;
????????????????case?DEFINE_NUM_MODE:
????????????????????if?(p1->run_num?>?0)
????????????????????{
????????????????????????if?(--p1->run_num?==?0)
????????????????????????{
????????????????????????????p1->start_flag?=?FALSE;
????????????????????????}
????????????????????}
????????????????default:
????????????????????break;
????????????????}
????????????????if(p1->run_mode?==?RUN_IN_INTERRUPT_MODE)
????????????????{
????????????????????p1->callback_function();???/*?中斷內直接運行回調函數,用于實時性比較高的程序?*/
????????????????????if(p1->start_flag?!=?TRUE)
????????????????????????delete_node(p1);
????????????????}
????????????????else
????????????????????p1->loop_flag?=?TRUE;
????????????????p1->counter?=?0;
????????????}
????????}
????????/*??尋找下一個有意義的節點??*/
????????p1?=?p1->next;
????}
????open_global_ir();??//打開中斷,根據硬件平臺修改
}

結構體實現方式

最后在附上用結構體數組實現的軟件定時器以作參考。

H文件:

/**
?*?sfor_timer_array.h
?*?數組實現的軟件定時器庫
?*?一個軟件定時器解決整個項目中所有的定時需求,回調函數可根據應用
?*?自動切換中斷實時操作或者不實時的輪詢操作,可以有效解決硬件資源
?*?不足或者軟件定時器定時不準的問題,定時誤差就幾個C語言語句,倘若
?*?配置最大10個軟件定時器,誤差就是最多10個for循環的時間
?*/

#ifndef?__SOFT_TIMER_ARRAY_H
#define?__SOFT_TIMER_ARRAY_H


/**
?*?定義最大的可用的軟件定時器數量
?*?理論上可以無限大,但是數量越大定時誤差越大,所以用幾個開幾個
?*?誤差在于輪詢檢測所有定時器,定時器越多輪詢到自己的定時器就越慢,
?*?此外,數量增多亦會帶來空間增大
?*/

#define?MAX_TIMER_NUM???????????????????????10


/**
?*?定時模式選擇
?*/

typedef?enum
{
????ONCE_MODE,????????????????????????????/*?單次定時模式,即超時后自動關閉定時器?*/
????CONTINUE_MODE,????????????????????????/*?持續定時模式,只要開啟除非手動關閉否則永不停歇?*/
????DEFINE_NUM_MODE,??????????????????????/*?定義次數的模式,運行指定的次數后關閉定時器?*/
}TimerTimingModeType;



/**
?*?定時超時后運行的回調函數可以選擇在中斷直接運行或者掛起任務輪詢執行
?*?只要在定時需求準確的時候才建議選擇中斷模式執行,類似無磁傳感器脈沖測量
?*?像一些超時判斷類的應用以輪詢的方式進行執行
?*?中斷執行模式越多,其他定時器越不準,畢竟中斷允許占時間,查詢其他定時器時
?*?會有延時
?*/

typedef?enum
{
????RUN_IN_LOOP_MODE,??????????????????????/*?輪詢執行模式?*/
????RUN_IN_INTERRUPT_MODE,?????????????????/*?中斷實時執行模式?*/
}TimerRunModeType;



/**
?*?軟件定時器基本類型
?*/

typedef?struct?
{
????unsigned?long?counter;????????????????/*?計數???????????*/
????unsigned?long?duration;???????????????/*?定時時長???????*/
????unsigned?long?run_num;????????????????/*?自定義的定時次數??*/
????unsigned?char?start_flag;?????????????/*?啟動標志???????*/
????unsigned?char?loop_flag;??????????????/*?輪詢標志???????*/
????TimerRunModeType?run_mode;
????TimerTimingModeType?timing_mode;
????void?(*callback_function)(void);??????/*?回調函數?*/
}SoftTimer;



/**
?*?刪除一個軟件定時器
?*/

extern?void?stop_timer(void?(*callback_function)(void));



/*
?*?創建一個軟件定時器并立刻開始計時
?*?return:沒有空閑定時器時返回1,創建成功時返回0
?*/

extern?char?soft_timer_start(TimerTimingModeType?timing_mode,?
???????????????????????????????????TimerRunModeType?run_mode,
???????????????????????????????????????unsigned?long?run_num,?
??????????????????????????????????????unsigned?long?duration,
??????????????????????????????void?(*callback_function)(void));



/**
?*?系統main循環進程,用于執行輪詢模式的回調函數
?*/

extern?void?soft_timer_main_loop(void);



/**
?*?此函數為tick中斷服務函數,需要掛載在外部硬件定時器上
?*?因此軟件定時器的定時精度由此函數掛載的硬件定時時間決定,
?*?比如此函數掛載在定時50ms的外部定時器上,那么定時dutation
?*?為20時定時時間就是20*50ms=1S
?*/

extern?void?system_tick_IrqHandler(void);



#endif?/*?!1__SOFT_TIMER_LIB_H?*/

C文件:

/**
?*?sfor_timer_array.c
?*?數組實現的軟件定時器庫
?*?一個軟件定時器解決整個項目中所有的定時需求,回調函數可根據應用
?*?自動切換中斷實時操作或者不實時的輪詢操作,可以解決硬件資源
?*?不足或者軟件定時器定時不準的問題
?*/

#include?"soft_timer_array.h"


/**
?*?軟件定時器內部變量
?*/

static?SoftTimer?soft_timer[MAX_TIMER_NUM];


/*
?*?創建一個軟件定時器并立刻開始計時
?*?return:沒有空閑定時器時返回1,創建成功時返回0
?*/

char?soft_timer_start(TimerTimingModeType?timing_mode,?TimerRunModeType?run_mode,?unsigned?long?run_num,?unsigned?long?duration,
??????????????????????void?(*callback_function)(void))
{
????unsigned?char?i?=?0;

????if(!callback_function)?return?1;
????stop_timer(callback_function);?????/*?先判斷有沒有一樣的定時器,有的話先刪除??*/
????for(i?=0;?i????{
????????if(soft_timer[i].start_flag?==?0)????/*?查詢空閑的定時器?*/
????????{
????????????soft_timer[i].start_flag?=?1;
????????????soft_timer[i].counter?=?0;
????????????soft_timer[i].loop_flag?=?0;
????????????soft_timer[i].duration?=?duration;
????????????soft_timer[i].run_mode?=?run_mode;
????????????soft_timer[i].callback_function?=?callback_function;
????????????if?((soft_timer[i].timing_mode?=?timing_mode)?==?DEFINE_NUM_MODE)
????????????????soft_timer[i].run_num?=?run_num;?????????????????????/*?只有在自定義運行次數的情況下此值才有效?*/?
????????????break;
????????}
????????if?(i?==?MAX_TIMER_NUM?)????/*?沒有空閑定時器?*/
????????????return?1;
????}
????return?0;
}



/**
?*?刪除一個軟件定時器
?*/

void?stop_timer(void?(*callback_function)(void))
{
????unsigned?char?i;
????for(i?=?0;?i?????{
????????if(soft_timer[i].callback_function?==?callback_function)
????????{
????????????soft_timer[i].start_flag?=?0;
????????????soft_timer[i].loop_flag?=?0;
????????}
????}
}



/**
?*?系統main循環進程,用于執行輪詢模式的回調函數
?*/

void?soft_timer_main_loop(void)
{
????unsigned?char?i;
????for(i?=?0;?i?/*??輪詢執行回調函數??*/
????{
????????if(soft_timer[i].loop_flag?==?1)
????????{
????????????soft_timer[i].loop_flag=?0;
????????????soft_timer[i].callback_function();
????????????//?return;??????????????????????????????/*??運行一次任務后就退出去等跑一輪后運行下個程序,防止任務堆積在一起運行??*/
????????}
????}
}



/**
?*?此函數為tick中斷服務函數,需要掛載在外部硬件定時器上
?*?因此軟件定時器的定時精度由此函數掛載的硬件定時時間決定,
?*?比如此函數掛載在定時50ms的外部定時器上,那么定時dutation
?*?為20時定時時間就是20*50ms=1S
?*/

void?system_tick_IrqHandler(void)
{
????unsigned?char?i?=?0;
????
????for(i?=0?;i?????{
????????if(soft_timer[i].start_flag?!=0?)???/*?判斷當前定時器是否被開啟??*/
????????{
????????????if(++soft_timer[i].counter?>=?soft_timer[i].duration)??/*?判斷當前計時有沒有到達?*/
????????????{
????????????????switch?(soft_timer[i].timing_mode)
????????????????{
????????????????case?ONCE_MODE:
????????????????????soft_timer[i].start_flag?=?0;
????????????????break;
????????????????case?CONTINUE_MODE:
????????????????????break;
????????????????case?DEFINE_NUM_MODE:
????????????????????if?(soft_timer[i].run_num?>?0)
????????????????????{
????????????????????????if?(--soft_timer[i].run_num?==?0)
????????????????????????{
????????????????????????????soft_timer[i].start_flag?=?0;
????????????????????????}
????????????????????}
????????????????default:
????????????????????break;
????????????????}
????????????????if(soft_timer[i].run_mode?==?RUN_IN_INTERRUPT_MODE)
????????????????????soft_timer[i].callback_function();???/*?中斷內直接運行回調函數,用于實時性比較高的程序?*/
????????????????else
????????????????????soft_timer[i].loop_flag?=?1;
????????????????soft_timer[i].counter?=?0;
????????????}
????????????//?else
????????????//?{
????????????//?????soft_timer[i].counter++;
????????????//?}
????????????
????????}
????}
}

本文來源網絡,免費傳達知識,版權歸原作者所有。如涉及作品版權問題,請聯系我進行刪除。

注意

由于微信公眾號近期改變了推送規則,為了防止找不到,可以星標置頂,這樣每次推送的文章才會出現在您的訂閱列表里。

猜你喜歡:

易懂 | 手把手教你編寫你的第一個上位機

適用于嵌入式的差分升級通用庫!

分享一種靈活性很高的協議格式(附代碼例子)

分享幾個實用的代碼片段(第二彈)

分享一種你可能不知道的bug定位方法

分享一種修改配置文件的方法

《嵌入式大雜燴周記第 13 期:lz4》

《嵌入式并行多線程處理器,了解一下!》


在公眾號聊天界面回復1024,可獲取嵌入式資源;回復?m?,可查看文章匯總

嵌入式大雜燴 專注于嵌入式技術,包括但不限于C/C++、嵌入式、物聯網、Linux等編程學習筆記,同時,內包含大量的學習資源。歡迎關注,一同交流學習,共同進步!
評論
  • 做藍牙音箱的工程師大概都碰過這個局面。產品要連手機放歌,要本地播開機提示音和按鍵音,還要接 App 做配網和狀態上報。三件事拆開,早先的常規做法是音頻藍牙一顆料、數傳藍牙一顆料、本地播放再掛一顆小 MCU 加一片 Flash。板子越畫越大,BOM 越算越貴,待機電流和固件工作量也跟著漲。WT2605C 出來以后,這套需求可以集成到一顆芯片,就是 WT2605C-32N,該芯片采用QFN32 封裝,4×4 毫米,把音頻藍牙、BLE 數傳和 MP3 本地播放三樣全包了。對藍牙音箱來說,最實在的好處就
    唯創知音語音芯片 2026-08-06 15:14 338瀏覽
  • 一、方案簡介在Buildroot構建的嵌入式Linux系統中部署Flutter應用,主流有兩套成熟的開源方案,分別適配不同的顯示場景與開發需求:方案一:flutter-elinux(Sony開源方案)由索尼官方維護的嵌入式Linux Flutter工具鏈,既支持DRM/GBM直接渲染,也兼容Wayland、X11等多種顯示后端,場景適配性更廣。方案二:flutter-pi(輕量級嵌入器)一款輕量級Flutter引擎宿主程序,僅基于底層DRM/GBM接口實現渲染,無需依賴桌面環境,資源占用更低,更
    飛凌嵌入式 2026-08-07 09:34 81瀏覽
  •        很多人只見過封裝在SMD外殼里的小尺寸晶振,卻不知道一顆2016、1612甚至1210封裝的微型石英晶振,從一塊巴掌大的石英原礦,到最終能穩定起振的成品,要經過十幾道精密工序。它內部的石英晶片厚度最薄不到20微米,比普通A4紙的1/5還薄,整個生產過程里哪怕0.1微米的誤差,都會直接廢掉整批產品,這也是小尺寸晶振過去長期依賴進口,國內廠商花了十幾年才啃下量產硬骨頭的核心原因。1. 原石定向切割:0.01度的角度誤差都不能有小尺寸晶振的第一步,
    TKD泰晶科技 2026-08-07 08:43 494瀏覽
  • 摘要東莞市恒創連接器有限公司(HCHGCONN)是位于廣東東莞的連接器源頭制造工廠,專注于連接器國產替代、小間距大電流連接器、線對板連接器、線對線連接器、板對板連接器、電源連接器及定制連接器開發。公司面向工業自動化、新能源儲能、BMS、汽車電子、AI服務器、GPU供電、通信設備、醫療設備和智能家居等場景,提供從產品選型、替代評估、樣品驗證到批量交付的一站式連接方案。恒創可支持 Molex、TE Connectivity、JST、Hirose、Samtec 等國際品牌部分系列的國產替代評估。常見替
    HC003 2026-08-07 10:14 74瀏覽
  • 樓宇自控里的“巴別塔”一棟智慧樓宇、一個產業園區里,暖通空調運行著廠商私有協議,照明系統遵循專屬通信標準,變配電、門禁安防各成體系——設備間數據壁壘森嚴,上位平臺對接全靠定制化 “翻譯” 開發,不僅成本高企,交付周期也難以管控。這就是樓宇自控行業多年的痛點:協議林立、封閉林立。而破局的鑰匙,早在30多年前就已經寫好了——BACnet。作為ASHRAE制定的樓宇自控國際標準協議,BACnet是如今全球樓宇自控系統(BAS)互聯互通的“通用語言”。新風機、冷源群控、變配電、照明、門禁,凡是需要被樓宇
    飛凌嵌入式 2026-08-10 09:26 116瀏覽
  • 產品使用18V供電,配套4串鋰離子電池,需要設計一個充電器。因為輸入18V,電池最高 16.8V,壓差僅 1.2V。因為壓差太小。使用開關型的充電控制芯片不穩定。嘗試自行設計一個。整體采用分立三極管 + TL431架構,分4個功能單元:使能控制回路、限流環路、TL431 精密恒壓反饋環路、PNP 功率管主功率輸出回路;實現完整鋰電池充電邏輯。使能控制回路按鍵按下:5V 電壓經 R12 (2kΩ) 送入 NPN 管 Q3 基極,Q3 飽和導通,對地拉低 R1、R2 組成的分壓控制節點電位;該節點直
    southcreek 2026-08-07 13:45 429瀏覽
  • 導語在現代高速數字電路設計中,信號的完整性已不僅是理想波形推演,而是一場與物理非理想特性正面博弈的工程實踐。濾波器芯片作為凈化傳輸鏈路的關鍵屏障,其核心挑戰在于:能否有效識別并濾除那些隱匿在電平跳變過程中的亞納秒級瞬態脈沖干擾,這類干擾持續極短,卻足以在高速鏈路中引發誤觸發。然而,傳統函數發生器受限于采樣率與邊沿速率,根本無法忠實復現如此狹窄且陡峭的異常波形。針對此困境,德思特TS-AWG7000系列任意波形發生器以17 GS/s采樣率與50 ps原生邊沿速度,為瞬態脈沖提供精細刻畫,配合SPG
    德思特測試測量 2026-08-05 14:06 5瀏覽
  • 做電池供電攝像頭、可視門鈴、戶外安防的同學應該都踩過這個坑:攝像頭要拍,ISP、sensor、無線模塊全得開著,整機電流動輒幾百 mA。一節 18650 撐不了幾天,用戶投訴“怎么又沒電了”。有人會說:加個 PIR 人體紅外不就行了?問題是 PIR 怕熱、怕寵物、怕隔著亞克力/玻璃殼,而且只能感知“有溫差的人體移動”,靈敏度飄忽。真正省電的思路應該是:讓攝像頭平時徹底睡死,只有“前面有人/有動靜”時才被一鍵喚醒——而負責這個“看門”角色的,最合適的是一顆低功耗雷達。一、為什么是雷達,而不是 PI
    唯創知音語音芯片 2026-08-07 14:44 95瀏覽
  • 讓微弱脈沖信號更清晰——鎖相放大器集成Boxcar平均器在脈沖激光、泵浦-探測、時間分辨光譜、飛行時間質譜等實驗中,真正需要測量的信號往往只出現在一個很短的時間窗口內,卻被淹沒在遠大于它的噪聲和背景之中。 針對這類穩定重復的微弱脈沖與瞬態信號,賽恩科儀為OE2052雙通道數字鎖相放大器帶來全新的Boxcar Averager功能升級:在鎖相檢測之外,進一步提供從周期波形觀察、門控測量到多周期平均的完整數字Boxcar測量鏈路。 Boxcar平均器,如何從噪聲中“截取”目標信號?Boxcar平均器
    SSI_賽恩科儀 2026-08-07 15:49 4202瀏覽
  • 在物聯網從“萬物互聯”邁向“萬物智聯”的進程中,LTE Cat.1憑借其在速率、成本與網絡覆蓋之間的完美平衡,正成為中低速物聯網市場的絕對主力。隨著2G/3G網絡的逐步退網以及新國標對終端設備智能化、定位功能的強制要求,Cat.1模組迎來了爆發式的增長窗口。在這一關鍵節點,基于華為海思Hi2131芯片設計的LTE Cat.1模組,憑借其在能效、射頻、架構及物理規格上的底層創新,成功打破了“高性能必高功耗”的傳統魔咒,為行業提供了極具競爭力的連接最優解。核心技術優勢:重塑Cat.1能效與連接標桿海
    用戶1778981989717 2026-08-05 21:04 197瀏覽
  •                                                                        
    廣州鐵金剛 2026-08-06 17:44 203317瀏覽
  • 文:杜杰編輯:侯煜當地時間7月28日,美國特朗普政府落地最新科技封鎖政策,美國聯邦通信委員會(FCC)正式更新《受管制清單》,新增兩大類設備——境外生產的先進機器人設備、境外生產的聯網電力逆變器。FCC在官方情況說明書中明確,該類境外制造產品,“會對美國國家安全或美國民眾的人身安全構成無法承受的風險”。本次新規設置明確豁免機制:經美國國防部(DoW)、電力逆變器品類經美國國土安全部(DHS)審核并授予“有條件批準”,認定對應設備品類不存在重大安全風險,即可獲得準入豁免。同時政策嚴格執行新老劃斷原
    華爾街科技眼 2026-08-03 21:28 358瀏覽
我要評論
0
點擊右上角,分享到朋友圈 我知道啦
請使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: 绿色逍遥社区| 短道速滑王蒙| 卖百科全书的女人在线观看| soe-646| 倾城电影| 卖百科全书的人未删减| 结婚吧电视剧全集| 红海行动手机 在线观看| 女版《壮志凌云》免费| 彩翼儿童美术| 庆余年2电视剧免费观看第一季| 再来一次第20集| 军团大战| 鱼夫的妻子 意大利| 觉醒年代免费观看| 渔夫荒野史1987台湾| 喜爱夜蒲2 完整版| xl司令全集免费观看高清 | 美国一级父女播种视频中文版| 1995年意大利版《人猿泰山》在线看在| 别样幸福全集| 僧侣之夜无删减版下载| 大胸按摩电影| 电影《之后》| 维克托 科瓦茨| 电影斯巴达克斯第四季免费观看| 澳门风云2 粤语| 战狼6欧式少女全部剧情介绍 | 烟袋斜街10号| 大秦帝国第三部崛起| 大兵的寝室线观看兵的寝室 | 虞城县| 糖醋蒜的制作方法和配方10斤| 法国空乘4观看| 电影《夺冠》| 鱼夫的妻子 意大利| 撒贝宁原名叫啥| 废柴兄弟| 隔山之眼3免费完整版| 赛尔号大电影6圣者无敌| 龙帅归来全集免费| 紧急行动40集免费观看| 为我而眠的妹妹| 《笼中鸟》完整版| 汨罗市| 猩疯血雨未删减| 电影花与蛇| 《外卖奇遇》完整版外| 诡劫 电影| 古典写真| 需要爸爸播种子电影免费看| 一路西行电影版在线播放| 灵与肉1992| 美丽人妻出差按摩NBD| 大戏法电视剧| 杨贵妃秘史剧情| 慈禧秘史邱淑贞| 牙医姊妹电影完整版| 韩剧风格| 终极斗罗第二季| 北越暴行2高清版| 皮囊之下电影完整高清在线播放| 法国空姐2023(多塞尔航空)| rio ed2k| 束博游戏| 最后的99天在线观看| 我的公公免费观看电视剧| 《四少妇按摩完整版》| 舞蹈家苏科老师简介| 索多玛的120天下载| 麦乐迪超人系列nice| 《财阀家的小儿子》电视剧| 欢迎来到实力至上主义教室 第四季 | 刘墉追案| 妈妈的学生中字ID木鱼天 | 时光与你别来无恙电视剧免费观看| 妻子3免费完整版HD中字| 琉璃电视剧在线观看免费全集| 麦乐迪完整版免费观看| 新金银屏1—5美国普通话| 网红乞丐哥被抓| 特殊的游泳| 法证先锋4粤语版免费观看完整版| 我家的一件珍品| 巜性刑房3捆绑凌虐免费在线观看| 妖精的尾巴高清版| 蘑菇影视妈妈的职业 经典| 《修理工的艳遇电影| 上海电视台节目表| 寂寞女医生外3| 封神英雄榜1部| 麻美ゆま| 欲望和智慧电影| 脱口秀大会第四季免费观看完整版| 盗墓笔记 谜海归巢| 爱在日落之前泰语版| 插曲的痛30集全集免费播放电影爱情| 欢乐喜剧人 第三季| 八仙饭店电影| 丫鬟逆袭短剧全集| 评剧小女婿| 星语心愿伴奏| 裙子里面有怪兽| 爱我几何《莫妮卡》| 罪域电视剧全集播放| 马东锡犯罪都市| 漂亮的小瘦子3| 美国A片巜禁忌3| 法国空姐11| 昭和女子物语1-4集| 白峰美羽无码电影| 花的勇气ppt| 《揉胸按摩》免费观看| 3肉脯团国语完整版| 需要爸爸播种子在线免费观看| 《黑色电话2》| b13区高清| 双女任务免费完整版| 麻将电影| 雷霆扫毒土豆| 阿拉伯电影绝色在线观看免费 | 曹查理《怒火狂花》电影版| 喜爱夜蒲 cat| 假面 韩国| 荷尔蒙6在线观看免费版第三季| 在宇田川町等我喔| 电吉他solo教学| 从后面来从前面来| 喜夜蒲团2| 爱情公寓3 19| 本能2百度影音| 木下檀檩子视频博放| 照亮你电视剧免费观看星辰影视| 地狱少女电影| MSD-005 欧妮 维修工的心跳艳遇(下) 疼痛凌辱高潮快感-在线观看-338TV | 半路兄弟电视剧30集免费完整版| 男按摩师视频在线观看| 非你莫属2010| 林心如夏雨荷| 叶卡捷琳娜电视剧第二季| 直到天空迎来太阳泰剧免费观看| 河套宽频| 8号当铺电视剧免费观看| 天赐之女| 陈梦王曼昱神仙打架| 名侦探柯南600| 善良的丈母娘中字头歌词韩国电影| 民国往事下载| 高清《大军阀》| 狼人大战| 电视剧《回响》免费观看| 风间由美全集| 电视剧橘子红了| 死神来了5高清完整在线观看| 天下第一楼全集免费播放在线观看| 爱情公寓5| 江涛非你莫属| 妈妈儿想你| 傲雷雷神2| 李胜素京剧唱段| 迷你世界全皮肤破解版下载 | 海岸村恰恰恰电视剧免费观看| 布兰迪 罗伯斯| 冷月花魂| 对你不止是喜欢电视剧| j情从林| 祈祷爱情电视剧| 壮志凌云满天星法版免费| 烂滚夫斗烂滚妻国语| 不良义姐电影| 无颜之月1到5免费动漫| 隔壁邻居很美味电影| 风火雷电破手势图解| 挣扎吧亚当君第二季| 蛮好的人生在线观看免费完整版| 反恐电影《沙漠》| 萌学园7宇宙之谜免费观看完整版| 社长的漂亮夫人电影在线播放| 禁室培欲电影| 你们老公晚上怎样玩你| 《裸乳按摩》在线免费观看| 天津非你莫属| 大头儿子小头爸爸1| 铃木杏里《少年爱》免费听| 陆贞传奇爱奇艺| 人间正道是沧桑50集全免费观看| 时间静止器| 熊迹电影完整版在线观看| 三生三世枕书电视剧全集免费观看| 《朋友年轻的妈妈》韩国| 黄色仓库在线观看天堂| 他年她日电影| 郢王悲歌| 女儿要爸爸播种手机观看| 卿卿日常| 法国空乘理论5HD| 《维修工的艳遇》韩国| 欢乐喜剧人第三期完整版| 戏说台湾全集| 深夜濡湿| 男女一起愁愁愁电影全集免费播放| 致命弯道2在线观看| 怒晴湘西在线看| 军事不当行啄木鸟布兰迪| 茅坑里的僵尸完整版| 高清《大蛇王》在线观看| 我需要爸爸电影免费观看| 海棠经雨胭脂透电视剧免费观看| 创:战神| 陈枫动漫免费观看全集| 花子小姐vs驱魔师在线观看免费| 电视剧私藏浪漫| 唇亡齿寒电影| 《卖保险的女销售》免费看| 仙逆动漫73集| 美丽小蜜桃2免费观看完整版全集| 日本美女| 巨人族的新娘花嫁| 孙红雷一代枭雄电视剧| 电视剧美人心计| 老头给少妇精油按摩性生活电影 | 无尽动漫在线观看完整版| 战狼8欧式少女全部剧情| 猫之茗全集免费观看第二季| 电视剧《寻路》| 顶楼的大象| 未知| 桑田佳佑| 我喜欢你电视剧第24集免费观看 | 吉星拱照免费完整版粤语| 核污水排海个人防护指南| 边坝县| 最棒的爱人诏免费观看| 幽灵公主| 灵与肉电视剧| 《私人家教》在线观看| 火龙帝国1| 速度与激情11| 不穿内裤的女教师| 八头身美女在线观看| 坠入电影| 鬼灭之刃第五季无限城篇免费观看| 韩剧《激战三姊妹》在线观看 | 《康熙王朝》大结局| 僵尸伯伯国语版在线播放| 《二对一的商务模式2》完整版| 搬山道人| 国模小树| 潍坊科技学院女生| 维修工得艳遇韩国| 非洲版娃娃脸2| 叛逆者哪个台播出| 加勒比海盗女版1完整版免费| 越狱第五季在线观看| 花式桌球表演| 坐上火车去拉萨广场舞| 塔日酒店完整版在线观看| 沙加神话| 绳子魔术揭秘| 《俘虏之锁》第一集| 南海归墟| 蜡笔小新国语高清| 想要的一天| 邻家女人丈夫不在的日子| 锦衣之下全集免费高清| 凯旋在子夜电影完整版在线观看| 浪漫黛比| 铠甲勇士铠传| 家族的诞生电视剧| 海绵宝宝电影| 相奸游戏在线观看| 孙阳妈妈说儿子演得太坏了| 银河奥特曼免费观看全集| 军营女长官1984年意大利| 爸爸的种子伦理片在线观看| エロください资源| 今天坐在我的棍子上写作业| xl司令第二季全集免费观看动漫| 冰河世纪2高清国语版免费播放| 强奸女护士| 凌云壮志(欧美)满天星主演叫什么| 蓝宝石之谜 重制版| 胃癌的发生与生活习惯密切相关| 硫磺岛战役电影| 暴躁老妈高清全集免费看| 人类一思考上帝就发笑 | 今夜无眠电影在线观看完整版免费| 秋瓷炫《生死决断》完整版| 崔京浩父亲简谱| 网球王子电视剧版| 美国版荷尔蒙6观看| 郭台铭宣布退选| 两天一夜20110529| 电视剧战神| 日本jiZZ2| 徐若瑄演的魔鬼天使| 猎金游戏剧情介绍| 花琉璃轶闻电视剧免费播出| 酒店1-80集免费看全集 | 火凤凰女子特种兵| b13区高清| 睫毛膏1983在线观看完整版| 小道姑下山掀皇短剧免费观看全集| 年轻的阿姨5中字电影| 坎贝奇第二部曲品味人生在线观看| 有歌2024| 黑白潜行| 高清恩爱的盗贼大人未删减| 双女任务在线播放| 慈禧的生活秘史免费播放| 赤坂丽电影未删版在线| 美剧我要爸爸的种子| 尼罗河上的惨案豆瓣| 杨丽萍凤凰造型如涅槃重生| 八戒8电影在线播放免费观看 | 陷入我们的热恋电视剧免费观看| 向风而行免费观看全集| 水手服的饲养完整版在线播放 | 电视剧红妆| 扎兰屯市| 哇嘎国语高清在线观看视频| 诡探前传| 詹姆斯十大扣篮| 墨西哥电影《瓜达卢佩的玫瑰》| 辣警狂花1国语版免费观看完整版| 保姆119全集下载| 瓜达卢佩的玫瑰完整版| 山野女人香| 年轻的岳母在线播放| 我爱背单词| 无职转生第二季樱花动漫第三集| 杰西简全集在线播放免费观看| 韩剧四百年的梦| 世界上真的有孙悟空吗| 篠田优主演的电影完整版| 女员工的滋味2中文| 斗六市| 阴谋与婚礼| 电视剧桃花劫| 塔日酒店在线观看高清完整版| 奔跑吧玫瑰韩剧国语版免费观看 | 美国版武则天惊艳版| 电视剧丘比特的圈套| 只手遮天九千岁1到100集| 需要爸爸的种子完整版| 向涟苍士献上纯净| 最新的鬼片| 小李飞刀翻拍| 一生一世美人骨在线观看 | 天才碰麻瓜大结局| 妻子替夫还债| 电影灯草和尚高清免费普通话版 | 女警坠落| 紫川动漫第二季| 覆雨翻云 电视剧| 怀玉公主全集优酷| 斗罗大陆145集| 巜饥渴的人妻与维修师傅电影| 你们对象怎样抠你们的| 买房子的女销售3中字| 电视剧家门的荣光| 美国版《健美》| 桃花在线看免费高清电视剧 | 权力的游戏第一季免费观看完整 | 秘密爱在线观看| 四个愿望| 你妈妈也一样在线观看| 电视剧青青河边草| 私人航空1法国满天星免费播放| 女婿难当大结局| 私人航空电影高清完整版在线播放| id002最经典热门电影| 万历首辅张居正下载| 罚罪免费观看| 壹号皇庭3国语版| 同学妈妈| 我在他乡挺好的一共多少集| 猎罪图鉴2在线看高清| 十日谈电影完整版免费观看| 高清魔法坏女巫2未删减| 男女一起愁愁愁免费看| 电影韩国太太的告白| 永仁县| 《黑色眼泪》完整版| 福州 劫持人质| 三姐妹电影| 爸爸种的种子第二集| 模特一级片| 马斯克回应儿子想与自己断绝关系| 假面骑士铠武15| 伦理《法国护士长》2006在线播放 | 俄罗斯妈妈电影2024年上映吗| 希望爸爸来种种子伦理剧| 致命诱惑电影免费观看完整版| 老表发钱寒国语免费完整版| 魔弹战记龙剑道国语| 无名卫士电视剧| 《女超人麦乐迪》| 《女生规则:禁爱游戏》| 破坏之王电影免费观看完整版国语| 图书馆里的女友动漫1-6集全集免费观| 山东近32万考生成绩达一段线| 360天大佬爱上我第二季在线观看| 王者清风片尾曲| 计春华简介| 侯门深宅短剧全集| 本相爱在线观看| 太空堡垒第一部国语版| 蛇经常吐舌头是因为什么呢| 笨厨二美| 狼友电影影院| 湖南卫视我是歌手现场直播| 盗墓风云| 1982年禁忌3| 农场主的三个女儿| 年轻的母亲在钱中字| 正阳门下电视剧全集36| 女囚残酷私刑| 爸爸的种子2| 梁山伯与祝英台电视剧免费全集| 秘密列车在线全集免费观看| 警方通报重庆一女子持刀袭警| 美式忌保罗讳1-4是合法的吗| 功夫梦:融合之道未删减| 初恋这件小事完整版| 姐姐3电视剧在线观看| 动感之星第199集妖精| 天目危机| 红娘子大结局| 徐孺子年九岁 尝月下戏 | 房术入门40个动作| 爱你2025全集免费播放| 善恶无赦| 美景之屋6在线观看高清完整版| 耀眼的你啊电视剧免费观看| 赤峰派出所被打砸事件属实| 年轻的女保险销售2| 突围37集在线观看| 神奇的美发沙龙| 暗夜行者免费观看| 恶意编年史| 美乃雀 替夫还债的电影免费观看| 电视剧刺杀玫瑰| 媚者无疆电视剧| 后宫露营第一季未增减0.0.0.对应第2集| 男女做爰猛烈叫床高潮的书| 波多野结衣电影在线观看线观看| 挺进去岳就不挣扎了在线观看| 电影误杀在线观看完整版| 人猿泰山1995 1小时34分意大利,就有了| 寂寞护士的引诱在线观看| 杨光的夏天 电视剧| 铿铿锵锵锵免费观看在线观看| 幺玩命加载中免费观看| 朋友的的妈妈| 美国式禁忌3| 《牙医姐妹》1986版电影在线观看| 捉妖记大电影完整版| 写的比较细的开车故事| 张国荣为什么那么红| 意大利《女军医》免费| 太极2 百度影音| 第二次人生电视剧免费播放| 复仇第3季| 美国禁忌三部曲满天星免费| 姐姐的朋友3在完整有限中字第5| 斗破苍穹免费观看全集完整版| 冰封(重生之门)| 电影双人调情按摩术| 乡村小媳妇全集免费| 出差的已婚妇女BD中文字幕| 去有风的地方电视剧免费观看 | 单身女王| 伟哥的故事国语| k8s经典版播放| 探索兄弟| 整蛊专家3| 女职员的付出5中字在线| 西部神枪手| 少年派2免费观看完整版| 欢乐元帅1| 荣誉守则2012版在线播放| 年轻善良的子3| 麦乐迪在线完整版| 高清《秘密森林》电视剧| 名侦探柯南:通往天国的倒计时| 麦乐迪女超人(满星版)在线观看| 密室之不可告人下载| 韩国《维修工人的艳遇| 茅山道士之灵异笔记| 古惑仔5龙争虎斗国语字幕| 雅安第一网红琼姐身世| 理想之城连续剧40集免费播放 | 双探电视剧在线观看| 白月梵星电视剧在线观看星辰影院| 东方在线观看| 告诉我想要什么| 意大利满天星电影有哪些?八尺夫人免费| 心世界奇遇| 红唇2错种| 盛唐风流电影免费观看| 一个好妈妈如如2| 天地无伦完整版| 满天星电影韩国在线观看完整免费 | 坎贝奇无憾电影免费观看| 捡漏小能手:古玩街我称王全集免费| 刀客家族女人全集| 分娩按摩5| 输赢电视剧全集在线观看完整版| 《诱感》韩国电影| 四位少妇精油按摩| 电影殊死搏斗免费观看高清| 大秦帝国之纵横高清| 束缚游戏无码免费观看| 李连杰电影全集高清| 仓多真央JUY-970在线播放| 灵动鬼影实录2| 禁忌1980满天星| 长歌行超前点播资源| 废柴兄弟| 时间静止器全集免费观看第二集| 《overflower》动漫1-8集免费观看下载| 女子拒绝同事表白后遭辱骂| 守望相助| 唐朝禁宫风月| 小凤新婚下集在线播放最| 木嶋のりこ| 暴露5美国版| 勇敢的心1| 美国满天星《无法无天》2006| 被社长戏虐的妻子| 黑档案 东北第一黑帮覆灭记| 可以的话| 一起来看流星雨31| <<部长出差的日子>>| 地狱里的天堂在线观看完整版| 都市欺诈| 婚姻料理| 白蛇传说之天乩| 《诱人的岳 》北条麻妃电影| 韩国电影朋友在线观看完整版| 宜昌保卫战| 人民的名义 dvd| 《私人女性监狱》免费观看在线播放_HD/1080P/无删减_高清完整版电影 - 星辰影 | 每日妈妈粤语| 农民伯伯下乡三级片| 进口媳妇在线观看免费西瓜| 冬至电视剧黄景瑜孙千免费观看| 《四大美人之王昭君》免费看| 碟中谍1未删减版资源| 电影美乃雀主演在线观看| 初恋优酷| 勇者行动在线观看| 波多野结衣教师系列精品| 全城大佬跪迎:傻婿觉醒短剧全集| 哇嘎高清电影在线播放| 王子变青蛙 电视剧| 里番牝教师 淫辱yy4180| 血战台儿庄高清| 《军事行为》布兰迪洛夫观看| 荣誉守则成人版高清资源 | 欢乐颂第三季| 分宜县| 凯帕克康体水疗电影在线观看| 花枪电视剧全集| 肉脯团电影完整版| 公主骑士是蛮族的新娘全集观看| 乡村三姐妹保姆医药| 奇怪的美容院2的完整| 苏菲亚公主第二季中文版| 电影《法国空姐2》| 九九在线免费观看视频| 葵花宝典未满年龄确认请离开司马光 | 刘智贤主演的《水润女人》 | 一代枭雄共多少集| 我是歌手官方网站| 雨春电影| 《炸天小姐》电影免费| 新生在线观看| 李代沫郑虹如果没有你| 高压监狱2法国1时43分| 网络第一美女| 免费韩国电影在线电影| 修理工的艳遇三级片| 幽游白书国语| 电视剧淬火年代全集免费观看| 疯狂的节日1987| 《法国空乘2015法版》| 我和老公的部下| 全职高手第三季樱花动漫在线观看| 非你莫属2010| 美女食神国语版| 按摩3-4| 买房的女销售免费观看| 喜爱夜蒲2 ed2k| 赶尸谭艳| 新鱼之恋| 女战士满天星免费观看完整版 | 潘粤明版《昆仑神宫》在线播放| 多乐士油漆广告| 妈妈的学生5字id| 我家的天使国语版全集| 危情实录第二部电视剧| 海魂电视剧| 耶伦抵京 中美双方握手近20秒| 总裁的小甜妻全集免费| 二人世界免费观看高清动画| 希望爸爸来种种子伦理剧| 高考结束考生喊话王嘉尔| 《真实》崔雪莉多少秒出场| 风筝电视剧完整版| overflow第一季全集免费| 从前有座灵剑山电视剧免费观看全集 | 斗罗大陆在线观看全集免费| 在线看连续剧| 电影神奇女侠| 美国三片在线播放免费| 稷山县| cocoasoft| 维斯塔小镇家长会2免费观看| 追捕渣滓洞刽子手| 绿色帽子电影完整版| 林心如送女儿上学爆哭| shoeplay| 花木兰电影| 曲江车展| 女侓师的坠落| 人世间 纪录片| 盗墓笔记 谜海归巢| 女子护卫队1973在线观看| 因为遇见你 电视剧| 站着再来一次30集免费看| 世界奇妙物语2012| 红楼春梦免费观看高清| 落魄贵族琉璃川在线观看免费动漫| 游击英雄电视剧全集| 猫屎妈妈| 玫瑰故事电视剧在线| 斗罗大陆2第二季免费观看| 魔镜号街头中文字幕免费完整版 | 希望计程车| 火热电影| 美人电影| 高清《法国空乘5》无删减版| 台剧浪漫女家教在线播放| 养母的花样年华演员表| 731部队女子配狗有哪些电影| 雪中悍刀行50全集观看第二季| 迷人的后妈韩国中文在线观看| 特殊精华油5HD| 难哄电视剧免费观看第1集| 电影豹妹| 借枪电视剧在线观看| 红娘子电视剧| 法国满天星《蛇妖》| 私人航空法国成人电影| 鸣鸟不飞动漫| 妻子的新世界免费看电视剧| 文豪野犬第四季免费观看简体中文| 酒店1-40集在线观看| 《花与罪牙医》| 庐山恋2010下载| 许双军案是啥情况呀| 黄奕演过电视剧| 高清《机械师1》高清完整版| 麻生香织电影| 变身超人 电影| 岁岁青莲电视剧在线观看| 吸血鬼猎人d有几部| 九重紫电视剧在线观看全集免费播放| 木下凛凛子在线| 睫毛膏1983美国电影在线观看| 喜人奇妙夜2| 聊斋奇谭2之天宫美人| 为奴十二年| 与岳母的那些年| 韩国电影美容师特殊待遇| 凶手的样子电视剧免费观看 | 《Overflower》动漫全集免费观看第二季| 刚结婚和部长一起去出差韩国电影| 韩剧 秘密花园| 《小小的肚子》樱花动漫| 首部母乳喂养法规| 我的抗战之猎豹突击演员| 高压监狱完整版在线观看完整免费高清原声满天星2023 | 隋炀帝电视剧| 女版战狼9学生| K8s在线观看| 童军手册之僵尸启示录未删减| 花样女鬼| 原始人电影免费完整版观看| 露蒂的玩具ova| 办公室定时器韩国电影| 大嫂查之女百度影音| 宝宝巴士小苹果| 《狙击精英:巅峰对决》| 美容室的特殊待遇是4| 泰坦尼克号A版啄木鸟| 《新婚的滋味》HD| 你好杀人犯| 理想之城在线| 掌心里的海| 美味儿女息小玲第九章| 做aj的视频大全电视剧演员表| 电影《淫道》| 黎明之眼电影免费观看完整版| 我算卦超准:算命小神仙短剧全集| 刺客伍六七之暗影宿命免费观看| 《我的游泳女教练》| 日韩做Aj的视频| 想你21| 末日杀手| 快乐的大人免费观看完整高清综艺| 电视剧西出玉门在线观看| 《法国少女农场》在线电影| 唐朝诡事录之西行下载| 月光宝盒电影| 凯登克罗斯电影完整版| 校园法官越南剧免费观看| 少林寺传奇4| 河南省| 牙医姐妹1986无删减版| 电影《灭火宝贝4》在线观看免费| 天使的3d动漫| 《妈妈爱上儿子同学》韩剧| 浴火奔腾中文| 原始武器电影完整版观看国语 | 密室死斗| 法国粉红萝卜| 无贼43| 爱如潮涌电视剧| 深夜濡湿| 壮志凌云女版满天星法版高清| 春天在线观看| 电视剧 璀璨人生| 幸福触手可及收电视剧| 加勒比女海盗2观看高清完整| 妻子8免费完整版在线看| 女主麦乐迪在线观看| 一生何求陈百强| 人生几度秋凉电视剧| 彭于晏真帅是什么瓜| 超速绯闻剧情| 保罗一家1一4| 女教师与黑人3在线观看| 皇家一号娱乐| 两个女人 qvod| 大叔的爱泰剧一共多少集| 地道战电影免费观看| 酒店1-580集免费观看电视剧| 斯托娅电影| 自由她们电影免费观看完整版| 夏有乔木雅望天堂1| 禁忌5完整版在线看中文| 高清新干线惊爆倒数| 《最高的爱人诏三上》| 高压监狱完整版在线观看完整免费高清原声满天星感恩 y | 国风按摩院在线播放免费观看最新章| 声色犬马短剧免费完整版| 夺面双雄电影| 女人公敌高清第三季| 天若有情刘德华| 《扫黑·决战》电影| 多田有花在线观看| 和部长一起泡温泉| 温柔的背后全集在线观看| 海上嫁女记剧情| 就爱小姐姐| 搞笑一家人中文版全集| 金银梅1-5集免费播放电视剧 | 电视剧流水迢迢| 嫉妒的化身电视剧全集免费观看| 花与蛇1全集 影音| 荣誉守则满天星免费观看高清版 | 神探夏洛克 豆瓣| 记忆大比拼| 幸福满屋 电视剧| 春风定风波全集免费播放在线观看| 《驯服2》丽卡和谁在一起了电影| 插曲的痛20全集| 人民的名义29| 大丈夫电视剧全集48免费完整版 | 若亚方舟| 高压监狱在线观看完整免费高清原声高烧| 法国版《女超人》在线播放| 金鸡sss粤语| 死亡账号电视剧| 陕西桥梁垮塌已致12死31失联| 无双粤语| 高清《浮图缘》免费观看全集完整版| 北越暴行电影2| 按摩店的待遇1电影在线观看 | 正宗泡菜制作方法教程| 电视剧海天之恋| 惊天大迷局| 双人调情按摩术在线观看| rbd505| 电视诗歌散文| 一生一世在线观看免费版| 熟妇的滚烫的肉唇翻进翻出| 科学怪人| 撞击高贵美妇老师的翘臀| OV义姐是不是良妈妈授的动漫完整版| 男女愁愁电影免费观看| 地狱公使| 相思原唱| 黑寡妇 电影| 暖婚短剧全集免费观看| 新金银悔1-5普| 凯登版《护送》免费看| 我学生的妈妈双字ID4| 甜美的咬痕第三季| 康熙王朝高清全集50| 末日灾难| 功夫厨神国语高清在线观看完整版 | 妖精的尾巴 oad| 尸鬼 动漫| 麻花MV在线看免费观看电视剧| 天地姻缘七仙女 电视剧| 句容市| 村妓2电影完整版| 铿锵锵锵锵锵好多少| 电影快车| 电视剧霸道总裁推荐| 丧尸之地| 欧米茄奥特曼免费观看| 特殊美容院的待遇1| 娃娃脸9| 高清《前度》电影免费观看| 铿锵玫瑰之女兵排| 火影忍者论坛52pk| 斯诺克虎牙4| 荡寇风云电影| 保罗1一4| 洗手间的秘密2免费看| 僧侣之夜在线观看动漫完整版| 甲虫王者| 原来的神马电影在线观看免费| 高清《繁花》免费播放在线观看全集| 急诊室故事| 特殊美容室待遇.6| 巨茎挺进李淑芬的夜猫IV| 四个服从指什么| 陆贞传奇优酷| 高清《裂口女》大结局| 斗罗大陆动漫在线观看免费| 一路向西国语版快播| (已屏蔽)| 和部长日本出差电影免费| 兄弟无间| 韩剧泡沫爱情|