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

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