munuc_w 发表于 2022-5-13 16:08 感谢您的回复! |
yzwzfyz 发表于 2022-5-14 16:59 感谢您的回复! |
1、程序最终会被编译成运行代码,也是汇编程序。 2、在非流水取指的系统中(如51系统),每条指令运行的时间是固定的,是可以事先计算出运行的总时间的。所以仿真器算出来比较准。 3、32系统是指令流水结构,当你执行当前指令时,下条指令就已被取出了,这样速度快。但前提是必须知道下条指令放在哪里。所以遇到跳转指令就不好流水了。也就是说,同样的批令,如果流水执行就快,不流水就慢,如果仿真器无法识别下条指令是不是流水执行,自然就算不准了。 4、1ms的子程序,调用1000次,不会是1S。因为每次调用要判断是否结束了,会多运行:调用指令1000次、判断指令1000次。而这些指令也是要占用时间的。 |
软件延时受程序执行情况及中断的影响,是不准的。 |
delay_1ms()里面 u16 j,k要加volatile属性。 |
Y_G_G 发表于 2022-5-12 22:00 感谢您的回复! |
菜菜的周某人 发表于 2022-5-12 21:28 目前为止,我还没有用过没有定时器的单片机 对于一个单片机程序,延时时间达1秒的,肯定是不能用软件延时的,难道你要让程序什么都不做,就在那干等1秒吗? 像18b20p 这种需要那么长时间的时序,肯定是要通标志位或者全局变量来处理时序的嘛 如果非得执着于软件延时1秒,那仿真肯定不行,就像说的一样,STM32有仿真,那别的单片机不一定能仿真 那肯定是示波器了 先随便写一个延时函数,大概是1mS左右,然后用示波器看一下这1mS的真正延时,不断的调整,直到最接近1mS然后把这个延时循环放到另一个循环中,参数调用就行了 假设,我已经调节好了一个1mS延时,它是这样的 i = 32; j = 40; do { while (--j); } while (--i); 那就把这循环放到另一个循环中,做成一个函数就可以了, 这样的函数调用参数会用到一定的时间,整个延时的时间可能会有误差,再通过微调就差不多了 void Delay_ms(unsigned int a) { unsigned char i, j; for(a;a>0;a--) { i = 32; j = 40; do { while (--j); } while (--i); } } |
Y_G_G 发表于 2022-5-12 19:53 感谢您的回复,我不是执着于1s的软件延时,我只是在想如果软件debug查看执行时间这一方法不准确,那么写IC的开发时序图(比如DS18B20的单总线时序、TFLCD等)的需要延时时,如何确定我的时序正确呢?当然在32内部有嘀嗒定时器可准确延迟,那么其他MCU呢,其他MCU可没有嘀嗒定时器。 |
stm32的ms级延迟用systick。 |
明明有稳定精确的延时,为什么要自己写呢? 哪怕是8051,1秒钟延时也是不会用软件延时的 有时间折腾这个,还不如玩几个DIY小东西 |
xuyaqi 发表于 2022-5-12 18:27 感谢您的回复,我还想问下,如果仿真会影响延时,那是KEIL软件的问题还是DAP仿真器通信的问题?以及如果这样说,那岂不是说用Keil软件debug查看执行时间这一方法根本行不通?或者说我想要得到粗略1s的延迟,除了用定时器外,就没有其他方法吗?因为我无法知道我的dealy函数执行时间是多少! |
还是用滴答定时器靠谱 |
仿真会影响延时,调试可以用让输出脚翻转,逻辑分析仪测试。 |