ustime写出了bug

最近,写了一个ustime函数,不小心搞出了一个bug, 查了一下,修复了。

然后,我想,这函数应该很常见啊,于是在开源代码中搜了一下,果然有,来看看别人咋写:

/* Return the UNIX time in microseconds */
long long ustime(void) {
    struct timeval tv;
    long long ust;
 
    gettimeofday(&tv, NULL);
    ust = ((long long)tv.tv_sec)*1000000;
    ust += tv.tv_usec;
    return ust;
}
 
/* Return the UNIX time in milliseconds */
mstime_t mstime(void) {
    return ustime()/1000;
}

经测试, OK, 这样清晰多了。

### 实现微秒级时间获取与延时 对于STM32系列单片机而言,在使用标准库进行开发的过程中,如果希望获得更高精度的时间戳或是执行微秒级别的延迟操作,则可以考虑采用DWT(Data Watchpoint and Trace)模块来达成目标。该方案不仅能够提供较为精确的微秒级别计时能力,而且不会干扰到其他正在使用的定时资源。 #### DWT寄存器用于微秒级时间测量 ARM Cortex-M内核集成了调试支持单元DSB、ITM、TPIU以及DWT等组件,其中DWT提供了循环计数器CYCCNT,它记录了CPU指令周期的数量变化情况。通过读取这个特殊寄存器的内容并乘以系统频率对应的系数即可转换成实际经过的时间长度[^3]。 ```c #include "stm32f4xx.h" // 初始化DWT和Cyccnt static void init_dwt(void){ CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; } uint32_t get_us_time(void){ uint32_t usTime = 0; // 计算每滴答代表多少纳秒 float ticks_per_ns = SystemCoreClock / 1e9; // 获取当前滴答次数 usTime = DWT->CYCCNT * ticks_per_ns * 1000; return usTime; } ``` 上述代码展示了初始化DWT模块的过程,并定义了一个`get_us_time()`函数用来返回自程序启动以来流逝掉的大约微秒数量。需要注意的是这里假设SystemCoreClock已经按照具体应用场景配置好了正确的值。 #### 构建高精度微秒延时函数 除了直接查询时间之外,还可以构建专门针对短时间段等待而优化过的延时子程序: ```c void delay_us(uint32_t us){ uint32_t start_tick = DWT- start_tick) < (us * (SystemCoreClock / 1000000))); } ``` 此版本的`delay_us()`接受一个参数表示期望停留多长时间(单位为μs)。内部逻辑则是持续监测CYCCNT的变化直到达到预期差值为止。这种方法相比传统基于NOP填充的方式更加稳定可靠,同时也避免了频繁重启SysTick所带来的潜在风险[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值