MCU軟件定時器,一個超好用的輪子

李肖遙 2025-05-08 22:10
? ? 關注、星標公眾號,直達精彩內容

轉自 | 網絡素材


在一般的嵌入式產品設計中,介于成本、功耗等,所選型的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



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

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


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

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


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

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


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

externvoidsoft_timer_tick_init(void);

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

externvoidcreat_single_soft_timer(SoftTimer *p, TimerRunModeType mode,?unsignedlong?duration,?void(*timeout_handler)(void));

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

externvoidcreat_continue_soft_timer(SoftTimer *p, TimerRunModeType mode,?unsignedlong?duration,?void(*timeout_handler)(void));

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

externvoidcreat_limit_num_soft_timer(SoftTimer *p, TimerRunModeType mode,unsignedlong?run_num,?unsignedlong?duration,?void(*timeout_handler)(void));


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

externvoidrestart_single_soft_timer(SoftTimer *p, TimerRunModeType mode,?unsignedlong?duration,?void(*timeout_handler)(void));

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

externvoidstop_timer(SoftTimer *p);


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

externvoidsoft_timer_main_loop(void);


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

externvoidsystem_tick_IrqHandler(void);



#endif/* !1__SOFT_TIMER_LIST_H */

C文件:

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

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

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

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

static?SoftTimer *head_point =?NULL;

staticstruct?SoftTimer *creat_node(SoftTimer *node);
staticchardelete_node(SoftTimer *node);
static?BOOL?is_node_already_creat(SoftTimer *node);


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

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


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

voidsoft_timer_main_loop(void)
{
? ??structSoftTimer?*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:無
?*/

voidcreat_single_soft_timer(SoftTimer *p, TimerRunModeType mode,?unsignedlong?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:無
?*/

voidcreat_continue_soft_timer(SoftTimer *p, TimerRunModeType mode,?unsignedlong?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:無
?*/

voidcreat_limit_num_soft_timer(SoftTimer *p, TimerRunModeType mode,unsignedlong?run_num,?unsignedlong?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:無
?*/

voidrestart_single_soft_timer(SoftTimer *p, TimerRunModeType mode,?unsignedlong?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);
}


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

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


staticstruct?SoftTimer *creat_node(SoftTimer *node)
{ ?
? ??structSoftTimer?*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; ?
}


staticchardelete_node(SoftTimer *node)
{ ?
? ??structSoftTimer?*p1; ??//p1保存當前需要檢查的節點的地址 ?
? ??structSoftTimer?*temp;
? ??if(node ==?NULL)
? ? ? ?return1;

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


static?BOOL?is_node_already_creat(SoftTimer *node)
{ ?
? ??structSoftTimer?*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
?*/

voidsystem_tick_IrqHandler(void)
{
? ??structSoftTimer?*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


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

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



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

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



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

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



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

externvoidstop_timer(void?(*callback_function)(void));



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

externcharsoft_timer_start(TimerTimingModeType timing_mode,?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?TimerRunModeType run_mode,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?unsignedlong?run_num,?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??unsignedlong?duration,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??void?(*callback_function)(void));



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

externvoidsoft_timer_main_loop(void);



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

externvoidsystem_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
?*/

charsoft_timer_start(TimerTimingModeType timing_mode, TimerRunModeType run_mode,?unsignedlong?run_num,?unsignedlong?duration,
? ? ? ? ? ? ? ? ? ? ??void?(*callback_function)(void))
{
? ??unsignedchar?i =?0;

? ??if(!callback_function)?return1;
? ? 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 ) ? ?/* 沒有空閑定時器 */
? ? ? ? ? ??return1;
? ? }
? ??return0;
}



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

voidstop_timer(void?(*callback_function)(void))
{
? ??unsignedchar?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循環進程,用于執行輪詢模式的回調函數
?*/

voidsoft_timer_main_loop(void)
{
? ??unsignedchar?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
?*/

voidsystem_tick_IrqHandler(void)
{
? ??unsignedchar?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++;
? ? ? ? ? ??// }
? ? ? ? ? ??
? ? ? ? }
? ? }
}

聲明:本文素材來源網絡,版權歸原作者所有。如涉及作品版權問題,請與我聯系刪除。


???????????????? ?END ????????????????

關注我的微信公眾號,回復“星球”加入知識星球,有問必答。


點擊“閱讀原文”查看知識星球詳情,歡迎點分享、收藏、點贊、在看。

李肖遙 公眾號“技術讓夢想更偉大”,作者:李肖遙,專注嵌入式,只推薦適合你的博文,干貨,技術心得,與君共勉。
評論
  • 摘要東莞市恒創連接器有限公司(HCHGCONN)是位于廣東東莞的連接器源頭制造工廠,專注于連接器國產替代、小間距大電流連接器、線對板連接器、線對線連接器、板對板連接器、電源連接器及定制連接器開發。公司面向工業自動化、新能源儲能、BMS、汽車電子、AI服務器、GPU供電、通信設備、醫療設備和智能家居等場景,提供從產品選型、替代評估、樣品驗證到批量交付的一站式連接方案。恒創可支持 Molex、TE Connectivity、JST、Hirose、Samtec 等國際品牌部分系列的國產替代評估。常見替
    HC003 2026-08-07 10:14 99瀏覽
  • 做藍牙音箱的工程師大概都碰過這個局面。產品要連手機放歌,要本地播開機提示音和按鍵音,還要接 App 做配網和狀態上報。三件事拆開,早先的常規做法是音頻藍牙一顆料、數傳藍牙一顆料、本地播放再掛一顆小 MCU 加一片 Flash。板子越畫越大,BOM 越算越貴,待機電流和固件工作量也跟著漲。WT2605C 出來以后,這套需求可以集成到一顆芯片,就是 WT2605C-32N,該芯片采用QFN32 封裝,4×4 毫米,把音頻藍牙、BLE 數傳和 MP3 本地播放三樣全包了。對藍牙音箱來說,最實在的好處就
    唯創知音語音芯片 2026-08-06 15:14 343瀏覽
  • 樓宇自控里的“巴別塔”一棟智慧樓宇、一個產業園區里,暖通空調運行著廠商私有協議,照明系統遵循專屬通信標準,變配電、門禁安防各成體系——設備間數據壁壘森嚴,上位平臺對接全靠定制化 “翻譯” 開發,不僅成本高企,交付周期也難以管控。這就是樓宇自控行業多年的痛點:協議林立、封閉林立。而破局的鑰匙,早在30多年前就已經寫好了——BACnet。作為ASHRAE制定的樓宇自控國際標準協議,BACnet是如今全球樓宇自控系統(BAS)互聯互通的“通用語言”。新風機、冷源群控、變配電、照明、門禁,凡是需要被樓宇
    飛凌嵌入式 2026-08-10 09:26 135瀏覽
  •        很多人只見過封裝在SMD外殼里的小尺寸晶振,卻不知道一顆2016、1612甚至1210封裝的微型石英晶振,從一塊巴掌大的石英原礦,到最終能穩定起振的成品,要經過十幾道精密工序。它內部的石英晶片厚度最薄不到20微米,比普通A4紙的1/5還薄,整個生產過程里哪怕0.1微米的誤差,都會直接廢掉整批產品,這也是小尺寸晶振過去長期依賴進口,國內廠商花了十幾年才啃下量產硬骨頭的核心原因。1. 原石定向切割:0.01度的角度誤差都不能有小尺寸晶振的第一步,
    TKD泰晶科技 2026-08-07 08:43 495瀏覽
  • 一、方案簡介在Buildroot構建的嵌入式Linux系統中部署Flutter應用,主流有兩套成熟的開源方案,分別適配不同的顯示場景與開發需求:方案一:flutter-elinux(Sony開源方案)由索尼官方維護的嵌入式Linux Flutter工具鏈,既支持DRM/GBM直接渲染,也兼容Wayland、X11等多種顯示后端,場景適配性更廣。方案二:flutter-pi(輕量級嵌入器)一款輕量級Flutter引擎宿主程序,僅基于底層DRM/GBM接口實現渲染,無需依賴桌面環境,資源占用更低,更
    飛凌嵌入式 2026-08-07 09:34 101瀏覽
  •                                                                        
    廣州鐵金剛 2026-08-06 17:44 207175瀏覽
  • 讓微弱脈沖信號更清晰——鎖相放大器集成Boxcar平均器在脈沖激光、泵浦-探測、時間分辨光譜、飛行時間質譜等實驗中,真正需要測量的信號往往只出現在一個很短的時間窗口內,卻被淹沒在遠大于它的噪聲和背景之中。 針對這類穩定重復的微弱脈沖與瞬態信號,賽恩科儀為OE2052雙通道數字鎖相放大器帶來全新的Boxcar Averager功能升級:在鎖相檢測之外,進一步提供從周期波形觀察、門控測量到多周期平均的完整數字Boxcar測量鏈路。 Boxcar平均器,如何從噪聲中“截取”目標信號?Boxcar平均器
    SSI_賽恩科儀 2026-08-07 15:49 8068瀏覽
  • 做電池供電攝像頭、可視門鈴、戶外安防的同學應該都踩過這個坑:攝像頭要拍,ISP、sensor、無線模塊全得開著,整機電流動輒幾百 mA。一節 18650 撐不了幾天,用戶投訴“怎么又沒電了”。有人會說:加個 PIR 人體紅外不就行了?問題是 PIR 怕熱、怕寵物、怕隔著亞克力/玻璃殼,而且只能感知“有溫差的人體移動”,靈敏度飄忽。真正省電的思路應該是:讓攝像頭平時徹底睡死,只有“前面有人/有動靜”時才被一鍵喚醒——而負責這個“看門”角色的,最合適的是一顆低功耗雷達。一、為什么是雷達,而不是 PI
    唯創知音語音芯片 2026-08-07 14:44 114瀏覽
  • 在物聯網從“萬物互聯”邁向“萬物智聯”的進程中,LTE Cat.1憑借其在速率、成本與網絡覆蓋之間的完美平衡,正成為中低速物聯網市場的絕對主力。隨著2G/3G網絡的逐步退網以及新國標對終端設備智能化、定位功能的強制要求,Cat.1模組迎來了爆發式的增長窗口。在這一關鍵節點,基于華為海思Hi2131芯片設計的LTE Cat.1模組,憑借其在能效、射頻、架構及物理規格上的底層創新,成功打破了“高性能必高功耗”的傳統魔咒,為行業提供了極具競爭力的連接最優解。核心技術優勢:重塑Cat.1能效與連接標桿海
    用戶1778981989717 2026-08-05 21:04 198瀏覽
  • 產品使用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 439瀏覽
  • 導語在現代高速數字電路設計中,信號的完整性已不僅是理想波形推演,而是一場與物理非理想特性正面博弈的工程實踐。濾波器芯片作為凈化傳輸鏈路的關鍵屏障,其核心挑戰在于:能否有效識別并濾除那些隱匿在電平跳變過程中的亞納秒級瞬態脈沖干擾,這類干擾持續極短,卻足以在高速鏈路中引發誤觸發。然而,傳統函數發生器受限于采樣率與邊沿速率,根本無法忠實復現如此狹窄且陡峭的異常波形。針對此困境,德思特TS-AWG7000系列任意波形發生器以17 GS/s采樣率與50 ps原生邊沿速度,為瞬態脈沖提供精細刻畫,配合SPG
    德思特測試測量 2026-08-05 14:06 5瀏覽
我要評論
0
點擊右上角,分享到朋友圈 我知道啦
請使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: yellow 在线观看| abo动画成结模拟免费观看| 爱是欢乐的源泉| 美女来了| 大内密探零零性| 官场初次尝了销魂少妇宋楚楚| 渔夫荒野史记1988版七| 原来神马电影手机在线观看完整版| 《倔强退魔师》1-4集在线观看免费| 金基范段誉| 西游降魔篇bd百度影音| 武逆5200| 若妻家庭女教师| 小泽玛莉亚电影| 妻子的秘密韩国电视剧| 覆雨翻云 电视剧| 在线观看我家有喜| xl司令在线观看全集免费动漫| 洗冤录第一部国语电视剧免费观看 | 我是路人甲电影下载| 暴躁老妈86集全免费观 | 好妈妈高清在线播放| 第八个嫌疑人免费观看| 天山暮雪电视剧全集| 你比星光更美丽免费观看全集| 3d柔铺团之极宝乐鉴宝鉴电影虞书欣 | 电影《官人我要》在线观看| 战神电视剧全集免费观看完整版| 怒潮 2023 张家辉| 躁动的荷尔蒙3| 美乃雀替夫还债的电影免费观看| 年轻的女学生3| 房产销售电影在线观看| 最佳爱情电视剧| 男人女人一愁愁愁愁免费看电视剧| 天与地百度影音| 艳降勾魂| 犬夜叉第二季| 高清《美景之屋4》完整版在线观看 | 雪中悍刀行第三部50集免费观看 | 漫长的季节在哪个平台看| 迁安市| 电影水母| 《一对二》姜汉娜出场时| 五年级女生| 韩剧女友的母亲双字ID | 麦乐迪·马克斯满天星免费观看| 欲百度影音| 《战争之暴行女囚》电影电影 | 庆余年2999影片库| 黑帮大佬和我的360天| 强奸蓝洁瑛的是谁| 变形金刚3国语高清下载 | 灭门惨案 孽杀| 花姑娘免费观看| 卿本佳人 迅雷下载| 女销售的秘密韩国电影| 斗罗大陆动漫全集| 《部长夫人的美貌》电影在线观看| 《地狱神探2》在线观看| 唐砖电视剧| 杜拉拉升职记 电影下载| 《肉蔻之香》法国剧情解析 | 百鬼夜行抄未删减| 和喜玉兰完整版| 经营婚姻 电视剧| 西班牙电影《掌中之物》简介| 北上电视剧在线观看全集免费播放| 罗丽星克莱尔电影在线观看| 柔性天堂| 落魄贵族琉璃川免费动漫| 杜拉拉升职记在线| 爸爸播种美剧免费观看完整版| star409| 鬼子暴行少女电影VCD正片| 沧元图第65集在线观看| 法国电影《女超人》在线观看| 在线观看电影免费高清完整版| 17·3电影免费播放高清 | 高清铁血战士:杀戮之王未删减| 韩剧《销冠的秘密2》| 詹妮弗康纳利裸戏| 抽曲的痛免费观看完整版海外| 迷失东京| 《女超人麦乐迪》电影免费播放| 如月车站Re:| 《法国空乘5》在线看| 太平年未删减| 越南满天星超大尺电眼影 | 我是特种兵3之狼牙| 总统之夜1997法国版在线观看| 贤妻良母| 伦理《法国空乘4观看 | 小仓尤子| 半碗村传奇免费观看| 电影《欢欣》在线观看| 王诗玥柳鑫宇公布恋情图片| 意大利奇迹| 火影忍者疾风传383| 荒野求生无马赛原版在哪里看| 重启之蛇骨佛蜕| 回复术士的重启人生2季在线观看 明星大侦探第八季免费观看完整版 | 崇阳县| 轱辘女人和井| 日本小妞| 联谊对象是食草系第二季| 法官李汉英| 奈奈和熏| 坚如磐石高清在线观看| 花田囍事2010| 金瓶少女电影在线观看完整版免费| 第三套全国小学生广播体操七彩阳光 | 西协美智子电影 电影在线观看| 新人肉叉烧包完整版| 背后运球| 沈阳真爱现场| 高压监狱3法国完整版免费| 机动战士敢达| 空间农女:带着囤货穿古代短剧全集| 婶婶韩国| 聊斋志异电影香港高清版| 名侦探柯南普通话免费观看| 《勇敢的老师》正版观看| 地缚少年花子君2全集免费观看| 影子爱人百度影音| 无人区在线高清电视剧| 三毛流浪记续集| 韩版花样男子国语版| 私人航空2免费观看全集| 仙逆在线观看全集完整版高清 | 三界横着走:仙尊宠妃短剧全集| 凯登克里斯版《壮志凌云》| 追着彩虹的我们电视剧免费观看| 色播九月| 亲爱的你电视剧免费观看完整版| 美容院的待遇服务免费 | ovA义姐是不是良喂养小拓第一集mskn6.| 长月烬明电视剧全集| 美国版本女儿国2| 十大奇冤| 斯巴达第四季全集免费| 《花间提壶方大厨第二季》电视剧| 美国式1982版保罗 | 帕克电影免费观看在线中文版| 怎么会爱上他并决定跟他回家 | 现在我们相爱吗| 房奴试爱开头智恩的背景故事| 美容室的特殊待遇是2| 大牛战狼6免费观看高清版下载| 李小环与苗翠花| 战狼6欧式少女全集哪里看| 青春环游记第三季综艺| 韩国蓝色隐身帽子叫什么电影| 灯草和尚聊斋| 陈宝莲满天星| 欲望之都首页| 人猿泰山无删减版1995| 勐垅沙免费| 公与浮1| 久别重逢:初恋还是你全集免费 | 年轻人 高清在线观看| 五月深爱网| 五福临门电视剧全集在线观看| 中文字Dl幕岳和女胥友田真希在线| 电视剧50玫瑰| 商务老板旅行戴的帽子电影在线观看| 征服人妻第1-52集资源请求| 用我的指尖打扰你第一季免费观看全集动漫 | 带美影视影院-《妻子做社长秘书偿还债务》新版-最新完整版高清在线观看 | 总统夫人电影| 乾隆下江南电影| 龙虎少年队2 电影| 《真实》崔雪莉多少秒出场| 韩国电影中文字幕美国片我要爸爸播种| 致命弯道5完整版在线观看视频| 满天星版《荣誉守则》在线 | 新来的瑜伽老师完整版| 赵甲第电视剧在线观看| 奥特曼大电影超银河传说2国语版| 李少红版红楼梦| 地狱之路| 左撇子女孩| 加勒比在线| 东成西就2011插曲| 法国电影《Cleves》| 国风按摩院5部曲顺序及观看方法| 3d肉铺之极乐宝鉴| 高压监狱完整版在线观看完整免费高清原声满天星感恩 y | 爱情而已| 都市犯罪4在线观看免费高清| 道士下山免费| 《朋友夫妇·交换3》| 史诗电影| 人猿泰山1995在线观看超清| 爱丫爱丫影院电视剧在线观看 | 功夫状元演员表| 少女情怀免费播放| 女护卫三级片视频| 高清《年轻的女仆》韩国电影| 二阶堂完整版在线观看| 四大名妓上官婉儿免费观看全集| 盛唐风流电影高清版| 烈焰在线观看完整版| 步步惊心高清在线观看免费| 美国派4 美国重逢| 虎符传奇电视剧| 新入职的员工躲不过部长| 饮食男女高清免费完整版在线观看| 激情從林| 夜来香电影在线看| 《需要爸爸播种子》在线观看播放_HD/高清_免费无删减完整版电影 - 星辰影院 | 九五至尊粤语| 美女脱18以下禁止看免费| 人肉玩具姚乐怡| 好男人观看免费高清完整在线| 玄学少女全集免费| 恋爱女王电视剧| 食人鱼3d电影| xl司令全集观看完整版| 我们都要好好的| 私人女性监狱美国版女主是谁扮演的| 巨轮粤语28| 《私人航空》免费观看| 初恋重逢:初心不变短剧全集| 雷小翼个人简介| 中森眀莱| 坠落天使在线观看免费完整版| 女版战狼19高清国语免费观看动漫 | 姐妹牙医电影在线完整版观看中文| 马云谈台湾问题| 女人花免费观看大全电视剧武则天| 《沉香如屑》电视剧| 黑大佬的365天无删除完整翻译| 钢琴之森下载| 路边新娘第二部| 无影灯下 电视剧| 在车上被儿子一次次日| 财阀阴谋| 日本女律师的堕落在线观看 | 战狼6免费版高清播放| 宝贝计划电视剧| 公之浮之手中字5HD中字怎么读| 猎狼电影免费播放完整版| 三体电视剧免费观看完整版| 爱情图鉴之暗恋| 哈利波特与密室国语| 我们的歌第五季| 骄阳似我赵今麦电视剧第7集| 电影《需要爸爸播种子》2| 霹雳舞2| 少女农场| 蜜耻母在线观看| 《卖保险的女销售》| 镜双城电视剧免费观看全集西瓜| 香水佳人| 历年出生人口一览表| 基辛格访华细节曝光| 台剧黛比女家教在线看 | 有希望的男人无删减版| 天价乌木| 刀客家族的女人11| 姐姐的朋友3在完整有限中字第5 | 蜜桃成熟时33d在线| 黑色的眼泪,麻生香织完整版哪里可以 | 一年一度喜剧大赛2综艺| 漂亮的廋子3| 人民日报评电视收费乱象| 锦绣安宁电视连续剧| 二虎逆袭人生短剧免费观看| 通灵王国语版| 日韩男按摩师性按摩电影| 年轻的母亲4韩剧免费中文版| 女律师的坠落完整版HD| 电影《金钱和我》国语版| 我的女友妈妈韩字的ID是谁电影 | 《娃娃脸》4| 我是刑警29集| 辽宁卫视在线直播高清版| 超级快递| 绝强驱魔师花子| 胡歌版的射雕英雄传| 法国版魔力宝贝监狱| 四川绵阳村民种中药材致富 | 朱日和阅兵2017| 《爱你几何》高清全集免费看| 爱在空气中第四集| 《真爱墨菲定律》泰剧| 电视剧冰锋剧情介绍| 罪恶王冠ed| 三个少妇按摩记在线播放| 青梅竹马是消防员风车| 激战丛林未删减版| 黑镜第五季| 铿锵铿铿锵铿锵免费观看| 鉴宝弃少短剧全集| 许我耀眼免费观看32集| 壮志凌云女版1994美国满天星| 机械姬迅雷下载| 三级健身房教练| 老严有女不愁嫁片尾曲 | 雯雅婷动画| 迪迦奥特曼动画片全集| yelloe视频免费观看| 给你宇宙未删减| 埃及皇后3满天星版| 宸汐缘电视剧免费观看全集| 超级马里奥世界2| 和部长出差电影中字| 敖婿电视剧免费观看| 满天星《背叛》| 一枝红杏入墙来| 刺杀据点下载| 小女花不弃 电视剧| 高清《偷窥》电影| xi司令真人版全集免费播放| 巴尔干边界完整免费观看| 战狼6免费观看在线| 行尸走肉第二季剧情| 儿子与情人视频完整版在线观看| 灵魂注入动漫免费完整版| 花束般的恋爱电影在线观看免费高清 | 玉女心经2| 德钦县| 终极一班3mp4下载| 男人帮电视剧| 水手服饲育电影高清完整版在线观看 | 妻子的上司| 狂飙电视剧在线观看策驰| 庆余年第一季在线观看| 妈妈的职业5中文结局原声免费 | 至尊红颜武媚娘| 勾魂降头无删减| 错位青春| 凯登克罗斯在线电影免费观看护士 | 神女峰的迷雾| 男男在洗澡时互添gay| 恋之欲室快播| 大话女儿国| 《特殊的治疗》李采潭在线 | 《需要爸爸播种子》高清完整版免费在线观看-电影频道 - 光棍影院 | 李自成电视剧全集免费观看| 遥远时空中3| 美丽小蜜蜂10姐姐叫| 鲇川奈绪| 铿铿锵锵在线看免费观看| 我的好妈妈BD在线观看免费高清| 女兵排电视剧全集| 好兄弟的女友| 两个人蔡妍| 替弟还债| andy哥老婆| 玉女心经之官人我要| 97社免费| 爱人 电影 2005| 三年大片高清电影免费观看| 坏女孩电影高清完整版| 人生大事朱一龙电影高清在线观看| 电影私人航空在线观看完整免费高清 | 在丈夫面前被别人欺负日语| 恋爱兄妹综艺节目在线观看全集| 泽塔奥特曼普通话免费版在线观看| 女学生被强伦轩无删减| 最强大脑第八季免费观看完整版 | 明星有戏寻找唢呐王| 男女一起愁愁愁高清全集免费| 喜羊羊之心世界奇遇| 兄妹在客厅当父母2上映时间| 心悸mv| 速度与激情10 电影| 日本电影朋友还债的麦子| 独生子女的婆婆| 最后的维京人全集观看| 小虎还乡动画片在线观看| 上海皇帝之岁月风云| 两个好媳妇电影完整版| 阴阳路之红当当| 西游降魔篇mp4下载| 簧瑟片| 鬼吹灯之黄皮子坟电影在线观看 | 欲望的岛屿| 新西游降魔篇完整版| 韩剧学校2013| xl司令免费高清全集| 浮生如梦 一晌贪欢免费阅读| 暗暗在线观看| 农民伯伯下乡记| 高清江湖夜雨十年灯| 人猿泰山hr版1995意大利版| 高清《月老》电影完整剧情| 死亡使者 电视剧| 新员工2在线观看完整版电影| 茜拉 洋葱| 美国娃娃脸10| 地牢围攻2电影| 好运家 电视剧| 需要爸爸的种子播种电影| 巜人妻初次按摩2视频全集| 吉尔莫女孩第二季| 93夜之女| 爱国者电视剧| 韩剧漂亮的小瘦子免费观看完整版| 一男子用啤酒瓶刺死女友 已自首| 长津湖 在线播放| 义姐是不是良动漫| 借种无删减| 爱在几何电影完整版免费观看 | 免费电影网站在线观看完整版| 维修工的老艳遇在线观看| 石门风云| 新还珠格格97集| 邻家有女韩剧免费| 金瓶梅新版| 《倔强退魔师》免费观看| 都挺好电视剧全集免费| 加索尔三兄弟| 电影《美味快递员2》演员阵容在线观 | 灌篮高手第二部1| 电视剧风影全集观看| 歼灭天际线免费完整版在线观看| 公主日记1| 案发现场第2部| 妈妈我想你歌曲原唱| 黑帮大佬和365日| 黑白配中文视频高清| 女生万岁| 2对2交换| 激战丛林在线播放| 火口的两人| 国产宾馆真实人妻互换| 指尖传出的真挚热情第一季| 仙剑奇侠传3 38集| 兄弟换5| 俑之城在线观看免费完整版高清| 向往的生活第七| 尹律特邀外卖员在线观看电影| 日在校园h版| 王芳的快乐生活| 痛30插曲全集免费播放| 女生亲嘴| 年轻的小瘦子| 广场舞母亲| 电影小兵张嘎免费观看| 斯巴达真人版2电影在线看| 鸣鸟不飞动漫| 天才龙宝寻亲记短剧免费全集| 人猿泰山hr版 在线完整版| 怒呛人生免费观看全剧完整版| 进击的巨人第二季第三集| 少女全身体检视频| 《局内人》电影完整版在线观看 | 闪婚全集| 我的小后妈韩剧中字播放| 斯凯布鲁房产销售奇缘| 网红逆袭全集免费| 大足县| 神之一手| 天空电影在线观看免费完整版| 战狼12欧式少女全部视频| 兔子帮图片| 隐形的亿万富翁电影免费| 《示范销售避孕套》剧情介| 莫妮卡版《爱我几何》在线观看| 破冰电影完整版在线观看| 香奈儿版满天星古墓丽影| 周生如故全集免费观看| 电视剧勇敢的心| 老公的私房钱电视剧剧情免费观看| 俩6岁孩子33层扔下推车水桶 | 重庆谍战在线观看| 你别惹我短剧全集免费观看| 遥控器控制女领导免费观看| 中国百强名镇| 棕眼之谜免费观看全集| 倔强驱魔人の花子在线免费观看 | 道士下山 豆瓣| 麦乐迪女超人| 上原瑞穗百度云| 《桑叶》韩版中国| 21世纪高清免费观看平台| 《被拒绝的爱:无尽篇》 | 妖狐传说| 白峰高清在线观看免费| 李李妮的vk视频| 《朋友夫妇:交换》4| 《娃娃脸3》电影| 卧底归来第二部免费| 我们在黑暗中相拥短剧免费观看| 《食神》在线观看| 指环王2:双塔奇兵免费| 步步惊心高清在线观看免费| 饼干警长| 《未婚妻的姐姐》电视剧在| 凯登克罗斯电影| 斗罗大陆电视剧免费全集观看| 高三女孩热血发言燃爆全场 | 古文观止朗读| 97超频在线视频免费观看| 高清《堕落》| 麦乐迪女超人在线观看完整免费高清原声满天星百 | 宋莲生坐堂| 美梦成真在线观看免费完整版| 零距离电视剧| 《家属动漫1~6全集》在线看| 我的老婆最美| 比悲伤更悲伤的故事| 印度空姐2全集观看完整版| 诱人风流艳妇hd| 哇嘎全部免费观看| 长月烬明电视剧全集| 女超人麦乐迪在线观看完整版| 超人迪加之最终决战粤语| 向东是大海百度影音| 麦子交换3中字版电视| 甄嬛传50集| 费利克斯勒布伦| 坎贝奇在线观看| 潮汕小品有钱人| 我是证人迅雷下载| 莫莉3特别的酒店| 郭德纲最新单口相声| 女儿的奶水| 《爱你几何》免费完整版| 速度与激情4 影音| 良师男友电视剧| 意大利私人女人监狱免费看| 《黑暗荣耀》第二季| 电影深海| 韩国 售楼小姐的秘密 在线 | XL在线观看| 韩版《甄嬛传》| 坎贝奇品味人生完整版免费| 为爱所困电视剧| 禁止的爱 免费观看 百度百度 | 我强行与岳的性关系在线观看| 阜新市| 使徒行者3粤语电视剧| 一起来看流星雨12| 麻雀变公主| 入室暴行3被蹂躏在线观看| 西瓜烂了是什么梗| 雷霆扫毒国语| 凯登·克劳丝-Kayden壮志凌云| 我们一起追过的女孩| 亲爱的仇敌电视剧免费观看| 束缚游戏完整版| 《乌云之上》在线观看| 机动警察国语| 需要爸爸的种子电影完整版| 张震鬼故事| 深夜濡湿| 水润女人刘志贤全集剧情介绍| 善良的她在线观看| 一生一世电影完整版| 女扮男装闯江湖短剧全集| 电视剧《仁心俱乐部》完整版 | 《绝密较量》全集| 太平洋家居| 杨敏思版1-5电视大结局在线观 | 鄯善县| 美男高校地球防卫部love| 硬汉枪神在线观看| 网友吃席发现每人面前都是盒饭 | 性感女郎| 澳门风云在线观看| 满天星版《荒岛女儿国》在线观看| 野花在线观看免费高清中文| 电视剧乡村名流| 肯纳詹姆斯《空乘》| 万古至尊动漫在线观看免费完整版| 人民的名义 迅雷种子| 牙医姐妹86日版免费看| 苏里南韩剧| 锦囊妙录电视剧在线观看全集免费| 本乡爱演的日本电影| 17岁在线观看完整版| 魔域桃源主题曲| <<部长出差的日子>>| 黑暗深处| 白蛇传说在线观看| 天海翼搜查官| 高清趣塔德庄园未删减| 仙尊宠妃:三界横着走短剧全集| 家属无码| 大闹天宫电影免费观看| 迈克杰克逊歌曲| 《V酒店第一季》大结局| 寒山潜龙 电视剧| 朱日和阅兵2017| 法国《少女农场》高清| 神探夏洛克第四季03| 淘宝最近怎么了| 坎贝奇第二部曲《品味人生》免费观看 | 爱如潮涌电视剧| 金瓶梅 高清完整版下载| r片| 亚洲无mate20pro麻豆| 勤劳的继拇中字| 越策越开心| 完美音调| yy6680电视剧免费播放| 上原瑞穗百度云| 尖峰时刻 3| 博白县| 风中的承诺粤语| 中国四大民间传说| 我们的新时代电视剧在线观看全集| 麦子交换1的中文翻译曼哪| 电视剧娘家的故事3| 错位的遗憾歌曲原唱赵洋| 《美丽的侯丽》| 甄嬛传43集| 刑侦12| xl司令第二季第八集免费观看| 高压监狱3完整版在线看| 《超人》| 爱我几何完整版在线播放免费| 满天星八尺夫人在线观看免费播 | 越南性的暴行在线| 秘密的爱电影免费观看剧情解析| 速度与激情8免费在线观看| 电影私人航空在线观看完整免费高清| 军团大战| 西西里的美丽传说| 八尺夫人意大利电影完整版| 古畑任三郎国语| 医学调查电视剧免费观看| 《无憾》完整版电影| 《琉恩传说芙蕾雅》完整版| 律政俏佳人电影| 男人女人一起愁愁愁电视剧免费| 七夜雪电视剧全集免费播放| 人民的名义dvd版| 五福星系列| 醉酒的玫瑰电影完整版| 渔夫荒淫史 电影| 曾经的疫苗我不懂得珍惜| 电影姐妹牙医完整版 在线看| 吸血鬼日记第二季| 独立日 电影| 麦乐迪满天星电影| 凤凰卫视一虎一席谈| 一次邂逅| 特殊使命小分队| 三年中国在线高清观看| 中国女排对美国女排直播| 馒头影院| 电视剧绝密1950| 英雄本色2电影| 《和部长一起去出差旅》中文| 罪与罚作者| 你的目光所及之处第二季| 卖保险套的女销售| 香港金瓶梅| 短剧网剧免费观看| 水月洞天全集| 韩国电影老婆与老公上司| 韩国阅兵式高清完整版| 《县委大院》免费观看| 台湾电影村姑的故事免费观看| 最后一战电视剧| 《凶器》| 禁忌3年转一代| 胖熊在线电影| 《开端》| 砚山县| 白峰美羽大战黑人在线观看| 爱情公寓3 19| 戴安琳恩《满天星》| 钻石大劫案电影张浩| 老酒馆电视剧在线观看免费全集| 高清《点石成金》电影| 商务旅行戴绿帽子在线观看| 乐游原电视剧免费观看完整版西瓜| 霍家拳之铁臂娇娃电影完整版| 俄罗斯女超人麦乐迪| 成龙历险记免费观看全集完整版| 百年孤独 电影| 《炸天小姐》完整版| 请赐我一双翅膀免费观看| 老头同性老老头交tv| 赌侠1990刘德华| 三级片男按摩师| 365日:今时之欲在线| 上伊那牡丹,酒醉身姿似百合花般| 追风战警| 《法国空乘2018法版》手机播放| 奥特曼电影版| 小蜜蜂电影| HR版女版壮志凌云观看| 国家宝藏cctv| 韩国 艳舞| 启示录完整版免费观看| 需要爸爸播种子HD中字_午夜电影全集_完整版免费在线观看-天天影院 | 高压监狱法版1小时46分预告片| 山西黄河电视台| 全职高手第二季在线看| 一起愁愁高清版在线看正版| 巡视组回应国企领导疑出差带小三 | 水浒传之英雄好免费播放| 《陷阱》未删减版在线观看| 电影邻居完整版| 许我耀眼免费观看32集| (姐妹牙医)电影赤子板栗| 如果.爱| 曾志伟最新电影| 娜妲莉的情人百度影音| 白鹿原电视剧免费全集在线播放| 终末的女武神第三季观看全集| 小羊没烦恼7分钟视频在线观看 | 兄弟的老婆10免费观看电视剧| 电影寡妇村| 真情玫瑰 电视剧| 羊炭疽病| 电影《满天星》莉娜奥琳扮演者| 幸福的向日葵| 电影太太度假时| 金银悔5一1手机版最新版本更新内容| 高压监狱1小时45分钟能出来吗| 血洛大陆| 七天电影| 酒店激战3-12集全集播放再来一次好吗| 《朋友的妻子》在线观看| 乘风破浪2024第五季在线观看| 海底小精灵| 《完美邻居》电影在线观看| 百味人生| 《示范销售避孕套》剧情介绍| 韩国好姑娘| 李娜年终总决赛| 火影忍者国语版全集高清优酷| 电影《种马猎人》免费看| 斗破苍穹第118集更新时间| 进击的巨人大结局| 法律与秩序特殊受害者| 水蜜桃5美国伦理| 孟鹤堂结两次婚| 卿本佳人 在线| 丈夫和初恋重逢| 男按摩师做乳房按摩1一5集| 东归英雄传电视剧| 中国交通频道| 暴躁46集全在线观看免费高清| 地球脉动纪录片中文免费观看| 百日郎君| 别无选择电视剧| 她被搬运工侵犯未删减版在线播放| 开心魔法粤语| 甘十九妹电视剧在线观看完整版| 白峰美羽电影| 爱情面前谁怕谁剧情| 木下柚花| 萌宠撒欢节| 强伦轩办公室女教师HD| 天亮了汤晶锦| 短剧《撕夜》免费观看| 屯留县| 女按摩师在线观看A片| 西野翔ed2k| 喜羊羊与灰太狼竞技大联盟| 吾家有姐满天星版| 英雄祭电视剧| 特利迦奥特曼国语免费观看| 少儿节目小猪佩奇| 水润女人未删减版| 星期五的寝室1978| 夏日福星粤语版| 绽放许开心电视剧免费观看| 白峰电影高清播放在线观看免费| 大内密探零零星星无删减版| 《好东西》剧情介绍| 翘臀嫩美少年被调教灌尿| 天使多美丽| 马克龙访问印度受到豪华接待| 美丽的樱桃| 电视剧绝对权力| 母亲5免费高清电视| 欢喜游龙演员表| 《女警察坠落2》| 《爱恋》电影完整版在线观看| 鱼跃在冬季国语| 把妻子借给朋友泻火1 5| 朋友换麦子3:普通话版| 电视剧末路1997| 儿童歌曲快乐的节日| 变形金刚1迅雷下载| 金银悔5-1| 苹果电影免费完整版在线观看影片 | 电视剧秋蝉| 日剧维修工的艳遇| 三妹43集播放| 光辉岁月粤语发音| 怒放电视剧免费观看全集| 《甲种公牛》1976意大利| 狂飙电视剧全集免费高清播放| 回魂之夜电影| 电视剧新生| 锹里奏鸣曲| xL司令真人| 花开山乡电视剧在线观看| 善恶的彼岸| 《入室暴行3被蹂躏》在线观看 | 七号差馆| 两不疑动漫免费观看| 牙医姐妹在线观看视频全集| 乃万单手脱上衣| 龙腾世纪探索者的黎明| 继拇献身义子3| 高清《清宫性史》在线观看| 变形金刚7| 男女激情感片在线观看| 《白衣绳索牙医生》| 两个好媳妇中文在线观看| 峡谷在线观看高清完整| 宇宙天魔完整版国语在线观看高清| 美景之屋6普通话版百度云 | 19岁在线高清观看免费播放电视剧 | 空前绝后满天飞在线观看| 急诊护士电影| 监狱女孩| 《再去温泉吧!》第一季| 《汤唯》电影免费观看高清| 法国满天星《贵夫人》在线看| 乌贼娘第一季| 法国大选选情焦灼| 呼噜小精灵第3季全集| 按摩男技师电影| 裙子下面是野兽动漫| 爱情诊所在线观看| 迷人的小峓子8| 《插曲的痛》中文| 地铁跑酷2| 《品味人生》观看免费| 特殊的滋味在线观看视频| 我的幸福密码| 三d肉浦团| 铁石心肠2019在线观看| 美妙发型屋韩国完整版| 好团圆电视剧免费观看| 超级经纪人 电影| 我把温柔献给你| 已瞄准我的妹妹歌词樱花观看1| 死生时刻| 龙与虎下载| 情深深雨濛濛| 盐边县| 成全高清视频在线观看动画片| 那曲在线| 大宋少年志1免费观看| 哈利波特生日| 《替夫还债2》| D罩杯的保险销售在线观看|