Zephyr下计算耗时

Zephyr下有两个时间特点:

  1. 32位硬件时钟是一个高精度计数器,可以跟踪若干个周期时间,但这个周期不能指定单位。一个周期的持续时间取决于内核使用的电路板硬件,通常以纳秒为单位进行测量。
  2. 64位系统时钟是一个计数器,用于跟踪自内核初始化以来已经过的tick数。tick的持续时间是可配置的,通常范围从1毫秒到100毫秒,同时它也可以获取32位的
     

获取32位的硬件时钟函数是:

uint32_t k_cycle_get_32();

获取64/32位系统时钟

uint64_t k_uptime_get();
uint32_t k_uptime_get_32()

计算耗时:

高精度

uint32_t start_time = k_cycle_get_32();
/*
    run core
*/
uint32_t stop_time = k_cycle_get_32();
uint32_t time_ = stop_time - start_time;

系统时钟

uint64_t start_time = k_uptime_get();
/*
run core...
*/

uint64_t stop_time = k_uptime_delta(&start_time);

注意高精度是纳秒,系统时钟是毫秒

### 关于RTOS中时间转换接口的使用 #### 时间单位与表示方式 在实时操作系统(RTOS)环境中,时间管理是一个核心功能。不同RTOS平台提供了多种API用于处理时间相关的操作,包括但不限于延时、定时器设置以及时间戳获取等功能。 对于Zephyr而言,在`<kernel.h>`头文件下定义了一系列宏和函数来帮助开发人员完成基本的时间计算任务[^3]。例如: - `k_msleep(unsigned int ms)`:使当前线程休眠指定毫秒数。 - `k_uptime_get()`:返回自系统启动以来经过的时间(以微秒为单位)。 - `k_ticks_to_ms_floor64(int64_t ticks)` 和 `k_ms_to_ticks_ceil32(uint32_t ms)` :这两个函数可以用来相互转换tick计数值与时长之间的关系。 为了更好地理解和应用这些时间转换接口,下面给出一段简单的C语言代码片段作为示范,展示了如何利用上述提到的功能来进行时间测量及延迟控制。 ```c #include <zephyr/kernel.h> #include <stdio.h> void time_conversion_example(void){ uint64_t start_time, end_time; s64_t elapsed_time; /* 获取当前系统的运行时间 */ start_time = k_uptime_get(); // 执行一些耗时的操作... /* 再次读取系统时间 */ end_time = k_uptime_get(); /* 计算两次采样之间所经历的实际时间差 */ elapsed_time = (end_time - start_time); printf("Elapsed Time: %lld microseconds\n", elapsed_time); /* 将这段时间转化为ms并让CPU等待一段时间 */ unsigned int sleep_duration_in_ms = k_ticks_to_ms_floor64(elapsed_time / 1000); k_msleep(sleep_duration_in_ms); } ``` 这段代码首先记录了一段时间间隔内的起始时间和结束时间,并通过减法运算得到两者间的差异;接着将此差异值由微秒级转成毫秒级别再调用相应的睡眠函数使得处理器暂停执行直到满足设定好的条件为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

17岁boy想当攻城狮

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值