当前位置:首页 > > 嵌入式案例Show
[导读]今天主要分享嵌入式系统中常用的延时函数。

1、前言


延时函数是嵌入式软件开发中必不可少的功能函数,在每个工程里都能找到它的踪影。虽然看起来不起眼,但在有些时序控制的场合,使用了一点点delay,往往能解决大问题。下面描述一下delay函数的几种实现。


2、中断延时实现


 U16 TimingDelay = 0;void delay_Init(void){ SysTick_Config(SystemFrequency / 1000); //1ms} void delay_DelayMs ( U16 x //延时的毫秒数 ){ TimingDelay = x; while(TimingDelay != 0);  }void SysTick_Handler(void){ if (TimingDelay > 0) { TimingDelay --; }}

较为常用,借助系统滴答时钟中断,来实现较为精准的延时,延时精度可以通过设定中断周期来控制。但是也因为使用了中断,如出现中断方面的异常,容易造成while循环死循环,程序崩溃。就更不能在中断函数里使用。


3、while循环++的方法


#define COMPUTE_TIMES_1MS 10120void delay_DelayMs( U16 x //延时的毫秒数){ u32 n; n = x*COMPUTE_TIMES_1MS; while(n > 0) { n --; }}

此方法比较灵活,用于不需要很精确延时的场合。我们可以使用一个GPIO输出电平再用示波器测量的方式尽量准确的获得COMPUTE_TIMES_1MS的数值。

Gpio_low();delay_DelayMs(100);Gpio_high();delay_DelayMs(100);Gpio_low();

同样如果需要做非常小的延时,可以做需要次数的cpu指令次数。

void delay_DelayCpuTimes( U16 x){  u32 i; for (i=0;i { }}


4、使用nop()语句


void DelayUS(u32 time){ while(time--) { __NOP();__NOP();__NOP(); __NOP();__NOP();__NOP(); }}

一个__nop空指令的时间就是执行一条指令的时间,主频不一样,一次__nop的时间也不一样,可以使用理论计算的算出1us能执行多少次nop,也可以使用示波器测试的方法来测量。


5、操作系统的sleep函数

void TSK_SleepMs(uint32_t ms){ vTaskDelay((configTICK_RATE_HZ * ms) / 1000);}

在带操作系统的程序中(如freerots,ucos等),系统提供了专用的线程sleep函数,用作延时。注意sleep不要用在中断函数中。

/ The End /


免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭