[技术问答] 一个延迟-秒-函数该怎么写

[复制链接]
685|5
 楼主| flycamelaaa 发表于 2020-12-10 11:26 | 显示全部楼层 |阅读模式

问题:1:这两个while的延迟时间为什么差别这么大???第一个(注释掉的部分)差不多3秒多,也能接受。第二个整整10s多。
2:最想问还是__NOP运行一次多长时间???它应该跟系统时钟设置有关吧?我该怎设置,使用NOP来做一个更准确的延迟???

void delay_s(uint32_t second)
{
        uint32_t i;
        uint32_t j = second*1000;
        for(i=0;i<second;i++)
        {
//                while(j>0)
//                {
//                 CLK_SysTickDelay(1000);
//                        j--;
//                }
                for(j=0;j<second*1000;j++)
                         CLK_SysTickDelay(1000);        

//                        
//        }
//        for(i=0;i<1000000*second;i++)
//        {
//                __NOP ;
//                __NOP ;
//        }
        }

谢谢,期待你的答复!!!!!!
gejigeji521 发表于 2020-12-10 20:51 | 显示全部楼层
如果有库函数,用库函数更方便。
jasontu 发表于 2020-12-11 08:06 | 显示全部楼层
你的代码多个了回圈。
NOP 一个CPU CLOCK但其它指令,用C写编译出来,指令不碉定。
2个方式。
1,用组语写延时。
2,用TIMER,或SYSTICK 的硬体作计时会比较准碉
zlf1208 发表于 2020-12-11 08:43 | 显示全部楼层
本帖最后由 zlf1208 于 2020-12-11 09:01 编辑

for(i=0;i<1000000*second;i++)
这条语句翻译成机器码,运行的时间远远大于二条NOP。

产生这样疑问的人非常多,其根本原因是我们的单片机教科书几乎不讲解汇编语言以及高级语言编译后是什么样的结果,使得初学者根本不明白CPU的运行过程
tianxj01 发表于 2020-12-11 09:27 | 显示全部楼层
用典型循环来做的延时,还要加上循环判断过程,所以你测试产生比较大的误差是正常的,你还没算上中断等其他可以打断延时函数的程序过程,如果算上这个,那误差就更大了。
想要比较精确的延时,其中一个是必须准确计算循环体判断语句的机器时间,再一个是用一个已经测量过比较准确的短延时,经过2次嵌套来调用,像类似delay_1mS()这样的来做,精度可以提高不少。
需要更高精度的,则可以直接在定时器上面做**,用定时器做一个精确延时,然后再多次循环嵌套。
磨砂 发表于 2021-1-7 21:42 | 显示全部楼层
while循环本来就是不准确的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

837

主题

4432

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部