嵌入式开发之微秒级延迟的实现【原创】
★本文为原创文章,如需转载,请务必注明出处。★
嵌入式系统的开发中,经常遇到要延迟一定时间再进行后续处理。特别是对硬件的读写操作,经常是要精确到微秒级的延迟。使用嵌入式操作系统时,通常API只精确到毫秒级。对于那些没有使用嵌入式操作系统的,更无API调用可言。
本文就讨论从实际工程项目经验中总结出来的微秒级延迟的实现方法,仅供借鉴。
一、关于CPU的System Clock
主频:就是CPU正常工作时的时钟频率,从理论上讲CPU的主频越高,它的速度也就越快,因为频率越高,单位时钟周期内完成的指令就越多,从而速度也就越快。一般对应CPU DataSheet中的System Clock。比如:瑞萨SH7145的System Clock=50MHz。其含义就是1秒钟CPU能够处理50M条汇编指令。
二、关于汇编列表文件
对编译器进行相关设置后,C语言程序编译后可以产生汇编列表文件。汇编列表文件的内容就是C源代码及其编译后对应的汇编指令。以瑞萨SH7145的C语言编译器XASS-V为例,编译后的列表文件是*.lis,内容片段如下。
从上面的lis文件可以很容易看出一行C语言代码编译后对应几条汇编指令。
三、关于200微秒延迟的实现
实际工程中,有一个需求是对硬件某个寄存器写入数据后,要在200微秒内去检查该寄存器的状态。那么,200微秒内是如何实现的呢?
且看如下最后实现的代码:
显然,for循环的次数决定了时间。那么,为什么是循环1000次呢?这就要用到了刚才提到的lis文件了。首先,要了解一次for循环会执行多少条汇编指令。然后,得出执行一次for循环需要多少时间。最后,再根据200微秒计算出循环次数。
瑞萨SH7145的DataSheet上有这么一段话“The SH7144 series CPU hasa RISC-type instruction set. Most instructions can be executed in one
state (one system clock cycle), which greatly improvesinstruction execution speed.”。可见,执行一条汇编指令需要一个CPU System Clock Cycle。
而上面for循环的C语言代码,编译后的lis文件如下。
即1次for循环需要执行10条汇编指令,占用10个CPU System Clock Cycle。
瑞萨SH7145的System Clock=50MHz,即1秒钟处理50M条汇编指令。
执行1条汇编指令所需时间:10^6/(50*10^6)=0.02微秒/指令。
因此,200微秒需要200/(0.02*10)=1000次for循环。
需要注意的是,上面只是提供一种思路。不同的CPU其系统时钟不同,执行每条指令所占用的时间也不一样,而且不同编译器编译后的list文件也不太相同,所以需要具体问题具体分析,找出最合适的办法。