軟體定時器和分時復用的實現

2021-07-30 08:19:48 字數 1359 閱讀 4227

在微控制器程式設計中,最主要的是掌握微控制器工作的時間節拍,最大限度地利用cpu資源,下面提供一種基於基準定時器進行軟體定時、任務執行採用分時復用的方法,規定每個任務執行的時間,執行時間到後切換下一任務。

u16 timer_count = 0,timer_count_overflow = 0;

u16 this_time = 0,last_time = 0,time_overflow = 0;

#define timer_period 60000

#define outofrunningtime(time) (timer_period*timer_count_overflow+this_time-last_time >= time)

#define time_ms(x) (1*x)

#define time_s(x) (1000*x)

#define total_task 3 //定義任務總數

enum ;

void 26 interrupt pit0(void) //中斷定時器,1ms進入一次

}static u8 task1(void)

}static u8 task2(void)

}static u8 task3(void)

}u8 task_process(u8 task)

return next_task;

}u8 current_task = task1;

void main(void)

}

**中定義了乙個時基為1ms的中斷定時器,用timer_count作為自由計數值,計數上限為timer_period,到達上限後將timer_count清零,同時統計一次溢位次數timer_count_overflow,溢位次數自由計數,直到溢位後清零,進入下一輪迴。

main函式執行的時候進入task_process函式,同時傳遞進入當前需要執行的任務號,首次執行的時候傳遞進去的任務號是task1,從task1()開始執行,下面對task1()進行分析。

執行任務函式的時候先記錄當前timer_count的值,將溢位次數timer_count_overflow清零,然後一直執行for迴圈中的do_some_thing(),同時記錄和檢測當前timer_count的值,根據當前timer_count值和進入任務時的timer_count比較,如果時間到達我們需要任務執行的時間,則跳出for迴圈,同時返回下次要執行的任務號,在main函式中根據返回的任務號進入下一任務的執行。

**中實現的是基本的軟體架構,並沒有具體程式執行的功能**,移植的時候只要使用微控制器中的乙個定時器,不斷產生1ms的定時中斷即可。

nrf 軟體定時器

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

設計軟體定時器

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

簡單軟體定時器

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