0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在Zephyr RTOS中实现延时和计时函数

恩智浦MCU加油站 来源:恩智浦MCU加油站 2025-12-26 10:32 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在实时操作系统(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说明:

d4612c2e-dbab-11f0-8c8f-92fbcf53809c.png

接下来是时间单位转换,有时候我们并不想直接用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
    mcu
    +关注

    关注

    147

    文章

    19232

    浏览量

    405176
  • 函数
    +关注

    关注

    3

    文章

    4423

    浏览量

    68034
  • RTOS
    +关注

    关注

    25

    文章

    871

    浏览量

    123272
  • Zephyr
    +关注

    关注

    1

    文章

    62

    浏览量

    6643

原文标题:在Zephyr RTOS中延时和计时函数的实现方案介绍

文章出处:【微信号:NXP_SMART_HARDWARE,微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【瑞萨RA × Zephyr评测】Zephyr RTOS保姆级环境构建与编译下载踩坑版

    笔者介绍一下Zephyr RTOS 保姆级环境构建与编译下载
    的头像 发表于 01-10 10:03 1w次阅读
    【瑞萨RA × <b class='flag-5'>Zephyr</b>评测】<b class='flag-5'>Zephyr</b> <b class='flag-5'>RTOS</b>保姆级环境构建与编译下载踩坑版

    保姆级教程 | i.MX 93开发板适配Zephyr RTOS全解析

    对于嵌入式RTOS选型、工业级产品开发的团队而言,飞凌嵌入式OK-MX9352-C开发板+Zephyr RTOS是兼顾开发效率、系统安全与硬件可靠性的优选方案。
    的头像 发表于 04-28 08:03 1.1w次阅读
    保姆级教程 | i.MX 93开发板适配<b class='flag-5'>Zephyr</b> <b class='flag-5'>RTOS</b>全解析

    何在RTOS SDK中将FRC1计时器附加到NMI的信息?

    我一直在寻找有关如何在 RTOS SDK 中将 FRC1 计时器附加到 NMI 的信息。我已经找到了 NON-OS SDK 所需的内容,但我找不到 RTOS SDK 的 NON-OS
    发表于 07-10 08:32

    UCOS延时函数怎么协调?

    我是UCOS初学者,以前也没有学过任何RTOS,望大神说的仔细些。我所理解的UCOS任务调度都是在延时函数实现的,假设我定义了三个
    发表于 04-07 22:13

    在MCU编程STM32延时函数如何去实现

    【STM32笔记】[sub]STM32 延时函数实现在MCU编程,微秒延时和毫秒延时使用最为
    发表于 08-24 07:55

    何在IAR实现printf函数功能?

    何在IAR实现printf函数功能?
    发表于 12-01 06:29

    Zephyr与FreeRTOS实时性测试比较

    时间是其它指标的基础,因此以任务切换时间为例,分析两个系统在实现上的差异。目前Zephyr任务切换时间为6.9微秒,FreeRTOS为2.2微秒。分析比较代码后得出,Zephyr计时
    发表于 08-19 16:12

    RTOS操作系统HOOK函数有什么用途?

    在很多操作系统,都存在这样一类API(函数接口):HOOK函数,也叫钩子函数。 比如:Windows桌面系统、µC/OS、 FreeRTOS等RT
    的头像 发表于 03-29 11:28 2566次阅读
    <b class='flag-5'>RTOS</b>操作系统<b class='flag-5'>中</b>HOOK<b class='flag-5'>函数</b>有什么用途?

    STM32精确延时函数实现

    在与传感器或者模块的总线进行通信的时候,常常需要使用到精确延时,一般我们会封装几个常用延时函数,下面我们以STM32F103芯片为例,详细介绍一下STM32下一种精确延时
    发表于 11-24 18:51 12次下载
    STM32<b class='flag-5'>中</b>精确<b class='flag-5'>延时</b><b class='flag-5'>函数</b>的<b class='flag-5'>实现</b>

    嵌入式软件延时函数

    延时函数是嵌入式软件开发必不可少的功能函数,在每个工程里都能找到它的踪影。虽然看起来不起眼,但在有些时序控制的场合,使用了一点点delay,往往能解决大问题。下面描述一下delay
    发表于 11-24 19:21 19次下载
    嵌入式软件<b class='flag-5'>中</b>的<b class='flag-5'>延时</b><b class='flag-5'>函数</b>

    Zephyr RTOS和HC-SR04超声波传感器开源

    电子发烧友网站提供《Zephyr RTOS和HC-SR04超声波传感器开源.zip》资料免费下载
    发表于 06-20 09:44 5次下载
    <b class='flag-5'>Zephyr</b> <b class='flag-5'>RTOS</b>和HC-SR04超声波传感器开源

    使用Zephyr RTOS的碳漫游者

    电子发烧友网站提供《使用Zephyr RTOS的碳漫游者.zip》资料免费下载
    发表于 06-28 14:54 4次下载
    使用<b class='flag-5'>Zephyr</b> <b class='flag-5'>RTOS</b>的碳漫游者

    深入解析Zephyr RTOS的技术细节

    Zephyr OS在嵌入式开发的知名度逐渐增加,新的微控制器和开发板都支持Zephyr。本文将深入讨论Zephyr RTOS的技术细节。
    的头像 发表于 10-22 16:47 4898次阅读
    深入解析<b class='flag-5'>Zephyr</b> <b class='flag-5'>RTOS</b>的技术细节

    详解RTOS的Hook函数

    Hook函数RTOS的一个关键特性,通过该函数,用户可以增强对任务管理的控制,定义系统行为。
    的头像 发表于 03-24 16:14 1239次阅读

    IAR平台现已提供对Zephyr RTOS的量产级支持

    IAR宣布,其嵌入式开发平台正式推出对Zephyr RTOS的量产级支持。该支持自IAR的Arm开发工具链v9.70起全面提供。
    的头像 发表于 07-09 15:43 837次阅读