本發(fā)明涉及一種延時執(zhí)行方法,尤其涉及一種基于c語言的異步延時執(zhí)行方法及執(zhí)行模塊。
背景技術(shù):
異步延時執(zhí)行,是一種對期望事件發(fā)生時間的延時和對期望事件延時發(fā)生不阻塞主線程的處理方法。
在面向?qū)ο蟮恼Z言(例如c++、c#、java等)中,可以采用多線程或異步函數(shù)實現(xiàn);現(xiàn)有技術(shù)中,在c語言中采用實時操作系統(tǒng)(realtimeos)或采用多線程使用,但對小容量ram和主頻較低的mcu來說,存在較大的堆棧消耗,且多線程間維護成本高,反而得不償失。
綜上,有必要設(shè)計一種基于c語言的異步延時執(zhí)行方法及執(zhí)行模塊來彌補上述缺陷。
技術(shù)實現(xiàn)要素:
本發(fā)明提出一種基于c語言的異步延時執(zhí)行方法及執(zhí)行模塊,其解決了現(xiàn)有技術(shù)中在c語言中采用實時操作系統(tǒng)使用多線程導(dǎo)致堆棧消耗大和多線程間維護成本高的缺陷。本發(fā)明采用異步延時調(diào)用,不阻塞主線程,且對cpu資源的消耗比實時操作系統(tǒng)小。
本發(fā)明的技術(shù)方案是這樣實現(xiàn)的:
本發(fā)明公開一種基于c語言的異步延時執(zhí)行模塊,其包括結(jié)構(gòu)體定義模塊、計數(shù)驅(qū)動模塊和調(diào)用模塊;調(diào)用模塊設(shè)有計數(shù)值模塊、注入事件模塊和事件標簽?zāi)K,且調(diào)用模塊包括異步延時調(diào)用模塊和異步延時重調(diào)用模塊;結(jié)構(gòu)體定義模塊用于對事件結(jié)構(gòu)體及需要發(fā)生的事件進行定義;計數(shù)驅(qū)動模塊用于采用時間單位對調(diào)用模塊中發(fā)生的注入事件進行計數(shù),且在計數(shù)過程中,對觸發(fā)的事件進行隊列清除,對未觸發(fā)的事件進行計數(shù)累加;異步延時調(diào)用模塊用于對指定的發(fā)生事件、事件異步發(fā)生的延時計數(shù)值和事件指針指向獲取指定存儲位置;異步延時重調(diào)用模塊用于對指定的發(fā)生事件、事件異步發(fā)生的延時計數(shù)值和事件指針指向獲取指定存儲位置,并對同一事件標簽代表的事件重新計數(shù)注入。
其中,事件結(jié)構(gòu)體包括事件啟動標志、事件啟動計數(shù)值、事件計數(shù)值和事件指針。
其中,事件啟動標志用于標記該事件是否在啟動延時異步調(diào)用中。
其中,事件啟動計數(shù)值用于記錄事件注入時設(shè)置的延時值。
其中,事件計數(shù)值用于在計數(shù)驅(qū)動模塊在每次計數(shù)時,采用自減方式進行事件異步延時觸發(fā)的倒數(shù)值。
其中,事件指針用于存儲異步延時觸發(fā)發(fā)生的事件的方法指針。
其中,在調(diào)用一次保證執(zhí)行的情況下,采用異步延時調(diào)用模塊;其中異步延時調(diào)用模塊的工作流程為:在對指定事件調(diào)用后,該事件開始計數(shù),中間重復(fù)調(diào)用同事件的異步延時調(diào)用模塊,該事件并不會重新計數(shù),直到該事件達到指定計數(shù)值、觸發(fā)事件發(fā)生后,才可以調(diào)用異步延時調(diào)用模塊再次對事件進行調(diào)用。
其中,在調(diào)用完畢后,需根據(jù)實際情況,對將要發(fā)生的事件的執(zhí)行時間進行隨時修改的情況下,采用異步延時重調(diào)用模塊;其中異步延時重調(diào)用模塊的工作流程為:在對指定事件調(diào)用后,該事件開始計數(shù),中間重復(fù)調(diào)用同事件的異步延時重調(diào)用模塊,該事件重新計數(shù);如果一直在該事件計數(shù)未到達前重復(fù)調(diào)用異步延時重調(diào)用模塊,則該事件會一直重置計數(shù),事件將永遠不會發(fā)生。
本發(fā)明還公開一種基于c語言的異步延時執(zhí)行模塊的執(zhí)行方法,其包括如下步驟:(s01)通過結(jié)構(gòu)體定義模塊定義多組需要發(fā)生的事件;(s02)異步延時調(diào)用模塊、異步延時重調(diào)用模塊分別針對步驟(s01)中定義的事件進行編號,且設(shè)定每組事件異步發(fā)生的延時計數(shù)值和事件指針指向,并獲取指定存儲位置;(s03)計數(shù)驅(qū)動模塊每一間隔周期執(zhí)行一次,每次執(zhí)行均遍歷步驟(s01)中定義的多個事件,如果事件啟動標志為啟動狀態(tài),則計數(shù)驅(qū)動模塊將自減該事件的計數(shù)值,當該事件的計數(shù)值自減為0時,表示該事件已達到步驟(s02)中延時計數(shù)值的設(shè)定值,計數(shù)驅(qū)動模塊通過該事件的事件指針,觸發(fā)執(zhí)行該事件;如果事件啟動標志為未啟動狀態(tài),則計數(shù)驅(qū)動模塊將跳過此事件的驅(qū)動,執(zhí)行步驟(s04);(s04)異步延時重調(diào)用模塊對同一事件標簽代表的事件重新計數(shù)注入。
與現(xiàn)有技術(shù)相比,本發(fā)明具有如下優(yōu)點:
本發(fā)明采用c語言實現(xiàn),作為最通用的編程語言,可以跨平臺實現(xiàn),避免了移植不同平臺所耗費的開發(fā)成本,提高了兼容性,同時可便利地嵌入到各種對ram和主頻使用要求苛刻的嵌入式mcu中;本發(fā)明只需少量存儲空間,在嵌入式mcu上實現(xiàn)具有對系統(tǒng)資源要求低,代碼量小等優(yōu)點。
附圖說明
為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明基于c語言的異步延時執(zhí)行模塊的結(jié)構(gòu)框圖。
具體實施方式
下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
為了有助于和澄清隨后的實施例的描述,在對本發(fā)明的具體實施方式進行詳細說明之前,對部分術(shù)語進行解釋,下列的解釋應(yīng)用于本說明書以及權(quán)利要求書。
本發(fā)明中出現(xiàn)的ram是randomaccessmemory的縮寫,其中文意思為隨機存取存儲器,稱作“隨機存儲器”,是與cpu直接交換數(shù)據(jù)的內(nèi)部存儲器,也叫主存,其可以隨時讀寫,而且速度很快,通常作為操作系統(tǒng)或其他正在運行中的程序的臨時數(shù)據(jù)存儲媒介。本發(fā)明中出現(xiàn)的mcu是microcontrollerunit的縮寫,其中文意思為微控制單元,其本質(zhì)為一單片機,指將計算機的cpu、ram、rom、定時計數(shù)器和多種i/o接口集成在一片芯片上,形成的芯片級的計算機。本發(fā)明中出現(xiàn)的其它英文詞語均為代碼,不代表其它任何意義。
參照圖1,作為優(yōu)選的實施方式,本發(fā)明公開一種基于c語言的異步延時執(zhí)行模塊,其包括結(jié)構(gòu)體定義模塊、計數(shù)驅(qū)動模塊和調(diào)用模塊;調(diào)用模塊設(shè)有計數(shù)值模塊、注入事件模塊和事件標簽?zāi)K,且調(diào)用模塊包括異步延時調(diào)用模塊和異步延時重調(diào)用模塊;結(jié)構(gòu)體定義模塊用于對事件結(jié)構(gòu)體及需要發(fā)生的事件進行定義;計數(shù)驅(qū)動模塊用于采用時間單位對調(diào)用模塊中發(fā)生的注入事件進行計數(shù),且在計數(shù)過程中,對觸發(fā)的事件進行隊列清除,對未觸發(fā)的事件進行計數(shù)累加;異步延時調(diào)用模塊用于對指定的發(fā)生事件、事件異步發(fā)生的延時計數(shù)值和事件指針指向獲取指定存儲位置;異步延時重調(diào)用模塊用于對指定的發(fā)生事件、事件異步發(fā)生的延時計數(shù)值和事件指針指向獲取指定存儲位置,并對同一事件標簽代表的事件重新計數(shù)注入。
本發(fā)明事件結(jié)構(gòu)體包括事件啟動標志、事件啟動計數(shù)值、事件計數(shù)值和事件指針;事件啟動標志用于標記該事件是否在啟動延時異步調(diào)用中;事件啟動計數(shù)值用于記錄事件注入時設(shè)置的延時值;事件計數(shù)值用于在計數(shù)驅(qū)動模塊在每次計數(shù)時,采用自減方式進行事件異步延時觸發(fā)的倒數(shù)值;事件指針用于存儲異步延時觸發(fā)發(fā)生的事件的方法指針。
本發(fā)明在調(diào)用一次保證執(zhí)行的情況下,采用異步延時調(diào)用模塊;而在在調(diào)用完畢后,需根據(jù)實際情況,對將要發(fā)生的事件的執(zhí)行時間進行隨時修改的情況下,采用異步延時重調(diào)用模塊。其中異步延時調(diào)用模塊的工作流程為:在對指定事件調(diào)用后,該事件開始計數(shù),中間重復(fù)調(diào)用同事件的異步延時調(diào)用模塊,該事件并不會重新計數(shù),直到該事件達到指定計數(shù)值、觸發(fā)事件發(fā)生后,才可以調(diào)用異步延時調(diào)用模塊再次對事件進行調(diào)用。異步延時重調(diào)用模塊的工作流程為:在對指定事件調(diào)用后,該事件開始計數(shù),中間重復(fù)調(diào)用同事件的異步延時重調(diào)用模塊,該事件重新計數(shù);如果一直在該事件計數(shù)未到達前重復(fù)調(diào)用異步延時重調(diào)用模塊,則該事件會一直重置計數(shù),事件將永遠不會發(fā)生。
本發(fā)明還公開一種基于c語言的異步延時執(zhí)行模塊的執(zhí)行方法,其包括如下步驟:(s01)通過結(jié)構(gòu)體定義模塊定義多組需要發(fā)生的事件;(s02)異步延時調(diào)用模塊、異步延時重調(diào)用模塊分別針對步驟(s01)中定義的事件進行編號,且設(shè)定每組事件異步發(fā)生的延時計數(shù)值和事件指針指向,并獲取指定存儲位置;(s03)計數(shù)驅(qū)動模塊每一間隔周期執(zhí)行一次,每次執(zhí)行均遍歷步驟(s01)中定義的多個事件,如果事件啟動標志為啟動狀態(tài),則計數(shù)驅(qū)動模塊將自減該事件的計數(shù)值,當該事件的計數(shù)值自減為0時,表示該事件已達到步驟(s02)中延時計數(shù)值的設(shè)定值,計數(shù)驅(qū)動模塊通過該事件的事件指針,觸發(fā)執(zhí)行該事件;如果事件啟動標志為未啟動狀態(tài),則計數(shù)驅(qū)動模塊將跳過此事件的驅(qū)動,執(zhí)行步驟(s04);(s04)異步延時重調(diào)用模塊對同一事件標簽代表的事件重新計數(shù)注入。本發(fā)明計數(shù)驅(qū)動模塊為一個周期性的執(zhí)行模塊,其周期可以為1ms,本領(lǐng)域技術(shù)人員根據(jù)實際需求,可以將該周期設(shè)定為其它的時間。
本發(fā)明異步延時調(diào)用模塊需指定發(fā)生事件為n個事件中的哪一個、設(shè)置事件異步發(fā)生的延時計數(shù)值和事件指針指向;例如在程序的某處,需要5秒后,獲取指定存儲位置存儲的數(shù)值,而不阻塞主線程,那么可以使用異步延時調(diào)用模塊,指定發(fā)生事件為n個事件中的第一個、設(shè)置事件異步發(fā)生的延時值為5000、設(shè)置事件指針指向的執(zhí)行方法為獲取指定存儲位置存儲的數(shù)值的方法;使用完異步延時調(diào)用模塊后,程序繼續(xù)運行,計數(shù)驅(qū)動模塊則會自動計時,5秒后觸發(fā)該事件。而異步延時重調(diào)用模塊與異步延時調(diào)用模塊使用方式相同,但異步延時重調(diào)用模塊每次使用時,設(shè)置的事件將會重新延時計數(shù),而異步延時調(diào)用模塊則不會。
以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進等,均應(yīng)包含在本發(fā)明的保護范圍之內(nèi)。