一種定時更新一組狀態的方法

2022-06-30 11:57:10 字數 1584 閱讀 4294

定時更新一組狀態一般用於狀態機執行的判定條件

實現機制為:

利用一硬體定時器作為時基,該時基選取適合狀態更新頻率,以該時基為累加週期,待累加週期變數值滿足各狀態更新週期時更新各狀態。

具體實現為:以各狀態更新週期為物件,對累加週期變數取餘,以結果0為依據更新各狀態,累加週期變數清0依據為各狀態更新週期的最小公倍數,不放任累加週期變數在其型別範圍邊界處自動清零,就是避免在範圍邊界處清0帶來的絕對誤差

示例

更新狀態      更新週期

status1       100ms

status2       200ms

status3       1s

status4       5s

status5       1min

status6       1hour

示意**如下

1

#define t_period 10 /* 10ms */23

4 unsigned char status1=0, status2=0, status3=0, status4=0, status5=0, status6=0;5

6 unsigned int timer10ms_count =0;7

8/*設定定時器週期 */9

set_timer_period(t_period);

1011

/*定時器計時到時的處理函式

*/12

void

timer_handler()

1320

21if(0 == (timer10ms_count %20

))22

2526

if(0 == (timer10ms_count %100

))27

3031

if(0 == (timer10ms_count %100*5

))32

3536

if(0 == (timer10ms_count %100*60

))37

4041

if(0 == (timer10ms_count %100*3600

))42

4546

/*待滿足最小公倍數歸零

*/47

if(3600 ==timer10ms_count)

4851 }

範圍邊界處清0帶來的絕對誤差:

上邊**中累加週期變數 timer10ms_count 型別為 unsigned int 其取值範圍 [0, 4_294_967_295], 取值範圍內1hour計時的次數:4,294,967,295 / 3,600 =1,193,046.47083...,timer10ms_count 計數到邊界時即 3,600 *1,193,046 =4,294,965,600距越界還有1695個計數,但這已不夠1hour計時數3600,所以待 timer10ms_count 計數到邊界值 4_294_967_295 處歸0,由於這1695個計數不滿足1hour計時數3600而造成絕對誤差。

學習是一種狀態

今天用了一整天的時間學習如何在github上搭建乙個靜態部落格,當集中精力做一件事情的時候才意識到自己的心聲。有時候要告訴自己 做一件事不一定要達到什麼結果,而應該把事情做完。太多的情況,我沒有把一件事情徹底做完,沒有好好捋順自己思路,從何失去了做事情好的心態,堅持到最後,把初始的目標牢記於心,把本...

生活是一種狀態

就在不久以前還曾信誓旦旦的告訴自己開始嶄新的生活。原來新的生活並不是那麼容易遇到的。就在這樣乙個無聊的星期天下午,不經意間聽著 就會勾起思緒,引發感概。我想此刻的我是不快樂的。孤身來到這個遙遠的地方,一切都是新的,一切都等著自己去適應,我想我也已經很努力的去融入去爭取去做自己該做的事情。很累。最重要...

對於一組整數的移動後輸出,一種新解法,以及陣列解法

乙個陣列a中存有n n 0 個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移m m 0 個位置,即將a中的資料由 a0 a1 an 1 變換為 an m an 1 a0 a1 an m 1 最後m個數迴圈移至最前面的m個位置 如果需要考慮程式移動資料的次數盡量少,要如何設計移動的方法?輸入...