C语言里如何编写精确的微量延时.docxVIP

  • 1
  • 0
  • 约1.43千字
  • 约 4页
  • 2022-03-01 发布于浙江
  • 举报
PAGE PAGE 1 C语言里如何编写精确的微量延时 说明:以下皆为ICC A(VR)平台下的争论,对AVR系列全部型号的(单片机)皆有效。至于其他平台,可据此方案自行修改和移值。 该方案的实现方法其实很简洁: 首先定义N个宏,分别调用 1 ~ N 个汇编“空操作”指令,如: #define NOP_1 asm(“nop”) //延时一个(时钟)周期 #define NOP_2 NOP_1; asm(“nop”) //延时两个时钟周期 #define NOP_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个时钟周期 操作符的作用是把两个部分的内容连成一个内容。就是说,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”); 正好延时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)宏绽开之后只形成一个语句,将不会消失上面的问题。 但是要留意,“##”操作符只能根据原样把两边的内容连在一起。故NOP(N)的参数必需是详细的常量,即只能是数字,并且,与该数字相对应的宏NOP_N已必需已经定义。 例如: “NOP(3+4);”语句绽开之后,将将变成“NOP_3+4;”,消失语法错误; 又如: “NOP(a);”语句绽开之后,将将变成“NOP_a;”,而“NOP_a;”未定义。 只有这样的语句才是正确的调用: NOP(20); //延时20个时钟周期 将上述方案整理成一个头文件,以后就可以任意调用了。下面是整理好的头文件: 留意:该文件不宜作长时间的延时。长时间的延时将会调用大量的“空操作”指令,占用大量的程序指令空间。这个问题将在V2.0版本中解决。

文档评论(0)

1亿VIP精品文档

相关文档