小情绪36 2022-02-23 21:22 采纳率: 100%
浏览 361
已结题

do-while延时函数求解延时时长

在我看单片机相关延时问题看到一段代码,想不明白这个延时时间如何算出来的。
给出的代码如下:

void delay() 
{                         
    unsigned char i, j, k;         //延时200ms               @11.0592MHz
    _nop_();
    _nop_();
    i = 9;
    j = 104;
    k = 139;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

我的想法是先执行最中间的 while (--k); 语句,执行139次之后,k变为0退出该循环;
接下来执行外面的do while循环,又执行255104次;
再执行最外面的do while 循环,执行255
2559次;
次数相加乘以机器周期,即
(139+255
104+2552559+6)*12/11059200=0.664s
和0.2s差十万八千里。
难道k、j变成0之后再减1的值不是255?
我又试了下127比较接近答案。可是为什么呢?我以为的是unsigned char 的值域是0~255。
还是说我的思路根本就是错的呢?
恳请各位的的解答。谢谢!

  • 写回答

2条回答 默认 最新

  • qllaoda 2022-02-24 10:19
    关注

    这种方式没法精确计算延时
    首先C语言在不同的优化模式下,最终生成的机器代码是不一样的,即使你要计算,也要根据反汇编代码计算。
    然后,现在的单片机很多都带流水线,已经不是以前那种12个时钟一个指令周期了,但也不会完像现在厂家宣传的那样一个时钟一个指令周期,这个取决于具体的指令顺序。比如正常顺序执行的时候,可能就是执行一条指令的时候,下一条就已经预先取好,基本是一个时钟一个指令周期,但假如出现了跳转,流水线就乱了,又要重新取。C语言的循环里就正好有这种跳转。
    再次,假如系统有中断,那就更没法计算了。
    如果你想用这种方式进行延时,建议先写个大概框架,然后测试一下延时与参数的关系,然后做一下调整。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月12日
  • 已采纳回答 3月12日
  • 修改了问题 2月23日
  • 创建了问题 2月23日

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加