OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2082|回复: 1

延时函数一问

[复制链接]

11

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2017-8-28
在线时间
39 小时
发表于 2017-10-17 11:12:00 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 foodyou 于 2017-10-17 13:56 编辑

大家好,有这样的一段代码

[mw_shl_code=c,true]void delay_ms(uint32 delay)
{
    uint32 tick = timer_tick_count; // timer_tick_count每10毫秒1次中断,加1
    while(1)
    {
        if(timer_tick_count-tick>delay/10)

        break;
    }
}[/mw_shl_code]

因为对c语言学的不好,想问一下无符号位的正数除10会得出个什么结果?
一般用printf都是指明显示格式的,比如%u就只显示整数部分,但是因为里面牵涉条件判断
如果只比较整数部分,这样就会有误差是吧?那么表达式 delay/10 实际上在c里得出的是一个怎样的数值?
比如delay = 5, 能够精确延时5毫秒吗?
我自己理解是不行的,先不论 5/10 在c里的计算结果是一个整数0 还是一个确实的小数 0.5
还有那个  timer_tick_count 因为是根据系统设置每10毫秒增加1, 那么最小的时间精度应该在10毫秒
加上本身运行那些指令的时间,应该最少需要延时10毫秒以上才能有效吧?这样想对吗?
就像我不能用只有厘米刻度的尺子去量毫米一样
如果是这样的话,我需要增加精度是不是可以把中断配置得频密一些?
但是中断本身应该也消耗系统时间的吧,过分频密是否也会做成精度丢失?
因为基础学的不是很好,希望大神能讲解一下,哈,谢谢了~

最佳答案

查看完整内容[请看2#楼]

// timer_tick_count每10毫秒1次中断,加1, 精度就是10毫秒了,精确延时5ms?不存在的!。至于你后面说的指令运行的时间,这个确实有,最多也就是while(1)加一个if判断的时间这个误差微乎其微,至于中断的频率,你自己看数据手册上面有时钟分频的最大值,按照手册来,就不会有出乎意料的事
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

156

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1553
金钱
1553
注册时间
2016-11-21
在线时间
411 小时
发表于 2017-10-17 11:12:01 | 显示全部楼层
// timer_tick_count每10毫秒1次中断,加1,  精度就是10毫秒了,精确延时5ms?不存在的!。至于你后面说的指令运行的时间,这个确实有,最多也就是while(1)加一个if判断的时间这个误差微乎其微,至于中断的频率,你自己看数据手册上面有时钟分频的最大值,按照手册来,就不会有出乎意料的事
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 18:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表