軟體定時器3

2021-09-25 10:17:18 字數 1147 閱讀 9710

硬體的資源總是緊張的,用這些有限的資源去做更多的事情,這大概就是每個硬體工程師一直在計較的事情了吧。定時器應該是很常用的乙個功能了,很多地方都需要。然而硬定時器就那麼幾個。所以面對一些對時間精度要求沒那麼高的地方,軟定時器就很有用了。

簡單描述

所謂軟定時器,不過借助硬定時器產生乙個累積計數值。然後以此為基準生出若干個不太準確的軟定時器。為什麼不準確呢 因為他可能被其他中斷服務打斷,因此存在一定的遲滯。但是對於一些對時間精度不是很敏感的場景來說 這點遲滯是可以接受的。

實現原理及流程

建乙個全域性變數timecount使用乙個硬體定時器,設定乙個比較小的定時值,比如1ms。,然後在中斷服務函式中對這個全域性做自增運算。這樣我們的時基就有了,接下來是啟動定時器函式,就是獲取當前timecount的值並儲存。然後就是觸發定時,假定定時值是40ms。每次迴圈中判斷,當前的timecount值減去啟動定時器函式時儲存的值大於等於40時候,就開始執行定時任務。大概就這麼乙個思路。

struct etimer ;

extern volatile unsigned int millisecond_counter;

uint32_t timer_milliseconds(

void)

void timer_elapsed_start(

struct etimer *t)

}uint32_t timer_elapsed_time(

struct etimer *t)

return delta;

}bool timer_elapsed_milliseconds(

struct etimer *t,

uint32_t milliseconds)

user.c檔案,我這麼用的 當然你也可以不加這層函式直接用timer_elapsed_start和timer_elapsed_milliseconds也是一樣的(嗯 會省一層呼叫)。

struct etimer silence_uarttimer;

static void uart_silence_reset(void)

static bool uart_silence_elapsed(uint32_t interval)

硬體定時器中斷,這裡我用的stm32,定時用的系統滴答 定時1ms,只有中斷服務函式,關於配置初始化自行解決吧。

nrf 軟體定時器

52810的軟體定時器建立在乙個rtc的基礎上,使用乙個rtc計時。rtc作為乙個發動機一直在跑。rtc以tick為單位進行中斷觸發,每增加乙個tick就來一次中斷,中斷到來之後就和佇列預期的tick值比較,如果一樣就執行時鐘handler。所有的時鐘都是按照壓入乙個鐘佇列內進行處理。當create...

設計軟體定時器

在mcu晶元內部,往往硬體定時器的數量是非常有限的,而實際工程中卻需要大量的定時器來輔助完成具體的功能,如果乙個函式占用乙個定時器,那麼顯然不夠用,怎麼辦?思路有2種 1 直接將開源嵌入式作業系統的軟體定時器搬來使用 2 自己設計軟體定時器 這裡我只介紹第二種方法,我們知道,硬體定時器是通過對系統時...

簡單軟體定時器

軟體定時器 在嵌入式開發中,定時器是及其常見的,但考慮到晶元外設資源有限,可以自己寫乙個軟體定時器,應用於對計時不是太嚴格的場合,比如led的閃爍,定時處理某一任務等等。該軟體定時器的原理是基於滴答系統時鐘中斷,在中斷中獲得時間基,該時間基可由使用者自由設定。另外有兩種方式可以實現軟體定時處理功能,...