CC2530单片机精确延时的时间分析
CC2530单片机精确延时的时间分析
- IAR 仿真时如何得知运行周期
- for循环的时间计算
- 使用反汇编工具计算延时时间
- 验证
- 讨论
- CC2530与普通8051单片机时钟的不同
IAR 仿真时如何得知运行周期
关于这个问题,网上有很多好文章,讲得很清楚。IAR的操作很简单,我在这里给出链接。
百度经验:《IAR 仿真时如何得知运行周期》
IAR官网:How to measure execution time with CYCLECOUNTER
for循环的时间计算
CC2530单片机延时,可以采用外设定时器进行硬件延时。也可以采用软件方式进行延时。
本文只讨论用2层for循环嵌套的软件延时方式,供大家参考,不对之处请指正!
例如:
void delay_us(void)
{unsigned char a,b;for(a=173;a>0;a--)for(b=143;b>0;b--) ;
}
使用反汇编工具计算延时时间
可用Keil C51中的反汇编工具计算延时时间,在反汇编窗口中可用源程序和汇编程序的混合代码或汇编代码显示目标应用程序。
- 首先来分析 1层for循环 ,
for(b=143;b>0;b--) ;
首先选择build taget,然后单击start/stop debug session按钮进入程序调试窗口,最后打开Disassembly window,找出与这部分循环结构相对应的汇编代码。
首先是for循环中表达式1,对循环变量的赋值,这个需要5个指令周期。
然后是循环判断表达式,这个需要7个指令周期。
最后是循环增量表达式,这个需要2个指令周期。
- 1层for循环的时间计算
分析for循环的过程我们可以发现:for循环中表达式1,对循环变量的赋值,只执行1次;
循环判断表达式(7个指令周期)、增量表达式(2个指令周期),两者一起执行了9倍的循环次数(9个指令周期);
最后,还要执行1次循环判断表达式(跳出该层for循环)。
结论:1层for循环了b0次,其指令总数为:(5+9b0+7)
再来分析2层for循环
内层for循环作为外层for循环的循环体。也就是说,假定外层循环a0次,那么,内层循环体执行的指令总数为(5+9b0+7)× a0
那么,整个2层for循环的指令总数为:外层循环的1次循环变量赋值、外层循环判断× a0次、内层循环体× a0次、外层循环增量表达式× a0次、最后1次的循环判断(7个指令周期)。
所以,2层for循环的指令总数为:5+(5+9b0+7)× a0+9a0+7
最后,延时函数的调用是6个指令周期,返回是4个指令周期,所以调用延时函数的指令总数为:5+(5+9b0+7)× a0+9a0+7+10
展开简化为公式1:21 a0+9 a0 b0+22
验证
void delay_us(void)
{unsigned char a,b;for(a=173;a>0;a--)for(b=143;b>0;b--) ;
}
此延时函数,a0=173,b0=143,代入公式1得:226306
讨论
公式1本质上是1个二元二次方程。我们可以根据所需要的指令个数,编程实现求解方程,得到所需要的a0和b0的值。从而实现精确延时。
CC2530与普通8051单片机时钟的不同
CC2530的每个指令是一个时钟,而标准的8051的指令周期是12个时钟。
若选用32MHZ的时钟频率,那么时钟周期是1/32 us,一个指令也就是1/32us.
ZStack中大多使用的延时函数如下:
void Delay_us(uint16 value){while (value--){asm("NOP"); //一个指令周期占用一个时钟周期asm("NOP");asm("NOP");}
}
CC2530单片机精确延时的时间分析相关推荐
- 51单片机c语言延时计算软件,51单片机精确延时程序大集合+初值计算工具
在论坛上看到不少不错的延时程序,整理如下共同分享: 精确延时计算公式: 延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+5 ;延时5秒左右 DELAY5S:PUSH 04H;2个 ...
- 单片机软件延时的时间计算
点亮LED以后,如果我们想实现LED间隔性的亮灭,我们又该怎么办呢?这里我们就需要使用单片机进行延时.延时的方法有两种,一个是使用软件延时,这个不精确,但能满足简单的需要:二是使用单片机内部的定时器, ...
- 【蓝桥杯】单片机精确延时——软件延时
在编写单片机程序经常会用到延时,做到精确延时的方法有两种:软件延时(采用循环体实现)和硬件延时(定时器/计数器实现). 补充_nop_()函数 C语言中没有_nop_()函数,该函数是在51单片机中用 ...
- 51单片机精确延时设计
在我们使用单片机的时候,很多情况下需要用到精确的延时.比如在跟DS18B20进行通讯的时候需要遵循严格的时序,这就需要我们严格把控程序执行的时间. 一般我们都是通过执行空语句的方式来使程序延时.这种方 ...
- 单片机精确延时几种方式
目前在单片机中有不少延时的方法: 1.使用循环函数延时: void delay1ms(void) //误差 0us,延时1ms { unsigned ch ...
- 89C52单片机定时器精确延时
16位寄存器分为高八位(TH0)和低八位(TLO),取值范围0-65535 也就是低八位255,高八位255(255*255=65535) 问题:89C52开发板 晶振11.0592MHZ 用定 ...
- 呵,你会51单片机的精确延时吗?
点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 前言 对于某些对时间精度要求较高的程序,用 c 写延时显得有些力不从心,故需用到汇编 ...
- 8051系列单片机软件精确延时研究(二)
续前篇 8051单片机软件精确延时研究(一) 由前篇可知,在DelayX10us()函数中用for循环延时会产生10个机器周期的固定误差,其中X传值.调用函数.子函数返回共5个机器周期,这是只要调用带 ...
- 51单片机几种精确延时(包含自动适应主时钟)
实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时:另一种是软件延时,这种方法主要采用循环体进行. 今天主要介绍软件延时,关于硬件延时,之 ...
- 51单片机的几种精确延时
实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时:另一种是软件延时,这种方法主要采用循环体进行. 今天主要介绍软件延时,关于硬件延时,之 ...
最新文章
- kubernetes资源对象之security context
- html语言星号,如何使HTML代码,输入的东西星号显示出来
- Drupal7主题初步设置篇-Ubuntu 14.04 LTS
- 精易模块保存html文档,精易模块6.60源码
- python logging简单使用
- reply-code=404, reply-text=NOT_FOUND - no exchange
- MYSQL的两种存储引擎区别
- 装ubuntu_系统安装_win10下安装Ubuntu后,启动时无win10选项的解决办法。
- 在6.1的PPC上做的cab包里面的html文件,安装后在手机上显示乱码
- 苹果手机备忘录html转pdf,苹果手机自带的扫描仪,一键便能转成PDF文件,你不会才知道吧...
- 饥荒中的聊天表情(Emoticons In Don‘t Starve Together)
- 2013年9月中秋云南昆明、丽江、泸沽湖、香格里拉、梅里雪山、虎跳峡之旅
- 台式计算机使用寿命,惠普台式电脑怎么样(深度评测其质量及使用寿命)
- Linux系统有哪些?盘点常用的 8 个Linux系统!
- 崇阳职校计算机基础知识试题及答案,崇阳职校2014年春期末考试.doc
- win10PC上安装deepin深度Linux系统简易教程
- Think Server RD350X 板载RAID设置
- win7安装python教程视频_二级Python视频教学教程_因材考试网 - Win7之家
- 为什么荷兰买家更喜欢用iDEAL付款?
- 基于DNN模型的智能选股策略
热门文章
- [渝粤教育] 北京理工大学 工程热力学 参考 资料
- Codeforces Round #829 (Div. 2) C1. Make Nonzero Sum (easy version) 解题报告
- Linux 火狐无法播放视频
- Ubuntu类似与xshell 和crt的软件 pac- Ásbrú Connection Manager
- 平时常见的视频文件格式有哪些呢?
- vue.js 菜鸟学习
- c语言全局变量(c语言全局变量怎么定义)
- 关于限流电阻太大,无法通信的问题
- stream流转toMap的使用以及Key重复的解决
- 有PMP证书后,如何继续成长?