c语言里如何编写精确的微量延时

c语言里如何编写精确的微量延时

ID:15391818

大小:30.50 KB

页数:4页

时间:2018-08-03

c语言里如何编写精确的微量延时_第1页
c语言里如何编写精确的微量延时_第2页
c语言里如何编写精确的微量延时_第3页
c语言里如何编写精确的微量延时_第4页
资源描述:

《c语言里如何编写精确的微量延时》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、C语言里如何编写精确的微量延时广西民族大学物理与电子工程学院   白羽 2010-5-9众所周知,相比于其他编程语言,C语言在编写嵌入式编程中有着绝对的优势。但它总也有缺点的:它的时序性比较差,不容易编写精准的延时。而在编写嵌入系统驱动程序时,常常需要比较精确的软件延时,这使得C语言的“劣势”暴露了出来,一般都只能通过嵌入汇编的方式实现。例如,在1MHZ工作频率下需要延时10us,就需要嵌入10句“空操作”指令,显然在书写上比较难堪。本文提出一种简化书写的延时方案,使用带参数的宏构来造微小时间片,可

2、以实现完全精确的软件延时,大大方便了驱动程序及软件模拟通信协议的编写。说明:以下皆为ICCAVR平台下的讨论,对AVR系列所有型号的单片机皆有效。至于其他平台,可据此方案自行修改和移值。该方案的实现方法其实很简单:首先定义N个宏,分别调用1~ N个汇编“空操作”指令,如:#define  NOP_1     asm("nop")               //延时一个时钟周期#define  NOP_2     NOP_1;  asm("nop")     //延时两个时钟周期#define  N

3、OP_3      NOP_2;  asm("nop")     //延时三个时钟周期#define  NOP_4     NOP_3;  asm("nop")     //延时四个时钟周期……#define NOP_40  NOP_40; asm("nop")         //延时40个时钟周期然后利用“##”操作符,实现带参数宏的延时:#define  NOP(N)   NOP_##N                  //延时N个时钟周期操作符的作用是把两个部分的内容连成一个内容。就是说,

4、NOP(3)展开后成为NOP_3,NOP(4)展开后成为NOP_4,等等。因此,定义上述宏之后,就可通过调用NOP(N)语句实现精确软件延时。例如:NOP(4);  //延时4个时钟周期上述语句展开过程如下:NOP_3 ;  asm("nop");NOP_2;  asm("nop");  asm("nop");NOP_1;   asm("nop");  asm("nop");  asm("nop");asm("nop");  asm("nop");  asm("nop");  asm("nop");

5、正好延时4个时钟周期!不过,上面的宏还不够完善,如果试图使用下面的语句,程序将会出现漏洞:if(表达式)  NOP(3);else  NOP(4);这是因为NOP(N)宏展开之后,不是一个语句,而是变成N个语句。故必须用花括号括起来,程序才能运行正确。即应该改为:if(表达式){  NOP(3);}else{  NOP(4);}如果把NOP(N)宏的定义改为:#define NOP(N)     do{  NOP_##N;  }while(0)则NOP(N)宏展开之后只形成一个语句,将不会出现上面的

6、问题。但是要注意,“##”操作符只能按照原样把两边的内容连在一起。故NOP(N)的参数必须是具体的常量,即只能是数字,并且,与该数字相对应的宏NOP_N已必须已经定义。例如:“NOP(3+4);”语句展开之后,将将变成“NOP_3+4;”,出现语法错误;又如:“NOP(a);”语句展开之后,将将变成“NOP_a;”,而“NOP_a;”未定义。只有这样的语句才是正确的调用:NOP(20);      //延时20个时钟周期将上述方案整理成一个头文件,以后就可以任意调用了。下面是整理好的头文件:注意:该

7、文件不宜作长时间的延时。长时间的延时将会调用大量的“空操作”指令,占用大量的程序指令空间。这个问题将在V2.0版本中解决。NOP.H/*********************************************************************     单   位:广西民族大学物理与电子工程学院     文件名称:NOP.H     文件标识:_NOP_H_     摘   要:精密延时头文件,可以精确延时40以内(包括40)的时钟周期     当前版本:V1.0    

8、 作   者:白 羽         完成日期:2010年5月9日     特别声明:您可以任意转载、复制本文件,但不能随便剔除本文件说明*********************************************************************/ #ifndef _NOP_H_#define _NOP_H_ #define NOP(N)   do{NOP_##N();}while(0) #define NOP_0()#define NO

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。