原创 重新学习延时程序

2011-9-28 14:34 1946 11 16 分类: 软件与OS
在TI提供的CC2510参考代码中有一段延时程序写得挺不错,说它不错是困想不出作者是怎么想到这个方法的,如果也是经过对所有指令的执行时间合计才选择这样的,那许可以做得更精确,如果没有的话那是怎么想到的呢?这就是这段代码被反复玩味的原因。相信除我之还有许多CCXXX0的用户也有同样的困惑。

今天试着来分析下这段代码:
void halWait(BYTE wait)
{
   UINT32 largeWait;

   if(wait == 0)
   {return;}

   largeWait = ((UINT16) (wait << 7));
   largeWait += 59*wait;

   largeWait = (largeWait >> CLKSPD);  //CLKSPD代表时钟分频数,这里为0
   while(largeWait--); //行7

   return;
}
假定选择了26M外部晶振,而且主时钟不作分频,那么以上代码以26M的速度执行。行7以外的代码很容易看懂,却不能看出这计算largeWait的方法原理何在。为了弄清楚计算largeWait的方式背后的初衷,就只能查看IAR编译后的代码了。

0X026B:
MOV V4,V0 1
MOV V5,V1 1
MOV V6,V2 1
MOV V7,V3 1
MOV V0,V4 1

?L_ADD_X 
MOVX A,@DPTR 3-10
ADD A,@R0 2
MOV @R0,A 3
INC R0 2
INC DPTR 1
MOVX A,@DPTR 3-10
ADDC A,@R0 2
MOV @R0,A 3
INC R0 2
INC DPTR 1
MOVX A,@DPTR 3-10
ADDC A,@R0 2
MOV @R0,A 3
INC R0 2
INC DPTR 1
MOVX A,@DPTR 3-10
ADDC A,@R0 2
MOV @R0,A 3
RET 4


?L_EQ_X
MOVX A,@DPTR 3-10
XRL A,@R0  2
JNZ 0X006E  3
INC R0 2
INC DPTR 1
MOVX A,@DPTR 3-10
XRL A,@R0 2
JNZ 0X006E 3
INC R0 2
INC DPTR 1
MOVX A,@DPTR 3-10
XRL A,@R0 2
JNZ 0X006E 3
INC R0 2
INC DPTR 1
MOVX A,@DPTR 3-10
XRL A,@R0 2
0X006E:RET 4

这段代码分成3个部分,我们只关注时间开销,每行的最后一个个数字代表执行所需指令周期,以此来看行7运行一次所需的时间大概在120~176个时钟周期。从理论上计算每毫秒需要26000个时钟周期。下面再看延时时间和代码执行所耗周期、理论周期的对比。
第一列是时间(ms),第二列是最少消耗时钟周期数,第三列是最大消耗时钟周期数,第四列则取二、三列的平均值,第五列是理论上需要的时钟周期数。
20110928142421892.bmp

所以这段代码确实实现ms级的延时,最大误差为6.45%。好像大家伙看完都不怎么说话,可能是我之前的blog写得太简单了,往后我得发力写出新得。


Tome(emot)
2011年9月28日


文章评论5条评论)

登录后参与讨论

用户1660450 2011-10-8 14:29

了解了,呵呵 。

zigbee_904218839 2011-10-8 09:27

统计的部分是依据延时程序的指定数(执行所耗时钟周期)理论计算的。最后一列是最理想延时周期,这个CC2530的时钟是26MHZ有关。延时程序在CC2530执行,而以上统计代码(C#)是在PC上运行的,相当于一个计算器。

用户1660450 2011-9-30 09:46

统计数值的那部分程序和原先的延时程序之间是什么关系呢?并行的运行吗?还是串在原先的代码里。 之前做过一些LINUX驱动,用的延时一般都是内核定义的,底层的实现是用精确的指令来做的。

zigbee_904218839 2011-9-29 18:34

用c#写的,非常简单。用TC也可以。

用户1660450 2011-9-29 14:02

统计的那张表格是怎么得到的
相关推荐阅读
emot 2016-06-29 23:39
想在网上直播来讲讲zigbee,大家怎么看
近来发现zigbee热度不减,不才想把所了解的zigbee都跟大家分享,大致按照这个来做。请大家提些建议,是不是还有特别重要但我遗漏的。先来攒些人,人够了我们就开。 --------------...
emot 2015-09-24 07:06
BLE 空中升级谈(二)
BLE 空中升级谈   -- CC2541 的产品开发中OAD注意事项(续)   TI CC2541支持多个硬件,多个软件对它进行空中升级,可以有不同的组合,硬件有    ...
emot 2015-09-24 07:01
BLE 空中升级谈
BLE 空中升级谈   -- CC2541 的产品开发中OAD注意事项     现在的智能设备(可穿戴,智能家居,智能玩具等)是越来越多了,大公司的产品颜值高,功能强大而完备的应该说是比比皆是,这里...
emot 2015-05-19 10:27
寻找共事的朋友[深圳科技园 嵌入式软件 可穿戴]
岗位职责:嵌入式软件工程师 招聘人数:2 简历语言要求:中文 语言能力:英语 掌握程度:熟练 工作地点:深圳南山科技园 工作待遇:面谈   工作职责: 1. 与硬件工程师合作完...
emot 2014-05-06 08:41
CC2530的通信速率实测
首先要说的是这里的测试包括了zigbee与非zigbee两种情况,测试zigbee的通信速率建议使用TI协议栈ZSTACK-2.5.1A(swrc126.zip)中的TransmitApp来进行测...
emot 2014-01-17 18:08
XBee与 RBee ZigBee透明传输模块互传测试
XBee与 RBee ZigBee透明传输模块互传测试   本次测试的目标是为了初步探索ZigBee透明传输模块的传输速率峰值范围,同时也要检查不同公司模块之间的兼容性。测试的目标是 由美国Digi提...
我要评论
5
11
关闭 站长推荐上一条 /2 下一条