整理STC延时函数时遇到的玄学问题
void Delay
{
unsigned char i, j;
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
} void Delay
{
unsigned char i, j;
i = 11;
j = 190;
while(i--)
{
while (--j);
}
}
以上两段代码,第一段为STCISP提供的1ms延时函数,第二段为改编版。按照个人对C语言的理解,这两种写法所得到的结果应该是一致的,最起码在Dev-C++上以下两端代码输出结果相同,均为2739:
int main(int argc, char *argv[])
{
unsigned char i, j;
int num = 0;
i = 11;
j = 190;
while(i--)
{
while (--j)
{
num++;
}
}
printf("num=%d\n",num);
return 0;
} int main(int argc, char *argv[])
{
unsigned char i, j;
int num = 0;
i = 11;
j = 190;
do
{
while (--j)
{
num++;
}
} while (--i);
printf("num=%d\n",num);
return 0;
}
但开头提到的两段代码,在STC15F104(11.0592M)单片机上跑起来其延时结果却截然不同。实测在预设延时500ms时(即重复运行上述函数500次),第一段代码比较符合实际,第二段要比第一段要慢一倍左右,即将第二段代码中的11改为6后可以得到大体相同的延时结果。
造成这种现象的原因,到现在也没搞清楚,我发表在开源电子网的提问贴截止到目前也没有收到合理的解释。我不打算再耗下去,只能强行解释一波了:
造成延时结果不同的原因是单片机在执行 while()...; 和 do...while(); 时的效率不同。
这解释很有道理,因为在 while()...; 和 do...while(); 在汇编代码中的长度的确相差一倍左右。但仍不能很好解释延时结果相差之大。因为无论是 while()...; 和 do...while(); ,在延时函数中仅仅执行了11次而已,真正起决定性作用的应该是中间那段 while (--j); ,在如此大基数的循环下, while()...; 和 do...while(); 相差的那点时间应该显得微不足道才对啊。
算了,这件事告一段落了,不打算再在这上面浪费时间了。下面附上 while()...; 和 do...while(); 的汇编代码。代码来源于网络,其实我也不懂。
/**** while 语句 pseudo-code ********/
while ( condition )
{
body of loop;
}
/****while 语句 assembly language *******/
while:
; code to set FLAGS based on condition
jxx endwhile
; body of loop
jmp while
endwhile:
/****while 语句 assembly language (end) ***/ /**** Do while 语句 pseudo-code ********/
do
{
body of loop;
}while ( condition )
/****Do while 语句 assembly language *******/
do_while:
; body of loop
; code to set FLAGS based on condition
jxx do_while
/****Do while 语句 assembly language (end) ***/
整理STC延时函数时遇到的玄学问题的更多相关文章
- Linux内核使用毫秒延时函数
毫秒延时函数:mdelay() 微妙延时函数:ndelay() #ifndef mdelay #define mdelay(n) (/ (__builtin_constant_p(n) &&a ...
- 5-3 Linux内核计时、延时函数与内核定时器【转】
转自:http://www.xuebuyuan.com/510594.html 5-3 Linux内核计时.延时函数与内核定时器 计时 1. 内核时钟 1.1 内核通过定时器(timer)中断来跟 ...
- STM32延时函数的四种方法
单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级delay_ms().本文基于STM32F207介绍4种不同方式实现的延时函数. 1.普通延时 这种延时方式应该是 ...
- 改进的延时函数Delay(使用MsgWaitForMultipleObjects等待消息或超时的到来)
解决上一节中延时函数占CPU使用率(达50%)的第二种方法是利用消息机制,通过API函数MsgWaitForMultipleObjects等待消息或超时的到来,从而避免使用循环检测使CPU占用率过高. ...
- msp430学习笔记-时钟及延时函数
引用:http://blog.chinaunix.net/uid-24343357-id-3271380.html MCLK默认时钟源是DCOCLK,SMCLK默认时钟源也是DCOCLK,DCOCLK ...
- 【CC2530强化实训02】普通延时函数实现按键的长按与短按
[CC2530强化实训02]普通延时函数实现按键的长按与短按 [题目要求] 用一个按键实现单击与双击的功能已经是很多嵌入式产品的常用手法.使用定时器的间隔定时来计算按键按下的时间是通用的做法 ...
- Android 如何通过代码模拟按钮点击 延时函数
View.performClick(); 比如: private Button mButton01; mButton01 = (Button)findViewById(R.id.myButt ...
- 延时函数出错,volatile一例
莫名其妙的错误.使用Systick做的延时. 初始化是这样的: //SysTick配置 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); if ...
- jquery 调用函数时加()和不加()的执行顺序是不同的
编写JQUERY(3.0,向下兼容3.0)代码当我们调用一个函数时可以不加括号,但加括号与不加括号是不同的.如下代码: $(function(){ a(b);//先打印a 再打印 b a(b());/ ...
随机推荐
- golang web框架 kratos中的日志框架
kratos是bilibili开源的一个web框架. 日志用法: logger.go package kratoslog import ( "flag" "github. ...
- 题解—P3000 [USACO10DEC]Cow Calisthenics G
做这题之前最好学会 "树形 \(dp\) 求树的直径"这一前缀知识(虽然我会但是我还是没想出来) 几乎想到要求直径这道题也没什么问题了(这不是废话吗,为什么题面里给了"直 ...
- docker配置cdn-容器内可以通过域名访问
添加docker的cdn配置 # 没有这个文件创建 vim /etc/docker/daemon.json 添加内容如下 { "dns":["8.8.8.8", ...
- mongoTemplate 条件查询
构建条件方法 @Override public Query getQuery(ReportParam param){ //check MeenoAssert.hasLength(param.getUu ...
- final、finally与finalize的区别?
一.final.finally与finalize的区别 final:final是一个修饰符,可以修饰类,方法和变量.final修饰类表示类不能被其它类继承,并且该类中的所有方法都会隐式的被final修 ...
- filter打包区分环境
项目目录结构: 父pom: <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...
- 回忆java输入输出流,走出误区
input read 将一个XXX读入(input)---从输入流中读取数据的下一个字节(code操作的).output write 将一个类型的数据写入此流(code操作的)---然后把XXX输出( ...
- golang中的三个点 ‘...‘ 的用法
'-' 其实是go的一种语法糖. 它的第一个用法主要是用于函数有多个不定参数的情况,可以接受多个不确定数量的参数. 第二个用法是slice可以被打散进行传递. 下面直接上例子: func test1( ...
- JAVA 之 每日一记 之 算法( 给你一个Excel表列序号,返回出它对应的数字 )
代码结果:(只想要代码的可以离开了,代码给你了,绝对能用的.想要思路的往下看.) class Solution { public int titleToNumber(String s) { int a ...
- Python之smtplib模块
工作中难免会出现自动发送电子邮件的需求,比如说做完自动化测试之后通过电子邮件的形式将结果反馈出来.Python中提供了标准库smtplib来解决这一问题,该模块定义了一个smtp客户端会话对象,能够将 ...