CC2530单片机精确延时的时间分析

article/2025/5/11 10:27:28

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,找出与这部分循环结构相对应的汇编代码。
初始值b的赋值
首先是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
2层for循环的指令总数

讨论

公式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");}
}

http://chatgpt.dhexx.cn/article/OA0vyItE.shtml

相关文章

嵌入式cc2530单片机ZigBee-流水灯的实验

嵌入式cc2530单片机ZigBee 单片机是一种集成电路芯片,包含中央处理器CPU、随机存储器RAM、只读存储器ROM、输入输出I/O接口、中断控制系统、定时/计数器和通信等多种功能部件 其针脚定义如下: 1.0 --P0、P1各8个针脚(1字节8位,…

快速学会CC2530单片机基础点灯

使用的软件是IAR 使用的板是经常提到的小黑板 上面四个灯分别是 D3 ---> P1_0 D4 ---> P1_1 D5 ---> P1_3 D6 ---> P1_4 #include <ioCC2530.h>//引用CC2530头文件 #define D3 P1_0 #define D4 P1_1 #define D5 P1_3 #define D6 P1_4//为了方便使用&…

CC2530单片机开发--串口

题目 源码下载链接https://download.csdn.net/download/czx20020728/85975522?spm1001.2014.3001.5503

【CC2530入门教程-06】CC2530的ADC工作原理与应用

【CC2530入门教程-06】CC2530的ADC工作原理与应用 【CC2530入门教程-05】CC2530的串行接口原理与应用 【CC2530入门教程-04】CC2530的定时/计数器原理与应用 【CC2530入门教程-03】CC2530的中断系统及外部中断应用 【CC2530入门教程-02】CC2530的通用I/O端口输入和输出控制…

【CC2530入门教程-01】CC2530微控制器开发入门基础

【CC2530入门教程-06】CC2530的ADC工作原理与应用 【CC2530入门教程-05】CC2530的串行接口原理与应用 【CC2530入门教程-04】CC2530的定时/计数器原理与应用 【CC2530入门教程-03】CC2530的中断系统及外部中断应用 【CC2530入门教程-02】CC2530的通用I/O端口输入和输出控制…

CC2530概述(简单了解)

CC2530概述简单版 CC2530是由TI公司生产&#xff08;德州仪器&#xff09;用于 2.4Ghz IEEE 802.15.4、ZigBee 和RF4CE 的片上系统&#xff08;SOC&#xff09;&#xff0c;经济实惠功耗低。 CC2530F256 结合了ZigBee 协议栈&#xff08;Z-Stack&#xff09;。 什么是片上系统…

单片机CC2530学习笔记

文章目录&#xff1a; 一&#xff1a;与或操作 二&#xff1a;CC2530的通用 IO及相关寄存器 1.与通用I/O端口相关常用的4个寄存器 2.PxSEL寄存器与PxDIR寄存器 3.P0INP寄存器与P1INP寄存器与P2INP 三&#xff1a;按键的工作原理与程序设计思路 四&#xff1a;CC2530的中…

c语言长空格的代码是什么,c语言中表示空格的是什么代码?

分析如下&#xff1a; 不是所有字符都需要转义的&#xff0c;空格直接就敲空格&#xff0c;或者使用ASCII码值赋值为32。 空格没有转义字符。合法转义字符如下&#xff1a; \a 响铃(BEL) 、\b 退格(BS)、\f 换页(FF)、\n 换行(LF)、\r 回车(CR)、\t 水平制表(HT)、\v 垂直制表(…

读入带空格的字符串 C语言

如何输出带空格的字符串 C语言默认是遇到空格&#xff0c;即代表输入的字符串的结束处 那么该如何读入带空格的字符串呢&#xff1f; scanf("%[^\n]", buf); //回车结束 这样的话就可以读入空格啦 表达式的意思为遇到’\n’才读取结束 请看演示代码 #include <…

C语言去除一段字符串中的空格

函数说明 将字符串中的所有空格都去掉。该函数简单但实用性强&#xff0c;可以作为字符串过滤器使用&#xff0c;随便改一下就可以实现去掉任意字符的功能&#xff0c;建议程序员的代码库里可以收藏一段该类型代码&#xff0c;用取方便。 函数实现 #include <stdio.h>…

C语言删除字符串中的空格

实现思路&#xff1a;分别定义2个指针&#xff0c;一个快指针s1, 一个慢指针s2,s1负责快速移动&#xff0c;遍历我们的的字符串&#xff0c;遇到空格就跳过&#xff0c;不是空格&#xff0c;就赋值给我们的s2,我们s2再往后移动&#xff0c;这样就把空格挤掉了。 最后别忘记s2 …

c语言空格符 r t,c语言中、\t \r \n 和空格什么意思

具体意思&#xff1a; 都是转义字符&#xff0c;空格就是单纯的空格&#xff0c;输入时可以输入空格 \t 跳格 \r 回车 \n 换行 \\ 反斜杠 \a 警告 \b 退格 \f 换页 \v 垂直跳格 \ddd ddd 是 1、2 或 3 位八进制数字。 转义字符串(E…

c++之静态数据成员与静态成员函数

什么是静态数据成员&#xff1f; 数据成员我们之前学过&#xff0c;是对象的属性。 同一个类&#xff0c;不同的对象&#xff0c;可能拥有不同的属性 例如一个车行&#xff0c;不同的车有不同的颜色&#xff0c;不同的耗油量。。。等等属性 但是当我们统计一个公有的数据&am…

类的静态数据成员和静态成员函数

一.什么是类的静态成员 静态成员变量和全局变量都存储在全局/静态区,它们都是在程序编译时创建,直到编译结束才被收回.所以全局变量和静态成员变量的功能差不多,只是创建的方式不同,类的静态成员创建在类中,全局变量创建在程序开头. 二.为什么要用类的静态成员而不用全局变量 …

37.【C/C++ 静态数据成员和静态成员函数 (超详解)】

静态函数 &#xff08;一&#xff09;、什么是静态函数?1.static变量2.static函数&#xff08;也叫内部函数&#xff09; &#xff08;二&#xff09;、静态数据成员1.空间分配和释放2.静态数据成员初始化效果展示: 3.静态数据成员的访问代码展示:效果展示: (四)、静态成员函数…

[C++] 类的静态成员 (静态数据成员 和 静态成员函数)

目录 一、声明静态成员&#xff1a; 二、定义静态成员&#xff1a; 三、使用类的静态成员&#xff1a; 四、静态成员类内初始化&#xff1a; 五、静态成员与普通成员的区别&#xff1a; 六、案例代码&#xff1a; 类内的静态成员包括&#xff1a; 静态数据成员 和 静态成…

对静态数据成员进行初始化

1.如果希望同类的各个对象中的数据成员的值是一样的&#xff0c;就可以把它定义为静态数据成员。 2.静态数据成员是在编译时预留空间的&#xff0c;在程序开始运行时被分配空间&#xff0c;到程序结束才释放空间。 3.静态数据成员可以初始化&#xff0c;但只能在类体外进行初…

静态数据成员与非静态数据成员的区别

数据成员&#xff1a; 静态数据成员是类的一部分&#xff0c;为类的所有实例共享(静态区)&#xff1b; 非静态数据成员&#xff0c;类的每个实例都有一份拷贝(动态区)。 静态数据成员的访问&#xff1a; 静态数据成员是类的一部分&#xff0c;在产生任何实例之前已经存在&a…

静态数据成员和静态数据成员函数

c中的static静态数据成员和静态成员函数应该是让大家比较头疼的东西&#xff0c;好像也是找工作公司面试中常常问到的东西。我自己也深有体会&#xff0c;在学习c的过程中&#xff0c;总感觉static很烦人&#xff0c;但是又是一个必须懂的东西&#xff0c;所以今天就对静态数据…

静态数据成员(C++)

目录 一、静态数据成员 1.1、定义 1.2、声明 1.3、初始化 1.4、普通访问 1.5、对象访问 二、静态成员函数 一、静态数据成员 1.1、定义 我们都知道&#xff0c;类是对具有相同属性和相同行为的一组对象的描述。 有时侯&#xff0c;我们希望每定义一个对象&#xff0c…