在實時操作系統(RTOS)中,時間管理是核心功能之一。無論是任務調度、超時控制,還是周期性事件,延時和計時機制都扮演著至關重要的角色。Zephyr RTOS作為一個輕量級、模塊化的開源系統,提供了多種延時與計時實現方案,滿足不同應用場景的需求。那么,大家平時都是怎么在MCU程序中實現計時函數、實現延時的呢?
小編先來說說自己的做法,一般在裸機開發中,小編會利用systick中斷實現一個ms級中斷服務,然后利用這個函數做一些計時相關實現。那么,如果是RTOS的應用場景,那就開心許多了,我們可以直接利用RTOS自帶的一些時間函數來實現功能。
剛好小編最近正在做一個關于Zephyr的小項目,那么本期就給大家分享下如何在Zephyr實現相關操作。
方法一:使用內核NPI
#include#include voiddelay_and_print(void) { // 獲取當前系統tick(64位精度) int64_tstart_ticks =k_uptime_ticks(); printk("Start ticks: %lld ", start_ticks); // 延時500ms(線程安全,會觸發調度) k_msleep(500); // 獲取延時后的tick int64_tend_ticks =k_uptime_ticks(); printk("End ticks: %lld (Elapsed: %lld) ", end_ticks, end_ticks - start_ticks); }
方法二:忙等待
#include#include voidbusy_delay_print(void) { uint32_tstart =k_cycle_get_32(); printk("Start cycles: %u ", start); // 忙等待10ms(精確但占用CPU) k_busy_wait(10*1000);// 參數為微秒 uint32_tend =k_cycle_get_32(); printk("End cycles: %u (Delta: %u) ", end, end - start); }
API說明:

接下來是時間單位轉換,有時候我們并不想直接用ticks來表示時間,我們還是想要用時間單位來表示,例如ms,那我們來看看怎么進行tick to ms的轉換:
// Tick轉毫秒
uint64_tticks_to_ms(uint64_tticks){
return(ticks *1000) /sys_clock_hw_cycles_per_sec();
}
下面是一個實際應用示例:
voidperiodic_task(void)
{
while(1) {
int64_ttick =k_uptime_ticks();
printk("[%lld] Sensor sampling...
", tick);
// 固定頻率執行(不受任務執行時間影響)
k_msleep(100- (k_uptime_ticks() - tick));
}
}
K_THREAD_DEFINE(sensor_thread,512, periodic_task,NULL,NULL,NULL,7,0,0);
這樣一來我們實現了定時函數,可以根據具體需求選擇合適的方案,對于大多數應用場景,`k_msleep()` + `k_uptime_ticks()`的組合就能夠滿足我們的需求了,推薦大家多多使用。
延時與計時不僅僅是“等待”,它是實時系統穩定運行的基石。Zephyr RTOS通過內核tick、定時器API以及高精度時鐘機制,為開發者提供了靈活且高效的時間管理方案。理解這些實現原理,不僅能幫助我們編寫更可靠的代碼,還能在資源受限的嵌入式環境中實現最佳性能。
未來,隨著更多應用對低功耗和高精度的要求,Zephyr的時間管理機制將繼續演進,成為嵌入式開發的重要工具。
-
mcu
+關注
關注
147文章
18923瀏覽量
397972 -
函數
+關注
關注
3文章
4417瀏覽量
67499 -
RTOS
+關注
關注
25文章
866瀏覽量
122970 -
Zephyr
+關注
關注
0文章
58瀏覽量
6579
原文標題:在Zephyr RTOS中延時和計時函數的實現方案介紹
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
當RA MCU遇見Zephyr系列(3)——在Vs code中配置Zephyr集成開發環境
如何在RTOS SDK中將FRC1計時器附加到NMI的信息?
Zephyr與FreeRTOS實時性測試比較
STM32中精確延時函數的實現
嵌入式軟件中的延時函數
如何在Zephyr RTOS中實現延時和計時函數
評論