众所周知,相比于其他编程语言,C语言在编写嵌入式编程中有着绝对的优势。但它总也有缺点的:它的时序性比较差,不容易编写精准的延时。而在编写嵌入系统驱动程序时,常常需要比较精确的软件延时,这使得C语言的“劣势”暴露了出来,一般都只能通过嵌入汇编的方式实现。例如,在1MHZ工作频率下需要延时10us,就需要嵌入10句“空操作”指令,显然在书写上比较难堪。本文提出一种简化书写的延时方案,使用带参数的宏构来造微小时间片,可以实现完全精确的软件延时,大大方便了驱动程序及软件模拟通信协议的编写。
说明:以下皆为ICC AVR平台下的讨论,对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个时钟周期
|